251223:1649 On going update to 1.7.0: Refoctory drawing Module & document number Module
Spec Validation / validate-markdown (push) Has been cancelled
Spec Validation / validate-diagrams (push) Has been cancelled
Spec Validation / check-todos (push) Has been cancelled

This commit is contained in:
admin
2025-12-23 16:49:16 +07:00
parent 0d6432ab83
commit 7db6a003db
81 changed files with 4703 additions and 1449 deletions
@@ -9,26 +9,9 @@ import { DocumentNumberFormat } from './entities/document-number-format.entity';
import { DocumentNumberAudit } from './entities/document-number-audit.entity';
import { DocumentNumberError } from './entities/document-number-error.entity';
// Mock Redis and Redlock (legacy mocks, kept just in case)
const mockRedis = {
disconnect: jest.fn(),
on: jest.fn(),
};
const mockRedlock = {
acquire: jest.fn(),
};
const mockLock = {
release: jest.fn().mockResolvedValue(undefined),
};
jest.mock('ioredis', () => {
return jest.fn().mockImplementation(() => mockRedis);
});
jest.mock('redlock', () => {
return jest.fn().mockImplementation(() => {
return mockRedlock;
});
});
import { DocumentNumberingLockService } from './services/document-numbering-lock.service';
import { ManualOverrideService } from './services/manual-override.service';
import { MetricsService } from './services/metrics.service';
describe('DocumentNumberingService', () => {
let service: DocumentNumberingService;
@@ -39,15 +22,16 @@ describe('DocumentNumberingService', () => {
const mockContext = {
projectId: 1,
originatorOrganizationId: 1,
recipientOrganizationId: 1,
typeId: 1,
subTypeId: 1,
rfaTypeId: 1,
disciplineId: 1,
year: 2025,
customTokens: { TYPE_CODE: 'COR', ORG_CODE: 'GGL' },
};
beforeEach(async () => {
mockRedlock.acquire.mockResolvedValue(mockLock);
module = await Test.createTestingModule({
providers: [
DocumentNumberingService,
@@ -76,6 +60,24 @@ describe('DocumentNumberingService', () => {
format: jest.fn().mockResolvedValue('0001'),
},
},
{
provide: DocumentNumberingLockService,
useValue: {
acquireLock: jest.fn().mockResolvedValue({ release: jest.fn() }),
releaseLock: jest.fn(),
},
},
{
provide: ManualOverrideService,
useValue: { applyOverride: jest.fn() },
},
{
provide: MetricsService,
useValue: {
numbersGenerated: { inc: jest.fn() },
lockFailures: { inc: jest.fn() },
},
},
{
provide: getRepositoryToken(DocumentNumberFormat),
useValue: { findOne: jest.fn() },
@@ -85,6 +87,7 @@ describe('DocumentNumberingService', () => {
useValue: {
create: jest.fn().mockReturnValue({ id: 1 }),
save: jest.fn().mockResolvedValue({ id: 1 }),
findOne: jest.fn(),
},
},
{
@@ -136,4 +139,41 @@ describe('DocumentNumberingService', () => {
);
});
});
describe('Admin Operations', () => {
it('voidAndReplace should verify audit log exists', async () => {
const auditRepo = module.get(getRepositoryToken(DocumentNumberAudit));
(auditRepo.findOne as jest.Mock).mockResolvedValue({
generatedNumber: 'DOC-001',
counterKey: JSON.stringify({ projectId: 1, correspondenceTypeId: 1 }),
templateUsed: 'test',
});
(auditRepo.save as jest.Mock).mockResolvedValue({ id: 2 });
const result = await service.voidAndReplace({
documentNumber: 'DOC-001',
reason: 'test',
replace: false,
});
expect(result.status).toBe('VOIDED');
expect(auditRepo.save).toHaveBeenCalled();
});
it('cancelNumber should log cancellation', async () => {
const auditRepo = module.get(getRepositoryToken(DocumentNumberAudit));
(auditRepo.findOne as jest.Mock).mockResolvedValue({
generatedNumber: 'DOC-002',
counterKey: {},
});
(auditRepo.save as jest.Mock).mockResolvedValue({ id: 3 });
const result = await service.cancelNumber({
documentNumber: 'DOC-002',
reason: 'bad',
projectId: 1,
});
expect(result.status).toBe('CANCELLED');
expect(auditRepo.save).toHaveBeenCalled();
});
});
});