- Introduced `EmployeeUserWrite` type to manage user details associated with employees. - Updated `EmployeesService` and `EmployeesRepository` to support user assignment and retrieval by user ID. - Enhanced DTOs to include user information for employee creation and updates. - Implemented validation to ensure proper handling of user data during employee operations. - Added unit and e2e tests to validate the new functionality and ensure data integrity in user-employee relationships. - Modified existing controllers to accommodate the new user linkage features in employee management.
86 lines
2.7 KiB
TypeScript
86 lines
2.7 KiB
TypeScript
import { Test, TestingModule } from '@nestjs/testing';
|
|
import { EmployeesWriteController } from './employees-write.controller';
|
|
import { EmployeesService } from './employees.service';
|
|
|
|
const createDto = {
|
|
code: 'EMP_01',
|
|
name: 'Ada Lovelace',
|
|
phone: '+6281234567890',
|
|
position: 'sales',
|
|
};
|
|
|
|
describe('EmployeesWriteController', () => {
|
|
let controller: EmployeesWriteController;
|
|
const service = {
|
|
create: jest.fn(),
|
|
update: jest.fn(),
|
|
updateStatus: jest.fn(),
|
|
delete: jest.fn(),
|
|
bulkDelete: jest.fn(),
|
|
bulkUpdateStatus: jest.fn(),
|
|
importCsv: jest.fn(),
|
|
};
|
|
|
|
beforeEach(async () => {
|
|
jest.clearAllMocks();
|
|
const moduleRef: TestingModule = await Test.createTestingModule({
|
|
controllers: [EmployeesWriteController],
|
|
providers: [{ provide: EmployeesService, useValue: service }],
|
|
}).compile();
|
|
controller = moduleRef.get(EmployeesWriteController);
|
|
});
|
|
|
|
it('create passes dto fields and user id', async () => {
|
|
service.create.mockResolvedValue({ id: 'emp-1' });
|
|
await controller.create(createDto, 'user-1');
|
|
expect(service.create).toHaveBeenCalledWith({
|
|
...createDto,
|
|
status: undefined,
|
|
userId: 'user-1',
|
|
assignedUserId: undefined,
|
|
user: undefined,
|
|
});
|
|
});
|
|
|
|
it('update, updateStatus, and delete delegate', async () => {
|
|
service.update.mockResolvedValue({ id: 'emp-1' });
|
|
service.updateStatus.mockResolvedValue({ id: 'emp-1' });
|
|
service.delete.mockResolvedValue(undefined);
|
|
await controller.update('emp-1', { name: 'Ada Lovelace' }, 'user-1');
|
|
await controller.updateStatus('emp-1', { status: 'active' }, 'user-1');
|
|
await controller.delete('emp-1');
|
|
expect(service.updateStatus).toHaveBeenCalledWith(
|
|
'emp-1',
|
|
'active',
|
|
'user-1',
|
|
);
|
|
expect(service.delete).toHaveBeenCalledWith('emp-1');
|
|
});
|
|
|
|
it('bulk and import delegate', async () => {
|
|
service.bulkDelete.mockResolvedValue({ deleted: 1 });
|
|
service.bulkUpdateStatus.mockResolvedValue({ updated: 1 });
|
|
service.importCsv.mockResolvedValue({ imported: 1 });
|
|
await controller.bulkDelete({ ids: ['emp-1'] });
|
|
await controller.bulkStatus(
|
|
{ ids: ['emp-1'], status: 'archived' },
|
|
'user-1',
|
|
);
|
|
await controller.importCsv(
|
|
{
|
|
buffer: Buffer.from(
|
|
'code,name,phone,position\nEMP_01,Ada,+6281234567890,sales',
|
|
),
|
|
},
|
|
'user-1',
|
|
);
|
|
expect(service.importCsv).toHaveBeenCalled();
|
|
});
|
|
|
|
it('importCsv uses empty string when file is missing', async () => {
|
|
service.importCsv.mockResolvedValue({ imported: 0 });
|
|
await controller.importCsv(undefined, 'user-1');
|
|
expect(service.importCsv).toHaveBeenCalledWith('', 'user-1');
|
|
});
|
|
});
|