fix: code review — 7 issues resolved
(C1) Add dimensionScores/radarData/passed columns to AssessmentSession (C2) Mock DataSource in service.spec.ts + app.e2e-spec.ts (C3) Mock AuditLogService in controller.spec.ts (C4) Rewrite deleteSession tests for dataSource.transaction (I1) batchDeleteSessions uses transaction with certificate cleanup (I2) extractDimensionScores reads from session property (I3/I5) PDF generator supports multi-page + newline splitting (I4) findOne inside transaction uses deleteCondition
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { getRepositoryToken } from '@nestjs/typeorm';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { AssessmentService } from './assessment.service';
|
||||
import { AssessmentSession, AssessmentStatus } from './entities/assessment-session.entity';
|
||||
import { AssessmentQuestion } from './entities/assessment-question.entity';
|
||||
@@ -25,6 +26,7 @@ describe('AssessmentService', () => {
|
||||
let service: AssessmentService;
|
||||
let sessionRepository: any;
|
||||
let certificateRepository: any;
|
||||
let dataSource: any;
|
||||
|
||||
const mockRepository = () => ({
|
||||
delete: jest.fn(),
|
||||
@@ -39,6 +41,19 @@ describe('AssessmentService', () => {
|
||||
const regularUser = { id: 'user-1', role: 'user' };
|
||||
const adminUser = { id: 'admin-1', role: 'admin' };
|
||||
|
||||
const mockManager = (overrides?: any) => ({
|
||||
findOne: jest.fn(),
|
||||
delete: jest.fn().mockResolvedValue({ affected: 1 }),
|
||||
save: jest.fn(),
|
||||
...overrides,
|
||||
});
|
||||
|
||||
const mockDataSource = (manager?: any) => ({
|
||||
transaction: jest.fn(async (cb: any) => {
|
||||
return cb(manager || mockManager());
|
||||
}),
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
providers: [
|
||||
@@ -61,12 +76,14 @@ describe('AssessmentService', () => {
|
||||
{ provide: ChatService, useFactory: mockService },
|
||||
{ provide: I18nService, useFactory: mockService },
|
||||
{ provide: TenantService, useFactory: mockService },
|
||||
{ provide: DataSource, useFactory: () => mockDataSource(mockManager()) },
|
||||
],
|
||||
}).compile();
|
||||
|
||||
service = module.get<AssessmentService>(AssessmentService);
|
||||
sessionRepository = module.get(getRepositoryToken(AssessmentSession));
|
||||
certificateRepository = module.get(getRepositoryToken(AssessmentCertificate));
|
||||
dataSource = module.get(DataSource);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
@@ -75,19 +92,33 @@ describe('AssessmentService', () => {
|
||||
|
||||
describe('deleteSession', () => {
|
||||
it('should delete a session when non-admin user owns it', async () => {
|
||||
sessionRepository.delete.mockResolvedValue({ affected: 1 });
|
||||
const manager = mockManager({
|
||||
findOne: jest.fn().mockResolvedValue({ id: 'session-id', userId: 'user-1' }),
|
||||
});
|
||||
dataSource.transaction.mockImplementation(async (cb: any) => cb(manager));
|
||||
|
||||
await expect(service.deleteSession('session-id', regularUser)).resolves.not.toThrow();
|
||||
expect(sessionRepository.delete).toHaveBeenCalledWith({ id: 'session-id', userId: 'user-1' });
|
||||
expect(manager.findOne).toHaveBeenCalledWith(AssessmentSession, { where: { id: 'session-id', userId: 'user-1' } });
|
||||
expect(manager.delete).toHaveBeenCalledWith(AssessmentCertificate, { sessionId: 'session-id' });
|
||||
expect(manager.delete).toHaveBeenCalledWith(AssessmentSession, { id: 'session-id' });
|
||||
});
|
||||
|
||||
it('should delete any session when admin user', async () => {
|
||||
sessionRepository.delete.mockResolvedValue({ affected: 1 });
|
||||
const manager = mockManager({
|
||||
findOne: jest.fn().mockResolvedValue({ id: 'other-session', userId: 'user-2' }),
|
||||
});
|
||||
dataSource.transaction.mockImplementation(async (cb: any) => cb(manager));
|
||||
|
||||
await expect(service.deleteSession('other-session', adminUser)).resolves.not.toThrow();
|
||||
expect(sessionRepository.delete).toHaveBeenCalledWith({ id: 'other-session' });
|
||||
expect(manager.findOne).toHaveBeenCalledWith(AssessmentSession, { where: { id: 'other-session' } });
|
||||
});
|
||||
|
||||
it('should throw NotFoundException if no session was affected', async () => {
|
||||
sessionRepository.delete.mockResolvedValue({ affected: 0 });
|
||||
it('should throw NotFoundException if session not found', async () => {
|
||||
const manager = mockManager({
|
||||
findOne: jest.fn().mockResolvedValue(null),
|
||||
});
|
||||
dataSource.transaction.mockImplementation(async (cb: any) => cb(manager));
|
||||
|
||||
await expect(service.deleteSession('non-existent', regularUser)).rejects.toThrow(NotFoundException);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user