@mbc-cqrs-serverless/master 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/index.d.ts +1 -0
- package/dist/controllers/index.js +1 -0
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/master-bulk.controller.d.ts +10 -0
- package/dist/controllers/master-bulk.controller.js +106 -0
- package/dist/controllers/master-bulk.controller.js.map +1 -0
- package/dist/controllers/master-bulk.controller.spec.d.ts +1 -0
- package/dist/controllers/master-bulk.controller.spec.js +261 -0
- package/dist/controllers/master-bulk.controller.spec.js.map +1 -0
- package/dist/controllers/master-data.controller.d.ts +1 -1
- package/dist/controllers/master-data.controller.js +8 -2
- package/dist/controllers/master-data.controller.js.map +1 -1
- package/dist/controllers/master-data.controller.spec.js +42 -1
- package/dist/controllers/master-data.controller.spec.js.map +1 -1
- package/dist/controllers/master-setting.controller.d.ts +1 -1
- package/dist/controllers/master-setting.controller.js +7 -1
- package/dist/controllers/master-setting.controller.js.map +1 -1
- package/dist/controllers/master-setting.controller.spec.js +44 -4
- package/dist/controllers/master-setting.controller.spec.js.map +1 -1
- package/dist/dto/index.d.ts +1 -0
- package/dist/dto/index.js +1 -0
- package/dist/dto/index.js.map +1 -1
- package/dist/dto/master-bulk/index.d.ts +2 -0
- package/dist/dto/master-bulk/index.js +19 -0
- package/dist/dto/master-bulk/index.js.map +1 -0
- package/dist/dto/master-bulk/master-bulk-item.dto.d.ts +8 -0
- package/dist/dto/master-bulk/master-bulk-item.dto.js +85 -0
- package/dist/dto/master-bulk/master-bulk-item.dto.js.map +1 -0
- package/dist/dto/master-bulk/master-bulk.dto.d.ts +4 -0
- package/dist/dto/master-bulk/master-bulk.dto.js +36 -0
- package/dist/dto/master-bulk/master-bulk.dto.js.map +1 -0
- package/dist/dto/master-copy/master-data-create-bulk.dto.js +1 -0
- package/dist/dto/master-copy/master-data-create-bulk.dto.js.map +1 -1
- package/dist/dto/master-setting/common-setting-create-bulk.dto.js +1 -0
- package/dist/dto/master-setting/common-setting-create-bulk.dto.js.map +1 -1
- package/dist/master.module.js +1 -0
- package/dist/master.module.js.map +1 -1
- package/dist/services/master-data-upsert.integration.spec.d.ts +1 -0
- package/dist/services/master-data-upsert.integration.spec.js +301 -0
- package/dist/services/master-data-upsert.integration.spec.js.map +1 -0
- package/dist/services/master-data.service.d.ts +7 -0
- package/dist/services/master-data.service.js +42 -10
- package/dist/services/master-data.service.js.map +1 -1
- package/dist/services/master-data.service.spec.js +308 -48
- package/dist/services/master-data.service.spec.js.map +1 -1
- package/dist/services/master-setting-upsert.integration.spec.d.ts +1 -0
- package/dist/services/master-setting-upsert.integration.spec.js +282 -0
- package/dist/services/master-setting-upsert.integration.spec.js.map +1 -0
- package/dist/services/master-setting.service.d.ts +6 -0
- package/dist/services/master-setting.service.js +55 -20
- package/dist/services/master-setting.service.js.map +1 -1
- package/dist/services/master-setting.service.spec.js +245 -44
- package/dist/services/master-setting.service.spec.js.map +1 -1
- package/package.json +5 -5
|
@@ -89,7 +89,9 @@ describe('MasterDataService', () => {
|
|
|
89
89
|
.mockResolvedValueOnce(mockDeletedSettings)
|
|
90
90
|
.mockResolvedValueOnce(mockItems);
|
|
91
91
|
prismaService.master.count.mockResolvedValue(1);
|
|
92
|
-
const result = await service.listByRds(searchDto, {
|
|
92
|
+
const result = await service.listByRds(searchDto, {
|
|
93
|
+
invokeContext: mockInvokeContext,
|
|
94
|
+
});
|
|
93
95
|
expect(result).toBeInstanceOf(dto_1.MasterRdsListEntity);
|
|
94
96
|
expect(result.total).toBe(1);
|
|
95
97
|
expect(result.items).toHaveLength(1);
|
|
@@ -106,7 +108,9 @@ describe('MasterDataService', () => {
|
|
|
106
108
|
.mockResolvedValueOnce([])
|
|
107
109
|
.mockResolvedValueOnce([]);
|
|
108
110
|
prismaService.master.count.mockResolvedValue(0);
|
|
109
|
-
const result = await service.listByRds(searchDto, {
|
|
111
|
+
const result = await service.listByRds(searchDto, {
|
|
112
|
+
invokeContext: mockInvokeContext,
|
|
113
|
+
});
|
|
110
114
|
expect(result.total).toBe(0);
|
|
111
115
|
expect(result.items).toHaveLength(0);
|
|
112
116
|
});
|
|
@@ -229,7 +233,9 @@ describe('MasterDataService', () => {
|
|
|
229
233
|
updatedAt: new Date(),
|
|
230
234
|
};
|
|
231
235
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
232
|
-
const result = await service.create(createDto, {
|
|
236
|
+
const result = await service.create(createDto, {
|
|
237
|
+
invokeContext: mockInvokeContext,
|
|
238
|
+
});
|
|
233
239
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
234
240
|
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
235
241
|
id: 'MASTER#TEST_TENANT#SETTING_CODE#DATA_CODE',
|
|
@@ -268,8 +274,7 @@ describe('MasterDataService', () => {
|
|
|
268
274
|
updatedAt: new Date(),
|
|
269
275
|
};
|
|
270
276
|
dataService.getItem.mockResolvedValue(existingData);
|
|
271
|
-
await expect(service.create(createDto, { invokeContext: mockInvokeContext }))
|
|
272
|
-
.rejects.toThrow('Master data already exists');
|
|
277
|
+
await expect(service.create(createDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Master data already exists');
|
|
273
278
|
expect(commandService.publishAsync).not.toHaveBeenCalled();
|
|
274
279
|
});
|
|
275
280
|
it('should create when existing data is deleted', async () => {
|
|
@@ -310,7 +315,9 @@ describe('MasterDataService', () => {
|
|
|
310
315
|
updatedAt: new Date(),
|
|
311
316
|
};
|
|
312
317
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
313
|
-
const result = await service.create(createDto, {
|
|
318
|
+
const result = await service.create(createDto, {
|
|
319
|
+
invokeContext: mockInvokeContext,
|
|
320
|
+
});
|
|
314
321
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
315
322
|
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
316
323
|
version: 2,
|
|
@@ -349,7 +356,9 @@ describe('MasterDataService', () => {
|
|
|
349
356
|
updatedAt: new Date(),
|
|
350
357
|
};
|
|
351
358
|
commandService.publishPartialUpdateAsync.mockResolvedValue(mockUpdateResult);
|
|
352
|
-
const result = await service.update(key, updateDto, {
|
|
359
|
+
const result = await service.update(key, updateDto, {
|
|
360
|
+
invokeContext: mockInvokeContext,
|
|
361
|
+
});
|
|
353
362
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
354
363
|
expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
355
364
|
id: existingData.id,
|
|
@@ -367,8 +376,7 @@ describe('MasterDataService', () => {
|
|
|
367
376
|
name: 'Updated Name',
|
|
368
377
|
};
|
|
369
378
|
dataService.getItem.mockResolvedValue(null);
|
|
370
|
-
await expect(service.update(key, updateDto, { invokeContext: mockInvokeContext }))
|
|
371
|
-
.rejects.toThrow('Master data not found');
|
|
379
|
+
await expect(service.update(key, updateDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Master data not found');
|
|
372
380
|
expect(commandService.publishPartialUpdateAsync).not.toHaveBeenCalled();
|
|
373
381
|
});
|
|
374
382
|
it('should preserve existing values when update fields are not provided', async () => {
|
|
@@ -430,7 +438,9 @@ describe('MasterDataService', () => {
|
|
|
430
438
|
updatedAt: new Date(),
|
|
431
439
|
};
|
|
432
440
|
commandService.publishPartialUpdateAsync.mockResolvedValue(mockDeleteResult);
|
|
433
|
-
const result = await service.delete(key, {
|
|
441
|
+
const result = await service.delete(key, {
|
|
442
|
+
invokeContext: mockInvokeContext,
|
|
443
|
+
});
|
|
434
444
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
435
445
|
expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
436
446
|
...existingData,
|
|
@@ -440,8 +450,7 @@ describe('MasterDataService', () => {
|
|
|
440
450
|
it('should throw NotFoundException when data does not exist', async () => {
|
|
441
451
|
const key = { pk: 'MASTER#TEST_TENANT', sk: 'SETTING#DATA1' };
|
|
442
452
|
dataService.getItem.mockResolvedValue(null);
|
|
443
|
-
await expect(service.delete(key, { invokeContext: mockInvokeContext }))
|
|
444
|
-
.rejects.toThrow('Master data not found');
|
|
453
|
+
await expect(service.delete(key, { invokeContext: mockInvokeContext })).rejects.toThrow('Master data not found');
|
|
445
454
|
expect(commandService.publishPartialUpdateAsync).not.toHaveBeenCalled();
|
|
446
455
|
});
|
|
447
456
|
it('should throw BadRequestException when data is already deleted', async () => {
|
|
@@ -460,8 +469,7 @@ describe('MasterDataService', () => {
|
|
|
460
469
|
updatedAt: new Date(),
|
|
461
470
|
};
|
|
462
471
|
dataService.getItem.mockResolvedValue(existingData);
|
|
463
|
-
await expect(service.delete(key, { invokeContext: mockInvokeContext }))
|
|
464
|
-
.rejects.toThrow('This master data is already deleted');
|
|
472
|
+
await expect(service.delete(key, { invokeContext: mockInvokeContext })).rejects.toThrow('This master data is already deleted');
|
|
465
473
|
expect(commandService.publishPartialUpdateAsync).not.toHaveBeenCalled();
|
|
466
474
|
});
|
|
467
475
|
});
|
|
@@ -575,7 +583,11 @@ describe('MasterDataService', () => {
|
|
|
575
583
|
masterTypeCode: createDto.settingCode,
|
|
576
584
|
},
|
|
577
585
|
});
|
|
578
|
-
|
|
586
|
+
// Verify seq is passed to publishAsync without mutating the original DTO
|
|
587
|
+
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
588
|
+
attributes: expect.objectContaining({ seq: 6 }),
|
|
589
|
+
seq: 6,
|
|
590
|
+
}), expect.anything());
|
|
579
591
|
});
|
|
580
592
|
it('should create setting with provided sequence', async () => {
|
|
581
593
|
const createDto = {
|
|
@@ -632,7 +644,11 @@ describe('MasterDataService', () => {
|
|
|
632
644
|
};
|
|
633
645
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
634
646
|
await service.createSetting(createDto, mockInvokeContext);
|
|
635
|
-
|
|
647
|
+
// Verify seq is passed to publishAsync without mutating the original DTO
|
|
648
|
+
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
649
|
+
attributes: expect.objectContaining({ seq: 1 }),
|
|
650
|
+
seq: 1,
|
|
651
|
+
}), expect.anything());
|
|
636
652
|
});
|
|
637
653
|
});
|
|
638
654
|
describe('updateSetting', () => {
|
|
@@ -669,6 +685,233 @@ describe('MasterDataService', () => {
|
|
|
669
685
|
expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining(updateDto), { invokeContext: mockInvokeContext });
|
|
670
686
|
});
|
|
671
687
|
});
|
|
688
|
+
describe('upsert', () => {
|
|
689
|
+
it('should create new data when not exists', async () => {
|
|
690
|
+
const createDto = {
|
|
691
|
+
settingCode: 'SETTING_CODE',
|
|
692
|
+
code: 'DATA_CODE',
|
|
693
|
+
tenantCode: 'TEST_TENANT',
|
|
694
|
+
name: 'Test Data',
|
|
695
|
+
seq: 1,
|
|
696
|
+
attributes: { key: 'value' },
|
|
697
|
+
};
|
|
698
|
+
dataService.getItem.mockResolvedValue(null);
|
|
699
|
+
const mockCommandResult = {
|
|
700
|
+
id: 'MASTER#TEST_TENANT#SETTING_CODE#DATA_CODE',
|
|
701
|
+
pk: 'MASTER#TEST_TENANT',
|
|
702
|
+
sk: 'SETTING_CODE#DATA_CODE',
|
|
703
|
+
version: 1,
|
|
704
|
+
type: 'MASTER',
|
|
705
|
+
tenantCode: 'TEST_TENANT',
|
|
706
|
+
name: createDto.name,
|
|
707
|
+
code: createDto.code,
|
|
708
|
+
seq: createDto.seq,
|
|
709
|
+
attributes: createDto.attributes,
|
|
710
|
+
isDeleted: false,
|
|
711
|
+
createdAt: new Date(),
|
|
712
|
+
updatedAt: new Date(),
|
|
713
|
+
};
|
|
714
|
+
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
715
|
+
const result = await service.upsert(createDto, {
|
|
716
|
+
invokeContext: mockInvokeContext,
|
|
717
|
+
});
|
|
718
|
+
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
719
|
+
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
720
|
+
version: 0,
|
|
721
|
+
isDeleted: false,
|
|
722
|
+
}), { invokeContext: mockInvokeContext });
|
|
723
|
+
});
|
|
724
|
+
it('should update existing data when exists with changes', async () => {
|
|
725
|
+
const createDto = {
|
|
726
|
+
settingCode: 'SETTING_CODE',
|
|
727
|
+
code: 'DATA_CODE',
|
|
728
|
+
tenantCode: 'TEST_TENANT',
|
|
729
|
+
name: 'Updated Data',
|
|
730
|
+
seq: 2,
|
|
731
|
+
attributes: { key: 'new-value' },
|
|
732
|
+
};
|
|
733
|
+
const existingData = {
|
|
734
|
+
id: 'existing-id',
|
|
735
|
+
pk: 'MASTER#TEST_TENANT',
|
|
736
|
+
sk: 'SETTING_CODE#DATA_CODE',
|
|
737
|
+
code: 'DATA_CODE',
|
|
738
|
+
name: 'Original Data',
|
|
739
|
+
version: 2,
|
|
740
|
+
type: 'MASTER',
|
|
741
|
+
tenantCode: 'TEST_TENANT',
|
|
742
|
+
isDeleted: false,
|
|
743
|
+
attributes: { key: 'old-value' },
|
|
744
|
+
createdAt: new Date(),
|
|
745
|
+
updatedAt: new Date(),
|
|
746
|
+
};
|
|
747
|
+
dataService.getItem.mockResolvedValue(existingData);
|
|
748
|
+
const mockCommandResult = {
|
|
749
|
+
id: 'MASTER#TEST_TENANT#SETTING_CODE#DATA_CODE',
|
|
750
|
+
pk: 'MASTER#TEST_TENANT',
|
|
751
|
+
sk: 'SETTING_CODE#DATA_CODE',
|
|
752
|
+
version: 3,
|
|
753
|
+
type: 'MASTER',
|
|
754
|
+
tenantCode: 'TEST_TENANT',
|
|
755
|
+
name: createDto.name,
|
|
756
|
+
code: createDto.code,
|
|
757
|
+
seq: createDto.seq,
|
|
758
|
+
attributes: createDto.attributes,
|
|
759
|
+
isDeleted: false,
|
|
760
|
+
createdAt: new Date(),
|
|
761
|
+
updatedAt: new Date(),
|
|
762
|
+
};
|
|
763
|
+
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
764
|
+
const result = await service.upsert(createDto, {
|
|
765
|
+
invokeContext: mockInvokeContext,
|
|
766
|
+
});
|
|
767
|
+
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
768
|
+
expect(result.name).toBe('Updated Data');
|
|
769
|
+
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
770
|
+
version: 2,
|
|
771
|
+
isDeleted: false,
|
|
772
|
+
}), { invokeContext: mockInvokeContext });
|
|
773
|
+
});
|
|
774
|
+
it('should return existing data when data is identical (not dirty)', async () => {
|
|
775
|
+
const createDto = {
|
|
776
|
+
settingCode: 'SETTING_CODE',
|
|
777
|
+
code: 'DATA_CODE',
|
|
778
|
+
tenantCode: 'TEST_TENANT',
|
|
779
|
+
name: 'Same Data',
|
|
780
|
+
seq: 1,
|
|
781
|
+
attributes: { key: 'value' },
|
|
782
|
+
};
|
|
783
|
+
const existingData = {
|
|
784
|
+
id: 'existing-id',
|
|
785
|
+
pk: 'MASTER#TEST_TENANT',
|
|
786
|
+
sk: 'SETTING_CODE#DATA_CODE',
|
|
787
|
+
code: 'DATA_CODE',
|
|
788
|
+
name: 'Same Data',
|
|
789
|
+
version: 2,
|
|
790
|
+
type: 'MASTER',
|
|
791
|
+
tenantCode: 'TEST_TENANT',
|
|
792
|
+
isDeleted: false,
|
|
793
|
+
attributes: { key: 'value' },
|
|
794
|
+
createdAt: new Date(),
|
|
795
|
+
updatedAt: new Date(),
|
|
796
|
+
};
|
|
797
|
+
dataService.getItem.mockResolvedValue(existingData);
|
|
798
|
+
// publishAsync returns null when not dirty
|
|
799
|
+
commandService.publishAsync.mockResolvedValue(null);
|
|
800
|
+
const result = await service.upsert(createDto, {
|
|
801
|
+
invokeContext: mockInvokeContext,
|
|
802
|
+
});
|
|
803
|
+
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
804
|
+
expect(result.name).toBe('Same Data');
|
|
805
|
+
});
|
|
806
|
+
it('should recreate when existing data is deleted', async () => {
|
|
807
|
+
const createDto = {
|
|
808
|
+
settingCode: 'SETTING_CODE',
|
|
809
|
+
code: 'DATA_CODE',
|
|
810
|
+
tenantCode: 'TEST_TENANT',
|
|
811
|
+
name: 'Recreated Data',
|
|
812
|
+
seq: 1,
|
|
813
|
+
attributes: { recreated: true },
|
|
814
|
+
};
|
|
815
|
+
const existingDeletedData = {
|
|
816
|
+
id: 'existing-id',
|
|
817
|
+
pk: 'MASTER#TEST_TENANT',
|
|
818
|
+
sk: 'SETTING_CODE#DATA_CODE',
|
|
819
|
+
code: 'DATA_CODE',
|
|
820
|
+
name: 'Deleted Data',
|
|
821
|
+
version: 3,
|
|
822
|
+
type: 'MASTER',
|
|
823
|
+
tenantCode: 'TEST_TENANT',
|
|
824
|
+
isDeleted: true,
|
|
825
|
+
createdAt: new Date(),
|
|
826
|
+
updatedAt: new Date(),
|
|
827
|
+
};
|
|
828
|
+
dataService.getItem.mockResolvedValue(existingDeletedData);
|
|
829
|
+
const mockCommandResult = {
|
|
830
|
+
id: 'MASTER#TEST_TENANT#SETTING_CODE#DATA_CODE',
|
|
831
|
+
pk: 'MASTER#TEST_TENANT',
|
|
832
|
+
sk: 'SETTING_CODE#DATA_CODE',
|
|
833
|
+
version: 3,
|
|
834
|
+
type: 'MASTER',
|
|
835
|
+
tenantCode: 'TEST_TENANT',
|
|
836
|
+
name: createDto.name,
|
|
837
|
+
code: createDto.code,
|
|
838
|
+
seq: createDto.seq,
|
|
839
|
+
attributes: createDto.attributes,
|
|
840
|
+
isDeleted: false,
|
|
841
|
+
createdAt: new Date(),
|
|
842
|
+
updatedAt: new Date(),
|
|
843
|
+
};
|
|
844
|
+
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
845
|
+
const result = await service.upsert(createDto, {
|
|
846
|
+
invokeContext: mockInvokeContext,
|
|
847
|
+
});
|
|
848
|
+
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
849
|
+
expect(result.isDeleted).toBe(false);
|
|
850
|
+
expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
851
|
+
version: 3,
|
|
852
|
+
isDeleted: false,
|
|
853
|
+
}), { invokeContext: mockInvokeContext });
|
|
854
|
+
});
|
|
855
|
+
});
|
|
856
|
+
describe('upsertBulk', () => {
|
|
857
|
+
it('should upsert multiple items', async () => {
|
|
858
|
+
const createDto1 = {
|
|
859
|
+
settingCode: 'SETTING_CODE',
|
|
860
|
+
name: 'Item 1',
|
|
861
|
+
code: 'CODE1',
|
|
862
|
+
seq: 1,
|
|
863
|
+
attributes: { key: 'value1' },
|
|
864
|
+
};
|
|
865
|
+
const createDto2 = {
|
|
866
|
+
settingCode: 'SETTING_CODE',
|
|
867
|
+
name: 'Item 2',
|
|
868
|
+
code: 'CODE2',
|
|
869
|
+
seq: 2,
|
|
870
|
+
attributes: { key: 'value2' },
|
|
871
|
+
};
|
|
872
|
+
prismaService.master.aggregate.mockResolvedValue({
|
|
873
|
+
_max: { seq: null },
|
|
874
|
+
});
|
|
875
|
+
dataService.getItem.mockResolvedValue(null);
|
|
876
|
+
const mockResult1 = {
|
|
877
|
+
id: 'id1',
|
|
878
|
+
pk: `MASTER#${mockUserContext.tenantCode}`,
|
|
879
|
+
sk: 'SETTING_CODE#CODE1',
|
|
880
|
+
version: 1,
|
|
881
|
+
type: 'MASTER',
|
|
882
|
+
tenantCode: mockUserContext.tenantCode,
|
|
883
|
+
name: 'Item 1',
|
|
884
|
+
code: 'CODE1',
|
|
885
|
+
seq: 1,
|
|
886
|
+
attributes: { key: 'value1' },
|
|
887
|
+
isDeleted: false,
|
|
888
|
+
createdAt: new Date(),
|
|
889
|
+
updatedAt: new Date(),
|
|
890
|
+
};
|
|
891
|
+
const mockResult2 = {
|
|
892
|
+
id: 'id2',
|
|
893
|
+
pk: `MASTER#${mockUserContext.tenantCode}`,
|
|
894
|
+
sk: 'SETTING_CODE#CODE2',
|
|
895
|
+
version: 1,
|
|
896
|
+
type: 'MASTER',
|
|
897
|
+
tenantCode: mockUserContext.tenantCode,
|
|
898
|
+
name: 'Item 2',
|
|
899
|
+
code: 'CODE2',
|
|
900
|
+
seq: 2,
|
|
901
|
+
attributes: { key: 'value2' },
|
|
902
|
+
isDeleted: false,
|
|
903
|
+
createdAt: new Date(),
|
|
904
|
+
updatedAt: new Date(),
|
|
905
|
+
};
|
|
906
|
+
commandService.publishAsync
|
|
907
|
+
.mockResolvedValueOnce(mockResult1)
|
|
908
|
+
.mockResolvedValueOnce(mockResult2);
|
|
909
|
+
const result = await service.upsertBulk({ items: [createDto1, createDto2] }, mockInvokeContext);
|
|
910
|
+
expect(result).toHaveLength(2);
|
|
911
|
+
expect(result[0]).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
912
|
+
expect(result[1]).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
913
|
+
});
|
|
914
|
+
});
|
|
672
915
|
describe('deleteSetting', () => {
|
|
673
916
|
it('should delete setting', async () => {
|
|
674
917
|
const key = { pk: 'MASTER#TEST_TENANT', sk: 'SETTING#DATA1' };
|
|
@@ -718,8 +961,7 @@ describe('MasterDataService', () => {
|
|
|
718
961
|
const dbError = new Error('Database connection failed');
|
|
719
962
|
dbError.name = 'PrismaClientKnownRequestError';
|
|
720
963
|
dataService.getItem.mockRejectedValue(dbError);
|
|
721
|
-
await expect(service.create(createDto, { invokeContext: mockInvokeContext }))
|
|
722
|
-
.rejects.toThrow('Database connection failed');
|
|
964
|
+
await expect(service.create(createDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Database connection failed');
|
|
723
965
|
expect(commandService.publishAsync).not.toHaveBeenCalled();
|
|
724
966
|
});
|
|
725
967
|
it('should handle CommandService publish failures', async () => {
|
|
@@ -733,8 +975,7 @@ describe('MasterDataService', () => {
|
|
|
733
975
|
dataService.getItem.mockResolvedValue(null);
|
|
734
976
|
const commandError = new Error('Command publish failed');
|
|
735
977
|
commandService.publishAsync.mockRejectedValue(commandError);
|
|
736
|
-
await expect(service.create(createDto, { invokeContext: mockInvokeContext }))
|
|
737
|
-
.rejects.toThrow('Command publish failed');
|
|
978
|
+
await expect(service.create(createDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Command publish failed');
|
|
738
979
|
});
|
|
739
980
|
it('should handle concurrent creation attempts with version conflicts', async () => {
|
|
740
981
|
const createDto = {
|
|
@@ -748,8 +989,7 @@ describe('MasterDataService', () => {
|
|
|
748
989
|
const versionError = new Error('Version conflict');
|
|
749
990
|
versionError.name = 'ConditionalCheckFailedException';
|
|
750
991
|
commandService.publishAsync.mockRejectedValue(versionError);
|
|
751
|
-
await expect(service.create(createDto, { invokeContext: mockInvokeContext }))
|
|
752
|
-
.rejects.toThrow('Version conflict');
|
|
992
|
+
await expect(service.create(createDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Version conflict');
|
|
753
993
|
});
|
|
754
994
|
});
|
|
755
995
|
describe('update - Error Handling', () => {
|
|
@@ -762,8 +1002,7 @@ describe('MasterDataService', () => {
|
|
|
762
1002
|
const timeoutError = new Error('Query timeout');
|
|
763
1003
|
timeoutError.name = 'PrismaClientKnownRequestError';
|
|
764
1004
|
dataService.getItem.mockRejectedValue(timeoutError);
|
|
765
|
-
await expect(service.update(key, updateDto, { invokeContext: mockInvokeContext }))
|
|
766
|
-
.rejects.toThrow('Query timeout');
|
|
1005
|
+
await expect(service.update(key, updateDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Query timeout');
|
|
767
1006
|
expect(commandService.publishPartialUpdateAsync).not.toHaveBeenCalled();
|
|
768
1007
|
});
|
|
769
1008
|
it('should handle CommandService partial update failures', async () => {
|
|
@@ -788,8 +1027,7 @@ describe('MasterDataService', () => {
|
|
|
788
1027
|
dataService.getItem.mockResolvedValue(existingData);
|
|
789
1028
|
const updateError = new Error('Update command failed');
|
|
790
1029
|
commandService.publishPartialUpdateAsync.mockRejectedValue(updateError);
|
|
791
|
-
await expect(service.update(key, updateDto, { invokeContext: mockInvokeContext }))
|
|
792
|
-
.rejects.toThrow('Update command failed');
|
|
1030
|
+
await expect(service.update(key, updateDto, { invokeContext: mockInvokeContext })).rejects.toThrow('Update command failed');
|
|
793
1031
|
});
|
|
794
1032
|
});
|
|
795
1033
|
describe('delete - Error Handling', () => {
|
|
@@ -798,8 +1036,7 @@ describe('MasterDataService', () => {
|
|
|
798
1036
|
const accessError = new Error('Access denied');
|
|
799
1037
|
accessError.name = 'PrismaClientKnownRequestError';
|
|
800
1038
|
dataService.getItem.mockRejectedValue(accessError);
|
|
801
|
-
await expect(service.delete(key, { invokeContext: mockInvokeContext }))
|
|
802
|
-
.rejects.toThrow('Access denied');
|
|
1039
|
+
await expect(service.delete(key, { invokeContext: mockInvokeContext })).rejects.toThrow('Access denied');
|
|
803
1040
|
expect(commandService.publishPartialUpdateAsync).not.toHaveBeenCalled();
|
|
804
1041
|
});
|
|
805
1042
|
it('should handle deletion command failures', async () => {
|
|
@@ -820,8 +1057,7 @@ describe('MasterDataService', () => {
|
|
|
820
1057
|
dataService.getItem.mockResolvedValue(existingData);
|
|
821
1058
|
const deleteError = new Error('Delete command failed');
|
|
822
1059
|
commandService.publishPartialUpdateAsync.mockRejectedValue(deleteError);
|
|
823
|
-
await expect(service.delete(key, { invokeContext: mockInvokeContext }))
|
|
824
|
-
.rejects.toThrow('Delete command failed');
|
|
1060
|
+
await expect(service.delete(key, { invokeContext: mockInvokeContext })).rejects.toThrow('Delete command failed');
|
|
825
1061
|
});
|
|
826
1062
|
});
|
|
827
1063
|
});
|
|
@@ -858,7 +1094,9 @@ describe('MasterDataService', () => {
|
|
|
858
1094
|
updatedAt: new Date(),
|
|
859
1095
|
};
|
|
860
1096
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
861
|
-
const result = await service.create(createDto, {
|
|
1097
|
+
const result = await service.create(createDto, {
|
|
1098
|
+
invokeContext: mockInvokeContext,
|
|
1099
|
+
});
|
|
862
1100
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
863
1101
|
expect(result.name).toBe('');
|
|
864
1102
|
expect(result.code).toBe('');
|
|
@@ -873,7 +1111,7 @@ describe('MasterDataService', () => {
|
|
|
873
1111
|
attributes: {
|
|
874
1112
|
specialKey: 'value with 特殊文字',
|
|
875
1113
|
unicodeKey: '🚀🎉',
|
|
876
|
-
jsonString: '{"nested": "value"}'
|
|
1114
|
+
jsonString: '{"nested": "value"}',
|
|
877
1115
|
},
|
|
878
1116
|
};
|
|
879
1117
|
dataService.getItem.mockResolvedValue(null);
|
|
@@ -893,7 +1131,9 @@ describe('MasterDataService', () => {
|
|
|
893
1131
|
updatedAt: new Date(),
|
|
894
1132
|
};
|
|
895
1133
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
896
|
-
const result = await service.create(createDto, {
|
|
1134
|
+
const result = await service.create(createDto, {
|
|
1135
|
+
invokeContext: mockInvokeContext,
|
|
1136
|
+
});
|
|
897
1137
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
898
1138
|
expect(result.code).toBe('DATA_CODE_特殊文字@#$%');
|
|
899
1139
|
expect(result.name).toBe('Test Data with 特殊文字 & symbols!');
|
|
@@ -928,7 +1168,9 @@ describe('MasterDataService', () => {
|
|
|
928
1168
|
updatedAt: new Date(),
|
|
929
1169
|
};
|
|
930
1170
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
931
|
-
const result = await service.create(createDto, {
|
|
1171
|
+
const result = await service.create(createDto, {
|
|
1172
|
+
invokeContext: mockInvokeContext,
|
|
1173
|
+
});
|
|
932
1174
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
933
1175
|
expect(Object.keys(result.attributes)).toHaveLength(100);
|
|
934
1176
|
});
|
|
@@ -956,7 +1198,9 @@ describe('MasterDataService', () => {
|
|
|
956
1198
|
updatedAt: new Date(),
|
|
957
1199
|
};
|
|
958
1200
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
959
|
-
const result = await service.create(createDto, {
|
|
1201
|
+
const result = await service.create(createDto, {
|
|
1202
|
+
invokeContext: mockInvokeContext,
|
|
1203
|
+
});
|
|
960
1204
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
961
1205
|
expect(result.seq).toBe(-1);
|
|
962
1206
|
});
|
|
@@ -990,7 +1234,9 @@ describe('MasterDataService', () => {
|
|
|
990
1234
|
updatedAt: new Date(),
|
|
991
1235
|
};
|
|
992
1236
|
commandService.publishPartialUpdateAsync.mockResolvedValue(mockUpdateResult);
|
|
993
|
-
const result = await service.update(key, updateDto, {
|
|
1237
|
+
const result = await service.update(key, updateDto, {
|
|
1238
|
+
invokeContext: mockInvokeContext,
|
|
1239
|
+
});
|
|
994
1240
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
995
1241
|
expect(result.attributes).toBeNull();
|
|
996
1242
|
});
|
|
@@ -1020,7 +1266,9 @@ describe('MasterDataService', () => {
|
|
|
1020
1266
|
updatedAt: new Date(),
|
|
1021
1267
|
};
|
|
1022
1268
|
commandService.publishPartialUpdateAsync.mockResolvedValue(mockUpdateResult);
|
|
1023
|
-
const result = await service.update(key, updateDto, {
|
|
1269
|
+
const result = await service.update(key, updateDto, {
|
|
1270
|
+
invokeContext: mockInvokeContext,
|
|
1271
|
+
});
|
|
1024
1272
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
1025
1273
|
expect(result.name).toBe(longName);
|
|
1026
1274
|
expect(result.name.length).toBe(1000);
|
|
@@ -1074,7 +1322,9 @@ describe('MasterDataService', () => {
|
|
|
1074
1322
|
updatedAt: new Date(),
|
|
1075
1323
|
};
|
|
1076
1324
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
1077
|
-
const result = await service.create(createDto, {
|
|
1325
|
+
const result = await service.create(createDto, {
|
|
1326
|
+
invokeContext: mockInvokeContext,
|
|
1327
|
+
});
|
|
1078
1328
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
1079
1329
|
expect(result.version).toBe(3);
|
|
1080
1330
|
expect(result.isDeleted).toBe(false);
|
|
@@ -1127,7 +1377,9 @@ describe('MasterDataService', () => {
|
|
|
1127
1377
|
updatedAt: new Date(),
|
|
1128
1378
|
};
|
|
1129
1379
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
1130
|
-
const result = await service.create(createDto, {
|
|
1380
|
+
const result = await service.create(createDto, {
|
|
1381
|
+
invokeContext: mockInvokeContext,
|
|
1382
|
+
});
|
|
1131
1383
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
1132
1384
|
expect(result.version).toBe(5);
|
|
1133
1385
|
expect(result.isDeleted).toBe(false);
|
|
@@ -1171,7 +1423,9 @@ describe('MasterDataService', () => {
|
|
|
1171
1423
|
updatedAt: new Date(),
|
|
1172
1424
|
};
|
|
1173
1425
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
1174
|
-
const result = await service.create(createDto, {
|
|
1426
|
+
const result = await service.create(createDto, {
|
|
1427
|
+
invokeContext: mockInvokeContext,
|
|
1428
|
+
});
|
|
1175
1429
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
1176
1430
|
expect(result.createdAt).toEqual(originalCreatedAt);
|
|
1177
1431
|
expect(result.isDeleted).toBe(false);
|
|
@@ -1200,7 +1454,9 @@ describe('MasterDataService', () => {
|
|
|
1200
1454
|
updatedAt: new Date(),
|
|
1201
1455
|
};
|
|
1202
1456
|
commandService.publishAsync.mockResolvedValue(mockCommandResult);
|
|
1203
|
-
const result = await service.create(createDto, {
|
|
1457
|
+
const result = await service.create(createDto, {
|
|
1458
|
+
invokeContext: mockInvokeContext,
|
|
1459
|
+
});
|
|
1204
1460
|
expect(result).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
1205
1461
|
expect(result.tenantCode).toBe('NEW_TENANT');
|
|
1206
1462
|
expect(result.version).toBe(1);
|
|
@@ -1278,9 +1534,10 @@ describe('MasterDataService', () => {
|
|
|
1278
1534
|
commandService.publishAsync
|
|
1279
1535
|
.mockResolvedValueOnce(mockCommandResult1)
|
|
1280
1536
|
.mockRejectedValueOnce(versionConflictError);
|
|
1281
|
-
const result1 = await service.create(createDto1, {
|
|
1282
|
-
|
|
1283
|
-
|
|
1537
|
+
const result1 = await service.create(createDto1, {
|
|
1538
|
+
invokeContext: mockInvokeContext,
|
|
1539
|
+
});
|
|
1540
|
+
await expect(service.create(createDto2, { invokeContext: mockInvokeContext })).rejects.toThrow('Version conflict');
|
|
1284
1541
|
expect(result1).toBeInstanceOf(entities_1.MasterDataEntity);
|
|
1285
1542
|
expect(result1.name).toBe('First Creation');
|
|
1286
1543
|
});
|
|
@@ -1329,7 +1586,9 @@ describe('MasterDataService', () => {
|
|
|
1329
1586
|
commandService.publishPartialUpdateAsync.mockResolvedValue(mockDeleteResult);
|
|
1330
1587
|
commandService.publishAsync.mockResolvedValue(mockRecreateResult);
|
|
1331
1588
|
const deleteResult = await service.delete({ pk: existingData.pk, sk: existingData.sk }, { invokeContext: mockInvokeContext });
|
|
1332
|
-
const recreateResult = await service.create(createDto, {
|
|
1589
|
+
const recreateResult = await service.create(createDto, {
|
|
1590
|
+
invokeContext: mockInvokeContext,
|
|
1591
|
+
});
|
|
1333
1592
|
expect(deleteResult.isDeleted).toBe(true);
|
|
1334
1593
|
expect(recreateResult.isDeleted).toBe(false);
|
|
1335
1594
|
expect(recreateResult.version).toBe(3);
|
|
@@ -1372,9 +1631,10 @@ describe('MasterDataService', () => {
|
|
|
1372
1631
|
commandService.publishPartialUpdateAsync
|
|
1373
1632
|
.mockResolvedValueOnce(mockUpdateResult1)
|
|
1374
1633
|
.mockRejectedValueOnce(versionConflictError);
|
|
1375
|
-
const result1 = await service.update(key, updateDto1, {
|
|
1376
|
-
|
|
1377
|
-
|
|
1634
|
+
const result1 = await service.update(key, updateDto1, {
|
|
1635
|
+
invokeContext: mockInvokeContext,
|
|
1636
|
+
});
|
|
1637
|
+
await expect(service.update(key, updateDto2, { invokeContext: mockInvokeContext })).rejects.toThrow('Version conflict');
|
|
1378
1638
|
expect(result1.name).toBe('First Update');
|
|
1379
1639
|
expect(result1.version).toBe(2);
|
|
1380
1640
|
});
|