added testing

This commit is contained in:
2026-01-14 13:29:40 +03:00
parent e8618b7c98
commit aa38999ff4
6 changed files with 1269 additions and 2 deletions
+9 -2
View File
@@ -11,7 +11,10 @@
"lint:fix": "eslint . --ext .ts --fix",
"prettier": "prettier --check .",
"prettier:fix": "prettier --write .",
"seed": "tsc && node dist/scripts/seed.js"
"seed": "tsc && node dist/scripts/seed.js",
"test": "vitest",
"test:unit": "vitest run src/tests/unit",
"test:integration": "vitest run src/tests/integration"
},
"keywords": [],
"author": "",
@@ -40,15 +43,19 @@
"@types/jsonwebtoken": "^9.0.10",
"@types/morgan": "^1.9.10",
"@types/node": "^25.0.6",
"@types/supertest": "^6.0.3",
"@types/swagger-jsdoc": "^6.0.4",
"@types/swagger-ui-express": "^4.1.8",
"@vitest/coverage-v8": "^4.0.17",
"eslint": "^9.39.2",
"globals": "^17.0.0",
"jsonwebtoken": "^9.0.3",
"nodemon": "^3.1.11",
"prettier": "^3.7.4",
"supertest": "^7.2.2",
"ts-node": "^10.9.2",
"typescript": "^5.9.3",
"typescript-eslint": "^8.52.0"
"typescript-eslint": "^8.52.0",
"vitest": "^4.0.17"
}
}
+1156
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -1,3 +1,4 @@
onlyBuiltDependencies:
- '@scarf/scarf'
- bcrypt
- esbuild
+18
View File
@@ -0,0 +1,18 @@
import request from "supertest";
import { describe, expect, it } from "vitest";
describe("GET /health", () => {
it("returns 200 OK", async () => {
// Minimal env required by app config during import
process.env.MONGO_URI = process.env.MONGO_URI ?? "mongodb://localhost:27017/test";
process.env.JWT_SECRET = process.env.JWT_SECRET ?? "test-secret";
const { default: app } = await import("../../app.js");
const res = await request(app).get("/health");
expect(res.status).toBe(200);
expect(res.body).toEqual({ status: "OK" });
}, 20000);
});
+71
View File
@@ -0,0 +1,71 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
import { OrderService } from "../../services/order.service.js";
import { OrderRepository } from "../../repositories/order.repo.js";
import { ProductRepository } from "../../repositories/product.repo.js";
vi.mock("mongoose", async (importOriginal) => {
const actual = (await importOriginal()) as typeof import("mongoose");
const startSession = vi.fn().mockResolvedValue({
startTransaction: vi.fn(),
commitTransaction: vi.fn(),
abortTransaction: vi.fn(),
endSession: vi.fn(),
});
return {
...actual,
default: {
...(actual as any).default,
startSession,
},
startSession,
};
});
vi.mock("../../repositories/order.repo.js");
vi.mock("../../repositories/product.repo.js");
describe("OrderService", () => {
const mockedOrderRepo = vi.mocked(OrderRepository);
const mockedProductRepo = vi.mocked(ProductRepository);
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.restoreAllMocks();
});
describe("listOrders", () => {
it("lists all orders for admin role", async () => {
const orders = [{ id: "1" }];
mockedOrderRepo.findAll.mockResolvedValueOnce(orders as never);
const result = await OrderService.listOrders("user-id", "admin");
expect(mockedOrderRepo.findAll).toHaveBeenCalledOnce();
expect(result).toEqual(orders);
});
it("lists user orders for non-admin role", async () => {
const orders = [{ id: "2" }];
mockedOrderRepo.findByUser.mockResolvedValueOnce(orders as never);
const result = await OrderService.listOrders("user-123", "customer");
expect(mockedOrderRepo.findByUser).toHaveBeenCalledWith("user-123");
expect(result).toEqual(orders);
});
});
describe("payOrder", () => {
it("throws 400 for invalid id", async () => {
await expect(OrderService.payOrder(undefined)).rejects.toMatchObject({
statusCode: 400,
});
});
});
});
+14
View File
@@ -0,0 +1,14 @@
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
environment: "node",
globals: true,
include: ["src/tests/**/*.test.ts"],
coverage: {
provider: "v8",
reporter: ["text", "html"],
reportsDirectory: "./coverage",
},
},
});