import { Test, TestingModule } from '@nestjs/testing'; import { CorrespondenceController } from './correspondence.controller'; import { CorrespondenceService } from './correspondence.service'; import { CorrespondenceWorkflowService } from './correspondence-workflow.service'; import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; import { RbacGuard } from '../../common/guards/rbac.guard'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; describe('CorrespondenceController', () => { let controller: CorrespondenceController; let mockCorrespondenceService: Partial; let mockWorkflowService: Partial; beforeEach(async () => { mockCorrespondenceService = { create: jest.fn(), findAll: jest.fn(), findOne: jest.fn(), getReferences: jest.fn(), addReference: jest.fn(), removeReference: jest.fn(), findOneByUuid: jest.fn(), }; mockWorkflowService = { submitWorkflow: jest.fn(), processAction: jest.fn(), }; const module: TestingModule = await Test.createTestingModule({ controllers: [CorrespondenceController], providers: [ { provide: CorrespondenceService, useValue: mockCorrespondenceService, }, { provide: CorrespondenceWorkflowService, useValue: mockWorkflowService, }, { provide: CACHE_MANAGER, useValue: { get: jest.fn(), set: jest.fn(), }, }, ], }) .overrideGuard(JwtAuthGuard) .useValue({ canActivate: () => true }) .overrideGuard(RbacGuard) .useValue({ canActivate: () => true }) .compile(); controller = module.get(CorrespondenceController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); describe('findAll', () => { it('should return correspondences', async () => { const mockResult = [{ id: 1 }]; (mockCorrespondenceService.findAll as jest.Mock).mockResolvedValue( mockResult ); const result = await controller.findAll({}); expect(mockCorrespondenceService.findAll).toHaveBeenCalled(); expect(result).toEqual(mockResult); }); }); describe('create', () => { it('should create a correspondence', async () => { const mockCorr = { id: 1, correspondenceNumber: 'TEST-001' }; (mockCorrespondenceService.create as jest.Mock).mockResolvedValue( mockCorr ); const mockReq = { user: { user_id: 1 } }; const createDto = { projectId: 1, typeId: 1, subject: 'Test Subject', }; const _result = await controller.create( createDto as Parameters[0], mockReq as Parameters[1] ); expect(mockCorrespondenceService.create).toHaveBeenCalledWith( createDto, mockReq.user ); }); }); describe('submit', () => { it('should submit a correspondence to workflow', async () => { const mockResult = { instanceId: 'inst-1', currentState: 'IN_REVIEW' }; (mockWorkflowService.submitWorkflow as jest.Mock).mockResolvedValue( mockResult ); const mockReq = { user: { user_id: 1, username: 'testuser', password: 'hashedpassword', email: 'test@example.com', publicId: '019505a1-7c3e-7000-8000-abc123def456', createdAt: new Date(), updatedAt: new Date(), }, }; (mockCorrespondenceService.findOneByUuid as jest.Mock).mockResolvedValue({ id: 1, uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', }); const result = await controller.submit( 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', { note: 'Test note' }, mockReq as Parameters[2] ); expect(mockWorkflowService.submitWorkflow).toHaveBeenCalledWith( 1, 1, [], 'Test note' ); expect(result).toEqual(mockResult); }); }); });