@futdevpro/nts-dynamo 1.15.2 → 1.15.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/.cursor/rules/__assistant_guide.mdc +30 -0
- package/.cursor/rules/__main.mdc +62 -0
- package/.cursor/rules/_ag_backend-structure.mdc +86 -0
- package/.cursor/rules/_ag_backend.mdc +16 -0
- package/.cursor/rules/_ag_debug.mdc +8 -0
- package/.cursor/rules/_ag_documentation_writing_rules.mdc +372 -0
- package/.cursor/rules/_ag_file-refactoring.mdc +113 -0
- package/.cursor/rules/_ag_fixes_rules.mdc +6 -0
- package/.cursor/rules/_ag_frontend-structure.mdc +87 -0
- package/.cursor/rules/_ag_frontend.mdc +40 -0
- package/.cursor/rules/_ag_import-rules.mdc +45 -0
- package/.cursor/rules/_ag_naming.mdc +116 -0
- package/.cursor/rules/_ag_running_commands.mdc +5 -0
- package/.cursor/rules/_ag_server-controller.mdc +6 -0
- package/.cursor/rules/_ag_should-be.mdc +7 -0
- package/.cursor/rules/_ag_swearing.mdc +47 -0
- package/.cursor/rules/ai_development_guide.md +61 -0
- package/.cursor/rules/ai_directives.md +114 -0
- package/.cursor/rules/cursor-rules.md +160 -0
- package/.cursor/rules/default-command.mdc +229 -0
- package/.cursor/rules/error_code_pattern.md +40 -0
- package/.cursor/rules/saved rule mcp server use.md +16 -0
- package/build/_modules/custom-data/custom-data.controller.d.ts.map +1 -1
- package/build/_modules/custom-data/custom-data.controller.js +1 -2
- package/build/_modules/custom-data/custom-data.controller.js.map +1 -1
- package/build/_services/core/api.service.d.ts.map +1 -1
- package/build/_services/core/api.service.js +1 -0
- package/build/_services/core/api.service.js.map +1 -1
- package/package.json +5 -4
- package/scripts/run-coverage-tests.js +5 -1
- package/spec/support/helpers/spec-reporter-loader.js +359 -0
- package/spec/support/helpers/ts-node-helper.js +84 -0
- package/spec/support/jasmine.coverage.json +2 -1
- package/spec/support/jasmine.json +3 -3
- package/src/_collections/archive.util.spec.ts +36 -0
- package/src/_collections/get-environment-settings.util.spec.ts +210 -0
- package/src/_collections/star.controller.spec.ts +224 -0
- package/src/_models/control-models/api-call-params.control-model.spec.ts +62 -3
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -0
- package/src/_models/control-models/app-params.control-model.spec.ts +158 -2
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +578 -0
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -0
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -0
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -0
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -0
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +240 -0
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -0
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +437 -0
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -0
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -0
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -0
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -0
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -0
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -0
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -0
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -0
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -0
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -0
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -0
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -0
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -0
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -0
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -0
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -0
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -0
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -0
- package/src/_modules/custom-data/custom-data.controller.ts +1 -3
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -0
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -0
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -0
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -0
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -0
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -0
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -0
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -0
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -0
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -0
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -0
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -0
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -0
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -0
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -0
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -0
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +345 -0
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -0
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -0
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -0
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -0
- package/src/_modules/mock/data-model.mock.spec.ts +27 -24
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -0
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -0
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -0
- package/src/_modules/server/errors/errors.control-service.spec.ts +230 -0
- package/src/_modules/server/errors/errors.controller.spec.ts +165 -0
- package/src/_modules/server/errors/errors.data-service.spec.ts +355 -0
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -0
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -0
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +516 -0
- package/src/_modules/server/server-status/server-status.controller.spec.ts +156 -0
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +6 -3
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -0
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -0
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -0
- package/src/_modules/test/test.controller.spec.ts +72 -0
- package/src/_modules/usage/usage.controller.spec.ts +81 -0
- package/src/_modules/usage/usage.data-service.spec.ts +332 -0
- package/src/_services/base/api.service-base.spec.ts +125 -0
- package/src/_services/base/archive-data.service.spec.ts +196 -0
- package/src/_services/base/data.service.spec.ts +493 -0
- package/src/_services/base/db.service.spec.ts +59 -18
- package/src/_services/base/singleton.service-base.spec.ts +28 -0
- package/src/_services/base/singleton.service.spec.ts +114 -0
- package/src/_services/core/api.service.ts +1 -0
- package/src/_services/core/auth.service.spec.ts +159 -0
- package/src/_services/core/email.service.spec.ts +14 -22
- package/src/_services/core/global.service.spec.ts +275 -0
- package/src/_services/core/service-collection.service.spec.ts +46 -0
- package/src/_services/route/routing-module.service.spec.ts +8 -6
- package/src/_services/shared.static-service.spec.ts +89 -0
- package/src/_modules/socket/app-extended.server.spec.ts +0 -227
- package/src/_services/server/app.server.spec.ts +0 -138
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_ApiService_Base } from './api.service-base';
|
|
3
|
+
import { DyNTS_ApiService } from '../core/api.service';
|
|
4
|
+
import { DyFM_Error, DyFM_HttpCallType, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
5
|
+
import { DyNTS_ApiCall_Params } from '../../_models/control-models/api-call-params.control-model';
|
|
6
|
+
|
|
7
|
+
class TestApiService extends DyNTS_ApiService_Base {
|
|
8
|
+
get baseUrl(): string {
|
|
9
|
+
return 'https://api.example.com';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
get testEndpoint(): string {
|
|
13
|
+
return '/test';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get connectingSystemName(): string {
|
|
17
|
+
return 'TestSystem';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static getInstance(): TestApiService {
|
|
21
|
+
return TestApiService.getSingletonInstance();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
describe('| DyNTS_ApiService_Base', () => {
|
|
26
|
+
let service: TestApiService;
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
service = TestApiService.getInstance();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('| should be a singleton instance', () => {
|
|
33
|
+
const instance1 = TestApiService.getInstance();
|
|
34
|
+
const instance2 = TestApiService.getInstance();
|
|
35
|
+
|
|
36
|
+
expect(instance1).toBe(instance2);
|
|
37
|
+
expect(instance1).toBeInstanceOf(TestApiService);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe('| runApiCallWithAvailabilityCheck', () => {
|
|
41
|
+
it('| should return result when api call succeeds', async () => {
|
|
42
|
+
const apiCall = jasmine.createSpy('apiCall').and.returnValue(Promise.resolve('success'));
|
|
43
|
+
|
|
44
|
+
const result = await service.runApiCallWithAvailabilityCheck(apiCall, 'issuer-123');
|
|
45
|
+
|
|
46
|
+
expect(result).toBe('success');
|
|
47
|
+
expect(apiCall).toHaveBeenCalled();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('| should check server availability when api call fails', async () => {
|
|
51
|
+
const apiCall = jasmine.createSpy('apiCall').and.returnValue(
|
|
52
|
+
Promise.reject(new Error('API call failed'))
|
|
53
|
+
);
|
|
54
|
+
spyOn(service, 'checkServerAvailability').and.returnValue(Promise.resolve());
|
|
55
|
+
|
|
56
|
+
await expectAsync(
|
|
57
|
+
service.runApiCallWithAvailabilityCheck(apiCall, 'issuer-123')
|
|
58
|
+
).toBeRejectedWithError('API call failed');
|
|
59
|
+
|
|
60
|
+
expect(service.checkServerAvailability).toHaveBeenCalledWith('issuer-123');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('| checkServerAvailability', () => {
|
|
65
|
+
it('| should succeed when testGet succeeds', async () => {
|
|
66
|
+
spyOn(service, 'testGet').and.returnValue(Promise.resolve());
|
|
67
|
+
const logSpy = spyOn(DyFM_Log, 'success');
|
|
68
|
+
|
|
69
|
+
await service.checkServerAvailability('issuer-123');
|
|
70
|
+
|
|
71
|
+
expect(service.testGet).toHaveBeenCalledWith('issuer-123');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('| should throw error when testGet fails', async () => {
|
|
75
|
+
spyOn(service, 'testGet').and.returnValue(
|
|
76
|
+
Promise.reject(new Error('Test failed'))
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
await service.checkServerAvailability('issuer-123');
|
|
81
|
+
fail('Should have thrown an error');
|
|
82
|
+
} catch (error) {
|
|
83
|
+
expect(error).toBeInstanceOf(DyFM_Error);
|
|
84
|
+
expect((error as DyFM_Error)._message).toContain('TestSystem server is not available');
|
|
85
|
+
expect((error as DyFM_Error)._message).toContain('baseUrl: https://api.example.com');
|
|
86
|
+
expect((error as DyFM_Error).__userMessage).toContain('TestSystem server is not available');
|
|
87
|
+
expect((error as DyFM_Error)._errorCode).toContain('DyNTS-ASB-CSA0');
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe('| testGet', () => {
|
|
93
|
+
it('| should call ApiService.startApiCall with correct parameters', async () => {
|
|
94
|
+
const startApiCallSpy = spyOn(DyNTS_ApiService, 'startApiCall').and.returnValue(
|
|
95
|
+
Promise.resolve()
|
|
96
|
+
);
|
|
97
|
+
const logSpy = spyOn(DyFM_Log, 'success');
|
|
98
|
+
|
|
99
|
+
await service.testGet('issuer-123');
|
|
100
|
+
|
|
101
|
+
expect(startApiCallSpy).toHaveBeenCalledWith(
|
|
102
|
+
jasmine.any(DyNTS_ApiCall_Params)
|
|
103
|
+
);
|
|
104
|
+
const callParams = startApiCallSpy.calls.mostRecent().args[0] as DyNTS_ApiCall_Params;
|
|
105
|
+
expect(callParams.type).toBe(DyFM_HttpCallType.get);
|
|
106
|
+
expect(callParams.baseUrl).toBe('https://api.example.com');
|
|
107
|
+
expect(callParams.endpoint).toBe('/test');
|
|
108
|
+
expect(logSpy).toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('| should throw error when testEndpoint is not set', async () => {
|
|
112
|
+
const serviceWithoutEndpoint = new (class extends DyNTS_ApiService_Base {
|
|
113
|
+
get baseUrl(): string { return 'https://api.example.com'; }
|
|
114
|
+
get testEndpoint(): string { return ''; }
|
|
115
|
+
get connectingSystemName(): string { return 'TestSystem'; }
|
|
116
|
+
static getInstance() { return this.getSingletonInstance(); }
|
|
117
|
+
} as any)();
|
|
118
|
+
|
|
119
|
+
await expectAsync(
|
|
120
|
+
serviceWithoutEndpoint.testGet('issuer-123')
|
|
121
|
+
).toBeRejected();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_ArchiveDataService } from './archive-data.service';
|
|
3
|
+
import { DyFM_DataModel_Params, DyFM_Metadata, DyFM_Error } from '@futdevpro/fsm-dynamo';
|
|
4
|
+
import { DyNTS_GlobalService } from '../core/global.service';
|
|
5
|
+
import { DyNTS_DBService } from './db.service';
|
|
6
|
+
import { DyNTS_getArchivedDBName } from '../../_collections/archive.util';
|
|
7
|
+
|
|
8
|
+
class TestMetadata extends DyFM_Metadata {
|
|
9
|
+
name: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('| DyNTS_ArchiveDataService', () => {
|
|
13
|
+
let mockDataParams: DyFM_DataModel_Params<TestMetadata>;
|
|
14
|
+
let mockOriginalDBService: jasmine.SpyObj<DyNTS_DBService<TestMetadata>>;
|
|
15
|
+
let mockArchivedDBService: jasmine.SpyObj<DyNTS_DBService<TestMetadata>>;
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
mockDataParams = {
|
|
19
|
+
dataName: 'test_data',
|
|
20
|
+
addArchive: true,
|
|
21
|
+
constructed: () => true,
|
|
22
|
+
properties: {},
|
|
23
|
+
} as any;
|
|
24
|
+
|
|
25
|
+
mockOriginalDBService = jasmine.createSpyObj<DyNTS_DBService<TestMetadata>>('OriginalDBService', [
|
|
26
|
+
'getDataById',
|
|
27
|
+
'trueDeleteDataById',
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
mockArchivedDBService = jasmine.createSpyObj<DyNTS_DBService<TestMetadata>>('ArchivedDBService', [
|
|
31
|
+
'createData',
|
|
32
|
+
'getDataById',
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
spyOn(DyNTS_GlobalService, 'getDBService').and.returnValue(mockOriginalDBService);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('| should throw error when addArchive is missing from dataParams', () => {
|
|
39
|
+
const dataParamsWithoutArchive = {
|
|
40
|
+
...mockDataParams,
|
|
41
|
+
addArchive: false,
|
|
42
|
+
} as any;
|
|
43
|
+
|
|
44
|
+
const data = new TestMetadata();
|
|
45
|
+
|
|
46
|
+
expect(() => {
|
|
47
|
+
new DyNTS_ArchiveDataService(data, dataParamsWithoutArchive, 'issuer-123');
|
|
48
|
+
}).toThrowError('addArchive is missing from dataParams!');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('| should create service with archived data name', () => {
|
|
52
|
+
const data = new TestMetadata();
|
|
53
|
+
|
|
54
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
55
|
+
|
|
56
|
+
expect(service).toBeInstanceOf(DyNTS_ArchiveDataService);
|
|
57
|
+
expect(service.originalDBService).toBe(mockOriginalDBService);
|
|
58
|
+
expect(service.dataParams.dataName).toBe('test_data_archived');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe('| archiveDataById', () => {
|
|
62
|
+
it('| should throw error when id is missing', async () => {
|
|
63
|
+
const data = new TestMetadata();
|
|
64
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
65
|
+
|
|
66
|
+
await expectAsync(
|
|
67
|
+
service.archiveDataById('')
|
|
68
|
+
).toBeRejected();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('| should throw error when data not found', async () => {
|
|
72
|
+
const data = new TestMetadata();
|
|
73
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
74
|
+
mockOriginalDBService.getDataById.and.returnValue(Promise.resolve(null));
|
|
75
|
+
|
|
76
|
+
await expectAsync(
|
|
77
|
+
service.archiveDataById('non-existent-id')
|
|
78
|
+
).toBeRejected();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('| should archive data when found', async () => {
|
|
82
|
+
const data = new TestMetadata({ _id: 'test-id' });
|
|
83
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
84
|
+
mockOriginalDBService.getDataById.and.returnValue(Promise.resolve(data));
|
|
85
|
+
mockOriginalDBService.trueDeleteDataById.and.returnValue(Promise.resolve());
|
|
86
|
+
spyOn(service, 'archiveData').and.returnValue(Promise.resolve(data));
|
|
87
|
+
|
|
88
|
+
const result = await service.archiveDataById('test-id');
|
|
89
|
+
|
|
90
|
+
expect(mockOriginalDBService.getDataById).toHaveBeenCalledWith('test-id');
|
|
91
|
+
expect(service.archiveData).toHaveBeenCalledWith(data);
|
|
92
|
+
expect(result).toBe(data);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('| getDataByOriginalId', () => {
|
|
97
|
+
it('| should find data by original id', async () => {
|
|
98
|
+
const data = new TestMetadata();
|
|
99
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
100
|
+
const archivedData = new TestMetadata({ _originalId: 'original-id' });
|
|
101
|
+
spyOn(service, 'findData').and.returnValue(Promise.resolve(archivedData));
|
|
102
|
+
|
|
103
|
+
const result = await service.getDataByOriginalId('original-id');
|
|
104
|
+
|
|
105
|
+
expect(service.findData).toHaveBeenCalled();
|
|
106
|
+
expect(result).toBe(archivedData);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('| should throw error on find failure', async () => {
|
|
110
|
+
const data = new TestMetadata();
|
|
111
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
112
|
+
spyOn(service, 'findData').and.returnValue(Promise.reject(new Error('Find failed')));
|
|
113
|
+
|
|
114
|
+
await expectAsync(
|
|
115
|
+
service.getDataByOriginalId('original-id')
|
|
116
|
+
).toBeRejected();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe('| archiveData', () => {
|
|
121
|
+
it('| should throw error when originalId already exists', async () => {
|
|
122
|
+
const data = new TestMetadata({ _id: 'test-id', _originalId: 'existing-original-id' } as TestMetadata);
|
|
123
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
124
|
+
|
|
125
|
+
await expectAsync(
|
|
126
|
+
service.archiveData(data)
|
|
127
|
+
).toBeRejected();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('| should throw error when data is already archived', async () => {
|
|
131
|
+
const data = new TestMetadata({ _id: 'test-id', _archived: new Date() } as TestMetadata);
|
|
132
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
133
|
+
|
|
134
|
+
await expectAsync(
|
|
135
|
+
service.archiveData(data)
|
|
136
|
+
).toBeRejected();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('| should throw error when id is missing', async () => {
|
|
140
|
+
const data = new TestMetadata();
|
|
141
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
142
|
+
|
|
143
|
+
await expectAsync(
|
|
144
|
+
service.archiveData(data)
|
|
145
|
+
).toBeRejected();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('| should archive data successfully', async () => {
|
|
149
|
+
const data = new TestMetadata({ _id: 'test-id' });
|
|
150
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
151
|
+
mockOriginalDBService.trueDeleteDataById.and.returnValue(Promise.resolve());
|
|
152
|
+
spyOn(service, 'saveData').and.returnValue(Promise.resolve(data));
|
|
153
|
+
|
|
154
|
+
const result = await service.archiveData(data);
|
|
155
|
+
|
|
156
|
+
expect(mockOriginalDBService.trueDeleteDataById).toHaveBeenCalledWith('test-id');
|
|
157
|
+
expect(data._originalId).toBe('test-id');
|
|
158
|
+
expect(data._archived).toBeInstanceOf(Date);
|
|
159
|
+
expect(data._id).toBeUndefined();
|
|
160
|
+
expect(service.saveData).toHaveBeenCalled();
|
|
161
|
+
expect(result).toBe(data);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('| saveData', () => {
|
|
166
|
+
it('| should throw error when originalId is missing', async () => {
|
|
167
|
+
const data = new TestMetadata();
|
|
168
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
169
|
+
|
|
170
|
+
await expectAsync(
|
|
171
|
+
service.saveData(data)
|
|
172
|
+
).toBeRejected();
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('| should throw error when data is not archived', async () => {
|
|
176
|
+
const data = new TestMetadata({ _originalId: 'original-id' } as TestMetadata);
|
|
177
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
178
|
+
|
|
179
|
+
await expectAsync(
|
|
180
|
+
service.saveData(data)
|
|
181
|
+
).toBeRejected();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('| should save archived data successfully', async () => {
|
|
185
|
+
const data = new TestMetadata({ _originalId: 'original-id', _archived: new Date() } as TestMetadata);
|
|
186
|
+
const service = new DyNTS_ArchiveDataService(data, mockDataParams, 'issuer-123');
|
|
187
|
+
const parentSaveDataSpy = spyOn(Object.getPrototypeOf(DyNTS_ArchiveDataService.prototype), 'saveData').and.returnValue(Promise.resolve(data));
|
|
188
|
+
|
|
189
|
+
const result = await service.saveData(data);
|
|
190
|
+
|
|
191
|
+
expect(parentSaveDataSpy).toHaveBeenCalled();
|
|
192
|
+
expect(result).toBe(data);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|