This commit is contained in:
Sebastian Rindom
2020-01-18 15:08:22 +01:00
parent 2d8dd4b0a9
commit c7cf9b8061
58 changed files with 9873 additions and 2 deletions
+15
View File
@@ -0,0 +1,15 @@
import { Router } from "express"
import admin from "./routes/admin"
import store from "./routes/store"
import users from "./routes/users"
// guaranteed to get dependencies
export default () => {
const app = Router()
users(app)
admin(app)
store(app)
return app
}
@@ -0,0 +1,5 @@
import passport from "passport"
export default () => {
return passport.authenticate("jwt", { session: false })
}
@@ -0,0 +1 @@
export default fn => (...args) => fn(...args).catch(args[2])
@@ -0,0 +1,7 @@
import { default as authenticate } from "./authenticate"
import { default as wrap } from "./await-middleware"
export default {
authenticate,
wrap
}
@@ -0,0 +1,18 @@
import { Router } from "express"
import middlewares from "../../middlewares"
const route = Router()
export default app => {
app.use("/admin", route)
// Unauthenticated routes
// route.use("/auth", require("./auth").default)
// Authenticated routes
route.use(middlewares.authenticate())
route.use("/products", require("./products").default)
route.use("/product-variants", require("./product-variants").default)
return app
}
@@ -0,0 +1,8 @@
import { Router } from "express"
import middlewares from "../../../middlewares"
const route = Router()
export default app => {
return app
}
@@ -0,0 +1,8 @@
import { Router } from "express"
import middlewares from "../../../middlewares"
const route = Router()
export default app => {
return app
}
@@ -0,0 +1,13 @@
import { Router } from "express"
import productRoutes from './products'
import middlewares from "../../middlewares"
const route = Router()
export default app => {
app.use("/store", route)
productRoutes(route)
return app
}
@@ -0,0 +1,93 @@
import mongoose from "mongoose"
import getProduct from "../get-product"
describe("Get product by id", () => {
const testId = `${mongoose.Types.ObjectId("56cb91bdc3464f14678934ca")}`
const productServiceMock = {
getProduct: jest.fn().mockImplementation(id => {
if (id === testId) {
return Promise.resolve({ _id: id, title: "test" })
}
return Promise.resolve(undefined)
}),
}
const reqMock = id => {
return {
params: {
productId: id,
},
scope: {
resolve: jest.fn().mockImplementation(name => {
if (name === "productService") {
return productServiceMock
}
return undefined
}),
},
}
}
const resMock = {
sendStatus: jest.fn().mockReturnValue(),
json: jest.fn().mockReturnValue(),
}
describe("get product by id successfull", () => {
beforeAll(async () => {
await getProduct(reqMock(testId), resMock)
})
afterAll(() => {
jest.clearAllMocks()
})
it("calls get product from productSerice", () => {
expect(productServiceMock.getProduct).toHaveBeenCalledTimes(1)
expect(productServiceMock.getProduct).toHaveBeenCalledWith(testId)
})
it("calls res.json", () => {
expect(resMock.json).toHaveBeenCalledTimes(1)
expect(resMock.json).toHaveBeenCalledWith({
_id: testId,
title: "test",
})
})
})
describe("returns 404 when product not found", () => {
beforeAll(async () => {
const id = mongoose.Types.ObjectId()
await getProduct(reqMock(`${id}`), resMock)
})
afterAll(() => {
jest.clearAllMocks()
})
it("return 404", () => {
expect(resMock.sendStatus).toHaveBeenCalledTimes(1)
expect(resMock.json).toHaveBeenCalledTimes(0)
expect(resMock.sendStatus).toHaveBeenCalledWith(404)
})
})
describe("fails when validation fails", () => {
let res
beforeAll(async () => {
try {
await getProduct(reqMock(`not object id`), resMock)
} catch (err) {
res = err
}
})
afterAll(() => {
jest.clearAllMocks()
})
it("return 404", () => {
expect(res.name).toEqual("ValidationError")
})
})
})
@@ -0,0 +1,22 @@
import validator from "../../../../utils/validator"
export default async (req, res) => {
const { productId } = req.params
const schema = validator.objectId()
const { value, error } = schema.validate(productId)
if (error) {
throw error
}
const productService = req.scope.resolve("productService")
const product = await productService.getProduct(value)
if (!product) {
res.sendStatus(404)
return
}
res.json(product)
}
@@ -0,0 +1,10 @@
import { Router } from "express"
import middlewares from "../../../middlewares"
const route = Router()
export default app => {
app.use("/products", route)
route.get("/:productId", middlewares.wrap(require("./get-product").default))
return app
}
@@ -0,0 +1,8 @@
import { Router } from "express"
import middlewares from "../../middlewares"
const route = Router()
export default app => {
return app
}