diff --git a/__test__/cart-item.test.js b/__test__/cart-item.test.js index 05d63f0..5bbeb9c 100644 --- a/__test__/cart-item.test.js +++ b/__test__/cart-item.test.js @@ -1,17 +1,6 @@ import supertest from "supertest"; import { web } from "../src/app/web"; import { createTestUser, removeTestUser, token } from "./test-util"; -import { logger } from "../src/app/logging"; - -jest.setTimeout(60000); - -beforeAll(async () => { - logger.silent = true; -}); - -afterAll(async () => { - logger.silent = false; -}); describe("GET /api/users/current/carts/items/:productSlug", function () { beforeEach(async () => { diff --git a/__test__/cart.test.js b/__test__/cart.test.js index 031c504..f05ca1c 100644 --- a/__test__/cart.test.js +++ b/__test__/cart.test.js @@ -1,19 +1,8 @@ import supertest from "supertest"; import { web } from "../src/app/web"; import { createTestUser, removeTestUser, token } from "./test-util"; -import { logger } from "../src/app/logging"; import { calculateTotalPrice } from "../src/utils"; -jest.setTimeout(60000); - -beforeAll(() => { - logger.silent = true; -}); - -afterAll(() => { - logger.silent = false; -}); - describe("GET /api/users/current/carts", function () { beforeEach(async () => { await createTestUser(); diff --git a/__test__/category.test.js b/__test__/category.test.js index d389187..2d216db 100644 --- a/__test__/category.test.js +++ b/__test__/category.test.js @@ -1,17 +1,6 @@ import supertest from "supertest"; import { web } from "../src/app/web"; import { createTestCategory, removeTestCategory } from "./test-util"; -import { logger } from "../src/app/logging"; - -jest.setTimeout(60000); - -beforeAll(() => { - logger.silent = true; -}); - -afterAll(() => { - logger.silent = false; -}); describe("GET /api/categories", function () { beforeEach(async () => { diff --git a/__test__/like-product.test.js b/__test__/like-product.test.js index cf77ae2..23e9ba3 100644 --- a/__test__/like-product.test.js +++ b/__test__/like-product.test.js @@ -1,20 +1,13 @@ import supertest from "supertest"; import { web } from "../src/app/web"; import { createTestUser, removeTestUser, token } from "./test-util"; -import { logger } from "../src/app/logging"; - -jest.setTimeout(60000); beforeAll(async () => { - logger.silent = true; - await createTestUser(); }); afterAll(async () => { await removeTestUser(); - - logger.silent = false; }); describe("POST /api/products/:productSlug/like", function () { diff --git a/__test__/order.test.js b/__test__/order.test.js index b267a3f..895ad8f 100644 --- a/__test__/order.test.js +++ b/__test__/order.test.js @@ -1,18 +1,6 @@ -import supertest from "supertest"; import { createTestUser, removeManyCartItems, removeTestUser, token, username } from "./test-util"; -import { web } from "../src/app/web"; -import { logger } from "../src/app/logging"; import { calculateTotalPrice } from "../src/utils"; - -jest.setTimeout(60000); - -beforeAll(async () => { - logger.silent = true; -}); - -afterAll(async () => { - logger.silent = false; -}); +import { request } from "./setup"; describe("POST /api/orders", function () { beforeEach(async () => { @@ -24,8 +12,8 @@ describe("POST /api/orders", function () { }); it("should can create new order", async () => { - const cart = await supertest(web).get("/api/users/current/carts").set("Authorization", token); - const result = await supertest(web).post("/api/orders").set("Authorization", token); + const cart = await request.get("/api/users/current/carts").set("Authorization", token); + const result = await request.post("/api/orders").set("Authorization", token); expect(result.status).toBe(200); expect(result.body.data.username).toBe(username); @@ -35,7 +23,7 @@ describe("POST /api/orders", function () { }); it("should reject if token is invalid", async () => { - const result = await supertest(web).post("/api/orders").set("Authorization", "invalid-token"); + const result = await request.post("/api/orders").set("Authorization", "invalid-token"); expect(result.status).toBe(401); expect(result.body.errors).toBeDefined(); @@ -45,7 +33,7 @@ describe("POST /api/orders", function () { it("should reject if item is empty", async () => { await removeManyCartItems(); - const result = await supertest(web).post("/api/orders").set("Authorization", token); + const result = await request.post("/api/orders").set("Authorization", token); expect(result.status).toBe(400); expect(result.body.errors).toBeDefined(); @@ -63,8 +51,8 @@ describe("POST /api/orders/checkout", function () { }); it("should can checkout order", async () => { - const order = await supertest(web).post("/api/orders").set("Authorization", token); - const result = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", token); + const order = await request.post("/api/orders").set("Authorization", token); + const result = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", token); expect(result.status).toBe(200); expect(result.body.data).toBeDefined(); @@ -72,8 +60,8 @@ describe("POST /api/orders/checkout", function () { }); it("should reject if token is invalid", async () => { - const order = await supertest(web).post("/api/orders").set("Authorization", token); - const result = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", "invalid-token"); + const order = await request.post("/api/orders").set("Authorization", token); + const result = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", "invalid-token"); expect(result.status).toBe(401); expect(result.body.data).toBeUndefined(); @@ -81,9 +69,9 @@ describe("POST /api/orders/checkout", function () { }); it("should return old session if not expired", async () => { - const order = await supertest(web).post("/api/orders").set("Authorization", token); - const oldSession = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", token); - const result = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", token); + const order = await request.post("/api/orders").set("Authorization", token); + const oldSession = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", token); + const result = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", token); expect(result.status).toBe(200); expect(result.body.data.sessionId).toBe(oldSession.body.data.sessionId); @@ -91,3 +79,21 @@ describe("POST /api/orders/checkout", function () { expect(result.body.data.createdAt).toBe(oldSession.body.data.createdAt); }); }); + +describe("GET /api/orders/:orderId", function () { + beforeEach(async () => { + await createTestUser(); + }); + + afterEach(async () => { + await removeTestUser(); + }); + + it("should can get order", async () => { + const order = await request.post("/api/orders").set("Authorization", token); + const result = await request.get(`/api/orders/${order.body.data.id}`).set("Authorization", token); + + expect(result.status).toBe(200); + expect(result.body.data.id).toBe(order.body.data.id); + }); +}); diff --git a/__test__/product.test.js b/__test__/product.test.js index d14716f..d2ad884 100644 --- a/__test__/product.test.js +++ b/__test__/product.test.js @@ -11,17 +11,6 @@ import { removeTestProduct, removeTestUser, } from "./test-util"; -import { logger } from "../src/app/logging"; - -jest.setTimeout(60000); - -beforeAll(() => { - logger.silent = true; -}); - -afterAll(() => { - logger.silent = false; -}); describe("GET /api/products/:slug", function () { beforeEach(async () => { diff --git a/__test__/review.test.js b/__test__/review.test.js index 0f2d055..288a358 100644 --- a/__test__/review.test.js +++ b/__test__/review.test.js @@ -1,20 +1,13 @@ import supertest from "supertest"; import { web } from "../src/app/web"; import { createTestUser, name, phonenumberForm, removeTestReview, removeTestUser, token, username } from "./test-util"; -import { logger } from "../src/app/logging"; - -jest.setTimeout(60000); beforeAll(async () => { - logger.silent = true; - await createTestUser(); }); afterAll(async () => { await removeTestUser(); - - logger.silent = false; }); describe("POST /api/products/reviews", function () { diff --git a/__test__/setup.js b/__test__/setup.js new file mode 100644 index 0000000..ef65727 --- /dev/null +++ b/__test__/setup.js @@ -0,0 +1,13 @@ +import supertest from "supertest"; +import { logger } from "../src/app/logging.js"; +import { web } from "../src/app/web.js"; + +beforeAll(async () => { + logger.silent = true; +}); + +afterAll(async () => { + logger.silent = false; +}); + +export const request = supertest(web); diff --git a/__test__/tag.test.js b/__test__/tag.test.js index 1049574..0ab3a41 100644 --- a/__test__/tag.test.js +++ b/__test__/tag.test.js @@ -1,20 +1,13 @@ import supertest from "supertest"; import { web } from "../src/app/web"; import { createTestUser, removeTestUser } from "./test-util"; -import { logger } from "../src/app/logging"; - -jest.setTimeout(60000); beforeAll(async () => { - logger.silent = true; - await createTestUser(); }); afterAll(async () => { await removeTestUser(); - - logger.silent = false; }); describe("/api/tags", function () { diff --git a/__test__/user.test.js b/__test__/user.test.js index f94ea43..5a390b3 100644 --- a/__test__/user.test.js +++ b/__test__/user.test.js @@ -2,17 +2,6 @@ import bcrypt from "bcrypt"; import supertest from "supertest"; import { web } from "../src/app/web.js"; import { name, password, phonenumberForm, username, createTestUser, removeTestUser, token, getTestUser } from "./test-util.js"; -import { logger } from "../src/app/logging.js"; - -jest.setTimeout(60000); - -beforeAll(() => { - logger.silent = true; -}); - -afterAll(() => { - logger.silent = false; -}); describe("POST /api/users", function () { afterEach(async () => { diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..44f1c38 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,10 @@ +const config = { + setupFilesAfterEnv: ["./__test__/setup.js"], + verbose: true, + testTimeout: 60000, + transform: { + "^.+\\.[t|j]sx?$": "babel-jest", + }, +}; + +export default config; diff --git a/package.json b/package.json index 1e975d5..fd4d92a 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,6 @@ "test": "jest -i", "postinstall": "prisma generate" }, - "jest": { - "transform": { - "^.+\\.[t|j]sx?$": "babel-jest" - } - }, "prisma": { "seed": "node prisma/seed.js" }, diff --git a/src/controllers/order-controller.js b/src/controllers/order-controller.js index b6cb292..4db16c6 100644 --- a/src/controllers/order-controller.js +++ b/src/controllers/order-controller.js @@ -28,4 +28,16 @@ const checkout = async (req, res, next) => { } }; -export default { create, checkout }; +const get = async (req, res, next) => { + try { + const orderId = req.params.orderId; + + const result = await orderService.get(orderId); + + res.status(200).set("Cache-Control", "public, max-age=0, s-maxage=1, stale-while-revalidate=30").send({ data: result }); + } catch (error) { + next(error); + } +}; + +export default { create, checkout, get }; diff --git a/src/routes/api.js b/src/routes/api.js index 28c4883..74bd3f6 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -28,6 +28,7 @@ userRouter.post("/api/products/:productSlug/like", likeProductController.like); userRouter.delete("/api/products/:productSlug/like", likeProductController.neutral); userRouter.post("/api/orders", orderController.create); +userRouter.get("/api/orders/:orderId", orderController.get); userRouter.post("/api/orders/checkout", orderController.checkout); export { userRouter }; diff --git a/src/services/order-service.js b/src/services/order-service.js index 75f4065..0d42264 100644 --- a/src/services/order-service.js +++ b/src/services/order-service.js @@ -1,5 +1,5 @@ import validate from "../validation/validation.js"; -import { checkoutValidation, createOrderValidation } from "../validation/order-validation.js"; +import { checkoutValidation, createOrderValidation, getOrderValidation } from "../validation/order-validation.js"; import { prismaClient } from "../app/database.js"; import { ResponseError } from "../errors/response-error.js"; import { stripe } from "../plugin/stripe.js"; @@ -125,4 +125,16 @@ const checkout = async (request) => { }); }; -export default { create, checkout }; +const get = async (orderId) => { + orderId = validate(getOrderValidation, orderId); + + const order = await prismaClient.order.findUnique({ where: { id: orderId } }); + + if (!order) { + throw new ResponseError(404, "Order not found"); + } + + return order; +}; + +export default { create, checkout, get }; diff --git a/src/validation/order-validation.js b/src/validation/order-validation.js index 2333fe7..76bb727 100644 --- a/src/validation/order-validation.js +++ b/src/validation/order-validation.js @@ -12,4 +12,8 @@ const checkoutValidation = z }) .strict(); -export { createOrderValidation, checkoutValidation }; +const getOrderValidation = z.coerce + .number({ invalid_type_error: "Order id must be number!", required_error: "Order id is required!" }) + .positive({ message: "Order id must be positive number!" }); + +export { createOrderValidation, checkoutValidation, getOrderValidation };