test: add comprehensive unit tests for core services

Added unit tests for the `api-keys`, `auth`, `categories`, `contents`, `favorites`, `media`, and `purge` services to improve test coverage and ensure core functionality integrity.
This commit is contained in:
Mathis HERRIOT
2026-01-08 16:22:23 +01:00
parent cc2823db7d
commit 399bdab86c
13 changed files with 1502 additions and 0 deletions

View File

@@ -0,0 +1,122 @@
import { Test, TestingModule } from "@nestjs/testing";
import { DatabaseService } from "../database/database.service";
import { categories } from "../database/schemas";
import { CategoriesService } from "./categories.service";
import { CreateCategoryDto } from "./dto/create-category.dto";
import { UpdateCategoryDto } from "./dto/update-category.dto";
describe("CategoriesService", () => {
let service: CategoriesService;
const mockDb = {
select: jest.fn().mockReturnThis(),
from: jest.fn().mockReturnThis(),
where: jest.fn().mockReturnThis(),
limit: jest.fn().mockResolvedValue([]),
orderBy: jest.fn().mockResolvedValue([]),
insert: jest.fn().mockReturnThis(),
values: jest.fn().mockReturnThis(),
update: jest.fn().mockReturnThis(),
set: jest.fn().mockReturnThis(),
delete: jest.fn().mockReturnThis(),
returning: jest.fn().mockResolvedValue([]),
};
beforeEach(async () => {
jest.clearAllMocks();
const module: TestingModule = await Test.createTestingModule({
providers: [
CategoriesService,
{
provide: DatabaseService,
useValue: {
db: mockDb,
},
},
],
}).compile();
service = module.get<CategoriesService>(CategoriesService);
});
it("should be defined", () => {
expect(service).toBeDefined();
});
describe("findAll", () => {
it("should return all categories ordered by name", async () => {
const mockCategories = [{ name: "A" }, { name: "B" }];
mockDb.orderBy.mockResolvedValue(mockCategories);
const result = await service.findAll();
expect(result).toEqual(mockCategories);
expect(mockDb.select).toHaveBeenCalled();
expect(mockDb.from).toHaveBeenCalledWith(categories);
});
});
describe("findOne", () => {
it("should return a category by id", async () => {
const mockCategory = { id: "1", name: "Cat" };
mockDb.limit.mockResolvedValue([mockCategory]);
const result = await service.findOne("1");
expect(result).toEqual(mockCategory);
});
it("should return null if category not found", async () => {
mockDb.limit.mockResolvedValue([]);
const result = await service.findOne("999");
expect(result).toBeNull();
});
});
describe("create", () => {
it("should create a category and generate slug", async () => {
const dto: CreateCategoryDto = { name: "Test Category" };
mockDb.returning.mockResolvedValue([{ ...dto, slug: "test-category" }]);
const result = await service.create(dto);
expect(mockDb.insert).toHaveBeenCalledWith(categories);
expect(mockDb.values).toHaveBeenCalledWith({
name: "Test Category",
slug: "test-category",
});
expect(result[0].slug).toBe("test-category");
});
});
describe("update", () => {
it("should update a category and regenerate slug", async () => {
const id = "1";
const dto: UpdateCategoryDto = { name: "New Name" };
mockDb.returning.mockResolvedValue([{ id, ...dto, slug: "new-name" }]);
const result = await service.update(id, dto);
expect(mockDb.update).toHaveBeenCalledWith(categories);
expect(mockDb.set).toHaveBeenCalledWith(
expect.objectContaining({
name: "New Name",
slug: "new-name",
}),
);
expect(result[0].slug).toBe("new-name");
});
});
describe("remove", () => {
it("should remove a category", async () => {
const id = "1";
mockDb.returning.mockResolvedValue([{ id }]);
const result = await service.remove(id);
expect(mockDb.delete).toHaveBeenCalledWith(categories);
expect(result).toEqual([{ id }]);
});
});
});