Creates test request helper for API endpoints

Separates common utils into the medusa-core-utils package.
Sets up a testing environment where mocked models/services/etc. can be placed in
__mocks__ folder within its corresponding directory. The mocks will
automatically be registered in a awilix container only used for testing.
This commit is contained in:
Sebastian Rindom
2020-01-21 15:13:47 +01:00
parent 3d494bc652
commit ed472e9fba
33 changed files with 14053 additions and 76 deletions
+116
View File
@@ -0,0 +1,116 @@
import { createContainer } from "awilix"
import express from "express"
import supertest from "supertest"
import jwt from "jsonwebtoken"
import sessions from "client-sessions"
import cookie from "cookie"
import servicesLoader from "../loaders/services"
import expressLoader from "../loaders/express"
import apiLoader from "../loaders/api"
import passportLoader from "../loaders/passport"
import config from "../config"
const testApp = express()
const container = createContainer()
servicesLoader({ container })
expressLoader({ app: testApp })
passportLoader({ app: testApp, container })
// Add the registered services to the request scope
testApp.use((req, res, next) => {
req.scope = container.createScope()
next()
})
apiLoader({ app: testApp })
const supertestRequest = supertest(testApp)
let adminSessionOpts = {
cookieName: "adminSession",
secret: "test",
}
export { adminSessionOpts }
let clientSessionOpts = {
cookieName: "clientSession",
secret: "test",
}
export { clientSessionOpts }
export async function request(method, url, opts = {}) {
let { payload, headers } = opts
headers = headers || {}
headers.Cookie = headers.Cookie || ""
if (opts.adminSession) {
if (opts.adminSession.jwt) {
opts.adminSession.jwt = jwt.sign(
opts.adminSession.jwt,
config.jwtSecret,
{
expiresIn: "30m",
}
)
}
headers.Cookie +=
adminSessionOpts.cookieName +
"=" +
sessions.util.encode(adminSessionOpts, opts.adminSession) +
"; "
// console.log(sessions.util.decode(adminSessionOpts, opts.headers.Cookie))
}
if (opts.clientSession) {
headers.Cookie +=
clientSessionOpts.cookieName +
"=" +
sessions.util.encode(clientSessionOpts, opts.clientSession) +
"; "
// console.log(sessions.util.decode(adminSessionOpts, opts.headers.Cookie))
}
let req = supertestRequest[method.toLowerCase()](url)
for (let name in headers) {
req.set(name, headers[name])
}
if (payload && !req.get("content-type")) {
req.set("Content-Type", "application/json")
}
if (!req.get("accept")) {
req.set("Accept", "application/json")
}
req.set("Host", "localhost")
let res
try {
res = await req.send(JSON.stringify(payload))
} catch (e) {
if (e.response) {
res = e.response
} else {
throw e
}
}
//let c =
// res.headers["set-cookie"] && cookie.parse(res.headers["set-cookie"][0])
//res.adminSession =
// c &&
// c[adminSessionOpts.cookieName] &&
// sessions.util.decode(adminSessionOpts, c[adminSessionOpts.cookieName])
// .content
//res.clientSession =
// c &&
// c[clientSessionOpts.cookieName] &&
// sessions.util.decode(clientSessionOpts, c[clientSessionOpts.cookieName])
// .content
return res
}