- Create comprehensive test suite for PrismaService (10 tests) - Fix AppController tests with proper PrismaService mocking - Wrap seed operations in transaction for atomicity - Replace N+1 pattern with batch operations (createMany) - Add concurrency warning to seed script - All tests passing (14/14) - Build successful - Test coverage >85% Fixes #3 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
131 lines
3.4 KiB
TypeScript
131 lines
3.4 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
import { Test, TestingModule } from "@nestjs/testing";
|
|
import { PrismaService } from "./prisma.service";
|
|
|
|
describe("PrismaService", () => {
|
|
let service: PrismaService;
|
|
|
|
beforeEach(async () => {
|
|
const module: TestingModule = await Test.createTestingModule({
|
|
providers: [PrismaService],
|
|
}).compile();
|
|
|
|
service = module.get<PrismaService>(PrismaService);
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await service.$disconnect();
|
|
});
|
|
|
|
it("should be defined", () => {
|
|
expect(service).toBeDefined();
|
|
});
|
|
|
|
describe("onModuleInit", () => {
|
|
it("should connect to the database", async () => {
|
|
const connectSpy = vi
|
|
.spyOn(service, "$connect")
|
|
.mockResolvedValue(undefined);
|
|
|
|
await service.onModuleInit();
|
|
|
|
expect(connectSpy).toHaveBeenCalled();
|
|
});
|
|
|
|
it("should throw error if connection fails", async () => {
|
|
const error = new Error("Connection failed");
|
|
vi.spyOn(service, "$connect").mockRejectedValue(error);
|
|
|
|
await expect(service.onModuleInit()).rejects.toThrow(error);
|
|
});
|
|
});
|
|
|
|
describe("onModuleDestroy", () => {
|
|
it("should disconnect from the database", async () => {
|
|
const disconnectSpy = vi
|
|
.spyOn(service, "$disconnect")
|
|
.mockResolvedValue(undefined);
|
|
|
|
await service.onModuleDestroy();
|
|
|
|
expect(disconnectSpy).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe("isHealthy", () => {
|
|
it("should return true when database is accessible", async () => {
|
|
vi.spyOn(service, "$queryRaw").mockResolvedValue([{ result: 1 }]);
|
|
|
|
const result = await service.isHealthy();
|
|
|
|
expect(result).toBe(true);
|
|
});
|
|
|
|
it("should return false when database is not accessible", async () => {
|
|
vi
|
|
.spyOn(service, "$queryRaw")
|
|
.mockRejectedValue(new Error("Database error"));
|
|
|
|
const result = await service.isHealthy();
|
|
|
|
expect(result).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("getConnectionInfo", () => {
|
|
it("should return connection info when connected", async () => {
|
|
const mockResult = [
|
|
{
|
|
current_database: "test_db",
|
|
version: "PostgreSQL 17.0 on x86_64-linux",
|
|
},
|
|
];
|
|
vi.spyOn(service, "$queryRaw").mockResolvedValue(mockResult);
|
|
|
|
const result = await service.getConnectionInfo();
|
|
|
|
expect(result).toEqual({
|
|
connected: true,
|
|
database: "test_db",
|
|
version: "PostgreSQL",
|
|
});
|
|
});
|
|
|
|
it("should return connected false when result is empty", async () => {
|
|
vi.spyOn(service, "$queryRaw").mockResolvedValue([]);
|
|
|
|
const result = await service.getConnectionInfo();
|
|
|
|
expect(result).toEqual({ connected: false });
|
|
});
|
|
|
|
it("should return connected false when query fails", async () => {
|
|
vi
|
|
.spyOn(service, "$queryRaw")
|
|
.mockRejectedValue(new Error("Query failed"));
|
|
|
|
const result = await service.getConnectionInfo();
|
|
|
|
expect(result).toEqual({ connected: false });
|
|
});
|
|
|
|
it("should handle version without split", async () => {
|
|
const mockResult = [
|
|
{
|
|
current_database: "test_db",
|
|
version: "PostgreSQL",
|
|
},
|
|
];
|
|
vi.spyOn(service, "$queryRaw").mockResolvedValue(mockResult);
|
|
|
|
const result = await service.getConnectionInfo();
|
|
|
|
expect(result).toEqual({
|
|
connected: true,
|
|
database: "test_db",
|
|
version: "PostgreSQL",
|
|
});
|
|
});
|
|
});
|
|
});
|