Add employees management module with database schema and validation
- Introduced `EmployeesModule` to manage employee data, including read and write controllers. - Created database migrations for the `employees` table, including constraints and unique indexes. - Implemented validation for employee fields such as name, code, and position with corresponding utility functions. - Developed service and repository layers for handling employee data operations. - Added unit tests for the employees service, repository, and controllers to ensure functionality and correctness. - Updated application module to include the new `EmployeesModule` for better organization.
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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',
|
||||
});
|
||||
});
|
||||
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user