Add core
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user