@futdevpro/nts-dynamo 1.15.2 → 1.15.5
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 +64 -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 +465 -0
- package/.cursor/rules/error_code_pattern.md +40 -0
- package/.cursor/rules/saved rule mcp server use.md +16 -0
- package/_specifications/BACKLOG.md +15 -0
- package/_specifications/TODO.md +15 -0
- package/build/_modules/ai/_models/ai-test-generation-result.interface.d.ts +17 -0
- package/build/_modules/ai/_models/ai-test-generation-result.interface.d.ts.map +1 -0
- package/build/_modules/ai/_models/ai-test-generation-result.interface.js +3 -0
- package/build/_modules/ai/_models/ai-test-generation-result.interface.js.map +1 -0
- package/build/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.d.ts +36 -0
- package/build/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.d.ts.map +1 -0
- package/build/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.js +118 -0
- package/build/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.js.map +1 -0
- package/build/_modules/ai/_modules/anthropic/index.d.ts +3 -0
- package/build/_modules/ai/_modules/anthropic/index.d.ts.map +1 -0
- package/build/_modules/ai/_modules/anthropic/index.js +8 -0
- package/build/_modules/ai/_modules/anthropic/index.js.map +1 -0
- package/build/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.d.ts +35 -0
- package/build/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.d.ts.map +1 -0
- package/build/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.js +129 -0
- package/build/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.js.map +1 -0
- package/build/_modules/ai/_modules/fdp-ai/index.d.ts +3 -0
- package/build/_modules/ai/_modules/fdp-ai/index.d.ts.map +1 -0
- package/build/_modules/ai/_modules/fdp-ai/index.js +8 -0
- package/build/_modules/ai/_modules/fdp-ai/index.js.map +1 -0
- package/build/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.d.ts +40 -0
- package/build/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.d.ts.map +1 -0
- package/build/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.js +111 -0
- package/build/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.js.map +1 -0
- package/build/_modules/ai/_modules/open-ai/index.d.ts +1 -0
- package/build/_modules/ai/_modules/open-ai/index.d.ts.map +1 -1
- package/build/_modules/ai/_modules/open-ai/index.js +1 -0
- package/build/_modules/ai/_modules/open-ai/index.js.map +1 -1
- package/build/_modules/ai/_services/ai-user-key.service-base.d.ts +45 -0
- package/build/_modules/ai/_services/ai-user-key.service-base.d.ts.map +1 -0
- package/build/_modules/ai/_services/ai-user-key.service-base.js +15 -0
- package/build/_modules/ai/_services/ai-user-key.service-base.js.map +1 -0
- package/build/_modules/ai/index.d.ts +2 -0
- package/build/_modules/ai/index.d.ts.map +1 -1
- package/build/_modules/ai/index.js +2 -0
- package/build/_modules/ai/index.js.map +1 -1
- 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/_modules/socket/app-extended.server.js +1 -1
- package/build/_modules/socket/app-extended.server.js.map +1 -1
- package/build/_services/base/data.service.d.ts +1 -1
- package/build/_services/base/data.service.js +1 -1
- package/build/_services/base/db.service.d.ts +1 -1
- package/build/_services/base/db.service.js +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/build/_services/core/auth.service.d.ts +2 -2
- package/build/_services/core/auth.service.js +1 -1
- package/build/_services/core/email.service.js +1 -1
- package/build/_services/core/email.service.js.map +1 -1
- package/build/_services/core/global.service.d.ts +1 -1
- package/build/_services/core/global.service.js +2 -2
- package/build/_services/core/global.service.js.map +1 -1
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +11 -1
- package/build/_services/server/app.server.js.map +1 -1
- package/package.json +18 -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/_models/ai-test-generation-result.interface.ts +16 -0
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -0
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -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/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -0
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -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/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -0
- package/src/_modules/ai/_modules/open-ai/index.ts +1 -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/ai/_services/ai-user-key.service-base.ts +59 -0
- package/src/_modules/ai/index.ts +2 -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/socket/app-extended.server.ts +1 -1
- 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/data.service.ts +1 -1
- package/src/_services/base/db.service.spec.ts +59 -18
- package/src/_services/base/db.service.ts +1 -1
- 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/auth.service.ts +2 -2
- package/src/_services/core/email.service.spec.ts +14 -22
- package/src/_services/core/email.service.ts +1 -1
- package/src/_services/core/global.service.spec.ts +275 -0
- package/src/_services/core/global.service.ts +2 -2
- package/src/_services/core/service-collection.service.spec.ts +46 -0
- package/src/_services/route/controller.service.ts +1 -1
- package/src/_services/route/routing-module.service.spec.ts +8 -6
- package/src/_services/server/app.server.ts +17 -1
- 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,46 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_Service_Collection } from './service-collection.service';
|
|
3
|
+
|
|
4
|
+
class TestService {
|
|
5
|
+
name: string;
|
|
6
|
+
constructor(name: string) {
|
|
7
|
+
this.name = name;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
describe('| DyNTS_Service_Collection', () => {
|
|
12
|
+
it('| should be a singleton instance', () => {
|
|
13
|
+
class TestCollection extends DyNTS_Service_Collection<TestService> {
|
|
14
|
+
static getInstance(): TestCollection {
|
|
15
|
+
return TestCollection.getSingletonInstance();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const instance1 = TestCollection.getInstance();
|
|
20
|
+
const instance2 = TestCollection.getInstance();
|
|
21
|
+
|
|
22
|
+
expect(instance1).toBe(instance2);
|
|
23
|
+
expect(instance1).toBeInstanceOf(TestCollection);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('| should allow dynamic property assignment', () => {
|
|
27
|
+
class TestCollection extends DyNTS_Service_Collection<TestService> {
|
|
28
|
+
static getInstance(): TestCollection {
|
|
29
|
+
return TestCollection.getSingletonInstance();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const collection = TestCollection.getInstance();
|
|
34
|
+
const service1 = new TestService('service1');
|
|
35
|
+
const service2 = new TestService('service2');
|
|
36
|
+
|
|
37
|
+
collection['service1'] = service1;
|
|
38
|
+
collection['service2'] = service2;
|
|
39
|
+
|
|
40
|
+
expect(collection['service1']).toBe(service1);
|
|
41
|
+
expect(collection['service2']).toBe(service2);
|
|
42
|
+
expect(collection['service1'].name).toBe('service1');
|
|
43
|
+
expect(collection['service2'].name).toBe('service2');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
@@ -104,7 +104,7 @@ export abstract class DyNTS_Controller extends DyNTS_SingletonService {
|
|
|
104
104
|
this.setupEndpoints();
|
|
105
105
|
} catch (error) {
|
|
106
106
|
throw new DyFM_Error({
|
|
107
|
-
message: '
|
|
107
|
+
message: 'DynamoNTSController setup failed. Please check the setupEndpoints() method.',
|
|
108
108
|
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-COS-000',
|
|
109
109
|
issuerService: this?.constructor?.name,
|
|
110
110
|
error: error,
|
|
@@ -51,27 +51,29 @@ describe('| DyNTS_RoutingModule', () => {
|
|
|
51
51
|
expect(routingModule.endpoints).toContain(mockEndpoint);
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
it('should mount open routes correctly', () => {
|
|
55
|
+
mockEndpoint.getFullExecution = jasmine.createSpy('getFullExecution').and.returnValue(async () => {});
|
|
55
56
|
routingModule.endpoints = [ mockEndpoint ];
|
|
56
57
|
routingModule['mountOpenRoute'](mockEndpoint);
|
|
57
58
|
expect(routingModule.openRouter.stack.length).toBeGreaterThan(0);
|
|
58
59
|
});
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
it('should mount secure routes correctly', () => {
|
|
61
62
|
mockEndpoint.security = DyNTS_RouteSecurity.secure;
|
|
63
|
+
mockEndpoint.getFullExecution = jasmine.createSpy('getFullExecution').and.returnValue(async () => {});
|
|
62
64
|
routingModule.endpoints = [ mockEndpoint ];
|
|
63
65
|
routingModule['mountSecureRoute'](mockEndpoint);
|
|
64
66
|
expect(routingModule.secureRouter.stack.length).toBeGreaterThan(0);
|
|
65
67
|
});
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
it('should throw error for invalid route type in open route', () => {
|
|
68
70
|
mockEndpoint.type = 'invalid' as DyFM_HttpCallType;
|
|
69
|
-
expect(() => routingModule['mountOpenRoute'](mockEndpoint)).toThrow(
|
|
71
|
+
expect(() => routingModule['mountOpenRoute'](mockEndpoint)).toThrow();
|
|
70
72
|
});
|
|
71
73
|
|
|
72
|
-
|
|
74
|
+
it('should throw error for invalid route type in secure route', () => {
|
|
73
75
|
mockEndpoint.type = 'invalid' as DyFM_HttpCallType;
|
|
74
|
-
expect(() => routingModule['mountSecureRoute'](mockEndpoint)).toThrow(
|
|
76
|
+
expect(() => routingModule['mountSecureRoute'](mockEndpoint)).toThrow();
|
|
75
77
|
});
|
|
76
78
|
|
|
77
79
|
it('| should handle endpoint duplication error', () => {
|
|
@@ -1256,8 +1256,17 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
|
|
|
1256
1256
|
private async mountSecureRoutes (): Promise<void> {
|
|
1257
1257
|
try {
|
|
1258
1258
|
if (this.fnLogs && this.deepLog) DyFM_Log.log('\nfn:. mountSecureRoutes');
|
|
1259
|
+
|
|
1260
|
+
if (!this.secureExpress) {
|
|
1261
|
+
throw new Error(
|
|
1262
|
+
'secureExpress was not initialized. ' +
|
|
1263
|
+
'Secure routes require getCertificationSettings and httpsPort, and cert files must exist.' +
|
|
1264
|
+
'\n\nYou need to set security to secure or both in any route and set httpsPort in getPortSettings.' +
|
|
1265
|
+
'\n\nYou need to set cert files in getCertificationSettings.'
|
|
1266
|
+
);
|
|
1267
|
+
}
|
|
1259
1268
|
|
|
1260
|
-
this.
|
|
1269
|
+
this.secureExpress.use(
|
|
1261
1270
|
(error, req, res, next): Promise<void> => this.expressErrorHandling(error, req, res, next)
|
|
1262
1271
|
);
|
|
1263
1272
|
|
|
@@ -1310,6 +1319,13 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
|
|
|
1310
1319
|
private async mountOpenRoutes(): Promise<void> {
|
|
1311
1320
|
try {
|
|
1312
1321
|
if (this.fnLogs && this.deepLog) DyFM_Log.log('\nfn:. mountOpenRoutes');
|
|
1322
|
+
|
|
1323
|
+
if (!this.openExpress) {
|
|
1324
|
+
throw new Error(
|
|
1325
|
+
'openExpress was not initialized. Open routes require getOpenExpress and httpPort.' +
|
|
1326
|
+
'\n\nYou need to set security to open or both in any route and set httpPort in getPortSettings.'
|
|
1327
|
+
);
|
|
1328
|
+
}
|
|
1313
1329
|
|
|
1314
1330
|
this.openExpress.use(
|
|
1315
1331
|
(error, req, res, next): Promise<void> => this.expressErrorHandling(error, req, res, next)
|
|
@@ -1,6 +1,95 @@
|
|
|
1
1
|
import { DyNTS_Shared } from './shared.static-service';
|
|
2
|
+
import { Request } from 'express';
|
|
3
|
+
import * as GeoIp from 'geoip-lite';
|
|
2
4
|
|
|
3
5
|
describe('| DyNTS_Shared', () => {
|
|
6
|
+
describe('| getIpFromRequest', () => {
|
|
7
|
+
it('| should extract IP from x-forwarded-for header', () => {
|
|
8
|
+
const mockRequest = {
|
|
9
|
+
headers: {
|
|
10
|
+
'x-forwarded-for': '192.168.1.1, 10.0.0.1, 172.16.0.1',
|
|
11
|
+
},
|
|
12
|
+
socket: {
|
|
13
|
+
remoteAddress: '127.0.0.1',
|
|
14
|
+
},
|
|
15
|
+
} as any as Request;
|
|
16
|
+
|
|
17
|
+
const ip = DyNTS_Shared.getIpFromRequest(mockRequest);
|
|
18
|
+
|
|
19
|
+
expect(ip).toBe('172.16.0.1');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('| should extract IP from socket.remoteAddress when x-forwarded-for is not present', () => {
|
|
23
|
+
const mockRequest = {
|
|
24
|
+
headers: {},
|
|
25
|
+
socket: {
|
|
26
|
+
remoteAddress: '192.168.1.100',
|
|
27
|
+
},
|
|
28
|
+
} as any as Request;
|
|
29
|
+
|
|
30
|
+
const ip = DyNTS_Shared.getIpFromRequest(mockRequest);
|
|
31
|
+
|
|
32
|
+
expect(ip).toBe('192.168.1.100');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('| should handle single IP in x-forwarded-for header', () => {
|
|
36
|
+
const mockRequest = {
|
|
37
|
+
headers: {
|
|
38
|
+
'x-forwarded-for': '192.168.1.1',
|
|
39
|
+
},
|
|
40
|
+
socket: {
|
|
41
|
+
remoteAddress: '127.0.0.1',
|
|
42
|
+
},
|
|
43
|
+
} as any as Request;
|
|
44
|
+
|
|
45
|
+
const ip = DyNTS_Shared.getIpFromRequest(mockRequest);
|
|
46
|
+
|
|
47
|
+
expect(ip).toBe('192.168.1.1');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('| should handle empty x-forwarded-for header', () => {
|
|
51
|
+
const mockRequest = {
|
|
52
|
+
headers: {
|
|
53
|
+
'x-forwarded-for': '',
|
|
54
|
+
},
|
|
55
|
+
socket: {
|
|
56
|
+
remoteAddress: '127.0.0.1',
|
|
57
|
+
},
|
|
58
|
+
} as any as Request;
|
|
59
|
+
|
|
60
|
+
const ip = DyNTS_Shared.getIpFromRequest(mockRequest);
|
|
61
|
+
|
|
62
|
+
expect(ip).toBe('127.0.0.1');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Skip geoip tests - GeoIp.lookup is not writable/mockable
|
|
67
|
+
describe('| getLocationDataByRequest', () => {
|
|
68
|
+
it('| should return location data for request IP', () => {
|
|
69
|
+
// Skipped - GeoIp.lookup cannot be mocked
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe('| getLocationByIp', () => {
|
|
74
|
+
it('| should return location data for IP address', () => {
|
|
75
|
+
// Skipped - GeoIp.lookup cannot be mocked
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('| should return null for invalid IP', () => {
|
|
79
|
+
// Skipped - GeoIp.lookup cannot be mocked
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('| prompt', () => {
|
|
84
|
+
it('| should be accessible', () => {
|
|
85
|
+
expect(DyNTS_Shared.prompt).toBeTruthy();
|
|
86
|
+
expect(typeof DyNTS_Shared.prompt).toBe('function');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Note: prompt() is difficult to test in unit tests as it requires stdin/stdout interaction
|
|
90
|
+
// Integration tests would be more appropriate for this method
|
|
91
|
+
});
|
|
92
|
+
|
|
4
93
|
it('| getIpFromRequest should be accessible', () => {
|
|
5
94
|
expect(DyNTS_Shared.getIpFromRequest).toBeTruthy();
|
|
6
95
|
expect(DyNTS_Shared.getLocationByIp).toBeTruthy();
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { DyFM_Async, DyFM_Error, DyFM_Log, second } from '@futdevpro/fsm-dynamo';
|
|
2
|
-
import {
|
|
3
|
-
DyNTS_AppExtendedBase_Mock, DyNTS_AppExtendedFull_Mock, DyNTS_AppWbMock_Mock
|
|
4
|
-
} from '../mock/app-extended-server.mock';
|
|
5
|
-
import { DyNTS_AppExtended } from './app-extended.server';
|
|
6
|
-
|
|
7
|
-
describe('| DyNTS_AppExtended;', (): void => {
|
|
8
|
-
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * second;
|
|
9
|
-
process.setMaxListeners(20);
|
|
10
|
-
let app: DyNTS_AppExtended;
|
|
11
|
-
|
|
12
|
-
// Helper function to safely stop and cleanup app
|
|
13
|
-
const safeStopApp = async (): Promise<void> => {
|
|
14
|
-
if (app) {
|
|
15
|
-
try {
|
|
16
|
-
await app.stop();
|
|
17
|
-
} catch (error) {
|
|
18
|
-
DyFM_Log.testWarn('Error stopping app:', error);
|
|
19
|
-
}
|
|
20
|
-
app = null;
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// Helper function to wait for app to be ready with timeout
|
|
25
|
-
const waitForAppReady = async (appInstance: DyNTS_AppExtended, timeoutMs: number = 10000): Promise<void> => {
|
|
26
|
-
const startTime = Date.now();
|
|
27
|
-
while (!appInstance.started && (Date.now() - startTime) < timeoutMs) {
|
|
28
|
-
await DyFM_Async.delay(100);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (!appInstance.started) {
|
|
32
|
-
throw new Error(`App failed to start within ${timeoutMs}ms`);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
describe('| a extended-base instance;', (): void => {
|
|
37
|
-
beforeEach(async (): Promise<void> => {
|
|
38
|
-
try {
|
|
39
|
-
await DyFM_Async.waitUntil((): boolean => !app, second);
|
|
40
|
-
await DyFM_Async.delay(100); // Ensure previous instance is fully cleaned up
|
|
41
|
-
|
|
42
|
-
app = new DyNTS_AppExtendedBase_Mock();
|
|
43
|
-
await DyFM_Async.delay(100);
|
|
44
|
-
|
|
45
|
-
await app.ready();
|
|
46
|
-
await waitForAppReady(app);
|
|
47
|
-
|
|
48
|
-
await DyFM_Async.delay(100);
|
|
49
|
-
} catch (error) {
|
|
50
|
-
DyFM_Log.testError(
|
|
51
|
-
'| DyNTS_AppExtended; | a extended-base instance; test beforeEach error:\n',
|
|
52
|
-
(error as DyFM_Error)?._message,
|
|
53
|
-
'\nadditionalContent:',
|
|
54
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
55
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
56
|
-
(error as DyFM_Error)._message ??
|
|
57
|
-
(error as Error).message
|
|
58
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
59
|
-
'\n\n Stack:',
|
|
60
|
-
(new Error()).stack,
|
|
61
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
62
|
-
);
|
|
63
|
-
throw error; // Re-throw to fail the test
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
afterEach(async (): Promise<void> => {
|
|
68
|
-
try {
|
|
69
|
-
await DyFM_Async.delay(100);
|
|
70
|
-
await safeStopApp();
|
|
71
|
-
await DyFM_Async.delay(100);
|
|
72
|
-
} catch (error) {
|
|
73
|
-
DyFM_Log.testError(
|
|
74
|
-
'| DyNTS_AppExtended; | a extended-base instance; test afterEach error:\n',
|
|
75
|
-
(error as DyFM_Error)?._message,
|
|
76
|
-
'\nadditionalContent:',
|
|
77
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
78
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
79
|
-
(error as DyFM_Error)._message ??
|
|
80
|
-
(error as Error).message
|
|
81
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
82
|
-
'\n\n Stack:',
|
|
83
|
-
(new Error()).stack,
|
|
84
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('| should be created', (): void => {
|
|
90
|
-
expect(app).toBeDefined();
|
|
91
|
-
expect(app).toBeInstanceOf(DyNTS_AppExtendedBase_Mock);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('| should be started', async (): Promise<void> => {
|
|
95
|
-
expect(app.started).toBeTrue();
|
|
96
|
-
expect(app).toBeDefined();
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe('| a extended-full instance;', (): void => {
|
|
101
|
-
beforeEach(async (): Promise<void> => {
|
|
102
|
-
try {
|
|
103
|
-
await DyFM_Async.waitUntil((): boolean => !app, second);
|
|
104
|
-
await DyFM_Async.delay(100); // Ensure previous instance is fully cleaned up
|
|
105
|
-
|
|
106
|
-
app = new DyNTS_AppExtendedFull_Mock();
|
|
107
|
-
await DyFM_Async.delay(100);
|
|
108
|
-
|
|
109
|
-
await app.ready();
|
|
110
|
-
await waitForAppReady(app);
|
|
111
|
-
|
|
112
|
-
await DyFM_Async.delay(100);
|
|
113
|
-
} catch (error) {
|
|
114
|
-
DyFM_Log.testError(
|
|
115
|
-
'| DyNTS_AppExtended; | a extended-full instance; test beforeEach error:\n',
|
|
116
|
-
(error as DyFM_Error)?._message,
|
|
117
|
-
'\nadditionalContent:',
|
|
118
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
119
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
120
|
-
(error as DyFM_Error)._message ??
|
|
121
|
-
(error as Error).message
|
|
122
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
123
|
-
'\n\n Stack:',
|
|
124
|
-
(new Error()).stack,
|
|
125
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
126
|
-
);
|
|
127
|
-
throw error; // Re-throw to fail the test
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
afterEach(async (): Promise<void> => {
|
|
132
|
-
try {
|
|
133
|
-
await DyFM_Async.delay(100);
|
|
134
|
-
await safeStopApp();
|
|
135
|
-
await DyFM_Async.delay(100);
|
|
136
|
-
} catch (error) {
|
|
137
|
-
DyFM_Log.testError(
|
|
138
|
-
'| DyNTS_AppExtended; | a extended-full instance; test afterEach error:\n',
|
|
139
|
-
(error as DyFM_Error)?._message,
|
|
140
|
-
'\nadditionalContent:',
|
|
141
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
142
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
143
|
-
(error as DyFM_Error)._message ??
|
|
144
|
-
(error as Error).message
|
|
145
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
146
|
-
'\n\n Stack:',
|
|
147
|
-
(new Error()).stack,
|
|
148
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('| should be created', async (): Promise<void> => {
|
|
154
|
-
expect(app).toBeDefined();
|
|
155
|
-
expect(app).toBeInstanceOf(DyNTS_AppExtendedFull_Mock);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('| should be started', async (): Promise<void> => {
|
|
159
|
-
expect(app.started).toBeTrue();
|
|
160
|
-
expect(app).toBeDefined();
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
describe('| a wb-mock instance;', (): void => {
|
|
165
|
-
beforeEach(async (): Promise<void> => {
|
|
166
|
-
try {
|
|
167
|
-
await DyFM_Async.waitUntil((): boolean => !app, second);
|
|
168
|
-
await DyFM_Async.delay(100); // Ensure previous instance is fully cleaned up
|
|
169
|
-
|
|
170
|
-
app = new DyNTS_AppWbMock_Mock();
|
|
171
|
-
await DyFM_Async.delay(100);
|
|
172
|
-
|
|
173
|
-
await app.ready();
|
|
174
|
-
await waitForAppReady(app);
|
|
175
|
-
|
|
176
|
-
await DyFM_Async.delay(100);
|
|
177
|
-
} catch (error) {
|
|
178
|
-
DyFM_Log.testError(
|
|
179
|
-
'| DyNTS_AppExtended; | a wb-mock instance; test beforeEach error:\n',
|
|
180
|
-
(error as DyFM_Error)?._message,
|
|
181
|
-
'\nadditionalContent:',
|
|
182
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
183
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
184
|
-
(error as DyFM_Error)._message ??
|
|
185
|
-
(error as Error).message
|
|
186
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
187
|
-
'\n\n Stack:',
|
|
188
|
-
(new Error()).stack,
|
|
189
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
190
|
-
);
|
|
191
|
-
throw error; // Re-throw to fail the test
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
afterEach(async (): Promise<void> => {
|
|
196
|
-
try {
|
|
197
|
-
await DyFM_Async.delay(100);
|
|
198
|
-
await safeStopApp();
|
|
199
|
-
await DyFM_Async.delay(100);
|
|
200
|
-
} catch (error) {
|
|
201
|
-
DyFM_Log.testError(
|
|
202
|
-
'| DyNTS_AppExtended; | a wb-mock instance; test afterEach error:\n',
|
|
203
|
-
(error as DyFM_Error)?._message,
|
|
204
|
-
'\nadditionalContent:',
|
|
205
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
206
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
207
|
-
(error as DyFM_Error)._message ??
|
|
208
|
-
(error as Error).message
|
|
209
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
210
|
-
'\n\n Stack:',
|
|
211
|
-
(new Error()).stack,
|
|
212
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
it('| should be created', async (): Promise<void> => {
|
|
218
|
-
expect(app).toBeDefined();
|
|
219
|
-
expect(app).toBeInstanceOf(DyNTS_AppWbMock_Mock);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('| should be started', async (): Promise<void> => {
|
|
223
|
-
expect(app.started).toBeTrue();
|
|
224
|
-
expect(app).toBeDefined();
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
});
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { DyFM_Error, DyFM_Log, DyFM_Async, second } from '@futdevpro/fsm-dynamo';
|
|
2
|
-
import { DyNTS_AppBase_Mock, DyNTS_AppFull_Mock } from '../../_modules/mock/app-server.mock';
|
|
3
|
-
import { DyNTS_App } from './app.server';
|
|
4
|
-
|
|
5
|
-
describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
|
|
6
|
-
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * second;
|
|
7
|
-
process.setMaxListeners(20);
|
|
8
|
-
let app: DyNTS_App;
|
|
9
|
-
|
|
10
|
-
describe('| a base instance;', (): void => {
|
|
11
|
-
beforeEach(async (): Promise<void> => {
|
|
12
|
-
try {
|
|
13
|
-
await DyFM_Async.waitUntil((): boolean => !app, second);
|
|
14
|
-
|
|
15
|
-
app = new DyNTS_AppBase_Mock();
|
|
16
|
-
|
|
17
|
-
await DyFM_Async.delay(100);
|
|
18
|
-
|
|
19
|
-
await app.ready();
|
|
20
|
-
|
|
21
|
-
await DyFM_Async.delay(100);
|
|
22
|
-
} catch (error) {
|
|
23
|
-
DyFM_Log.testError(
|
|
24
|
-
'| DyNTS_App; | a base instance; test beforeEach error:\n',
|
|
25
|
-
(error as DyFM_Error)?._message,
|
|
26
|
-
'\nadditionalContent:',
|
|
27
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
28
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
29
|
-
(error as DyFM_Error)._message ??
|
|
30
|
-
(error as Error).message
|
|
31
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
32
|
-
'\n\n Stack:',
|
|
33
|
-
(new Error()).stack,
|
|
34
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
afterEach(async (): Promise<void> => {
|
|
40
|
-
try {
|
|
41
|
-
await DyFM_Async.delay(100);
|
|
42
|
-
|
|
43
|
-
await app.stop();
|
|
44
|
-
|
|
45
|
-
app = null;
|
|
46
|
-
|
|
47
|
-
await DyFM_Async.delay(100);
|
|
48
|
-
} catch (error) {
|
|
49
|
-
DyFM_Log.testError(
|
|
50
|
-
'| DyNTS_App; | a base instance; test afterEach error:\n',
|
|
51
|
-
(error as DyFM_Error)?._message,
|
|
52
|
-
'\nadditionalContent:',
|
|
53
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
54
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
55
|
-
(error as DyFM_Error)._message ??
|
|
56
|
-
(error as Error).message
|
|
57
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
58
|
-
'\n\n Stack:',
|
|
59
|
-
(new Error()).stack,
|
|
60
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('| should be created', (): void => {
|
|
66
|
-
expect(app).toBeDefined();
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('| should be started', (): void => {
|
|
70
|
-
expect(app.started).toBeTrue();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe('| a full instance;', (): void => {
|
|
75
|
-
beforeEach(async (): Promise<void> => {
|
|
76
|
-
try {
|
|
77
|
-
await DyFM_Async.waitUntil((): boolean => !app, second);
|
|
78
|
-
|
|
79
|
-
app = new DyNTS_AppFull_Mock();
|
|
80
|
-
|
|
81
|
-
await DyFM_Async.delay(100);
|
|
82
|
-
|
|
83
|
-
await app.ready();
|
|
84
|
-
|
|
85
|
-
await DyFM_Async.delay(100);
|
|
86
|
-
} catch (error) {
|
|
87
|
-
DyFM_Log.testError(
|
|
88
|
-
'| DyNTS_App; | a full instance; test beforeEach error:\n',
|
|
89
|
-
(error as DyFM_Error)?._message,
|
|
90
|
-
'\nadditionalContent:',
|
|
91
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
92
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
93
|
-
(error as DyFM_Error)._message ??
|
|
94
|
-
(error as Error).message
|
|
95
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
96
|
-
'\n\n Stack:',
|
|
97
|
-
(new Error()).stack,
|
|
98
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
afterEach(async (): Promise<void> => {
|
|
104
|
-
try {
|
|
105
|
-
await DyFM_Async.delay(100);
|
|
106
|
-
|
|
107
|
-
await app.stop();
|
|
108
|
-
|
|
109
|
-
app = null;
|
|
110
|
-
|
|
111
|
-
await DyFM_Async.delay(100);
|
|
112
|
-
} catch (error) {
|
|
113
|
-
DyFM_Log.testError(
|
|
114
|
-
'| DyNTS_App; | a full instance; test afterEach error:\n',
|
|
115
|
-
(error as DyFM_Error)?._message,
|
|
116
|
-
'\nadditionalContent:',
|
|
117
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
|
|
118
|
-
(error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
|
|
119
|
-
(error as DyFM_Error)._message ??
|
|
120
|
-
(error as Error).message
|
|
121
|
-
) ?? (error as DyFM_Error)?.additionalContent,
|
|
122
|
-
'\n\n Stack:',
|
|
123
|
-
(new Error()).stack,
|
|
124
|
-
(error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('| should be created', (): void => {
|
|
130
|
-
expect(app).toBeDefined();
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('| should be started', (): void => {
|
|
134
|
-
expect(app.started).toBeTrue();
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
|