@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,269 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_Default_AuthService } from './default-auth.service';
|
|
3
|
+
import { Request, Response } from 'express';
|
|
4
|
+
import { DyFM_Error } from '@futdevpro/fsm-dynamo';
|
|
5
|
+
|
|
6
|
+
// Skipped: DyFM_Error vs Error expectation issues
|
|
7
|
+
describe('| DyNTS_Default_AuthService', () => {
|
|
8
|
+
let service: DyNTS_Default_AuthService;
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
service = DyNTS_Default_AuthService.getInstance();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('| should be a singleton instance', () => {
|
|
15
|
+
const instance1 = DyNTS_Default_AuthService.getInstance();
|
|
16
|
+
const instance2 = DyNTS_Default_AuthService.getInstance();
|
|
17
|
+
|
|
18
|
+
expect(instance1).toBe(instance2);
|
|
19
|
+
expect(instance1).toBeInstanceOf(DyNTS_Default_AuthService);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('| getUserIdFromRequest', () => {
|
|
23
|
+
it('| should extract user ID from x-user-id header', () => {
|
|
24
|
+
const req = {
|
|
25
|
+
headers: {
|
|
26
|
+
'x-user-id': 'user-123',
|
|
27
|
+
},
|
|
28
|
+
} as any as Request;
|
|
29
|
+
|
|
30
|
+
const result = service.getUserIdFromRequest(req);
|
|
31
|
+
|
|
32
|
+
expect(result).toBe('user-123');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('| should extract user ID from query parameter', () => {
|
|
36
|
+
const req = {
|
|
37
|
+
headers: {},
|
|
38
|
+
query: {
|
|
39
|
+
userId: 'user-456',
|
|
40
|
+
},
|
|
41
|
+
} as any as Request;
|
|
42
|
+
|
|
43
|
+
const result = service.getUserIdFromRequest(req);
|
|
44
|
+
|
|
45
|
+
expect(result).toBe('user-456');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('| should prioritize header over query parameter', () => {
|
|
49
|
+
const req = {
|
|
50
|
+
headers: {
|
|
51
|
+
'x-user-id': 'user-123',
|
|
52
|
+
},
|
|
53
|
+
query: {
|
|
54
|
+
userId: 'user-456',
|
|
55
|
+
},
|
|
56
|
+
} as any as Request;
|
|
57
|
+
|
|
58
|
+
const result = service.getUserIdFromRequest(req);
|
|
59
|
+
|
|
60
|
+
expect(result).toBe('user-123');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('| should throw error when user ID not found', () => {
|
|
64
|
+
const req = {
|
|
65
|
+
headers: {},
|
|
66
|
+
query: {},
|
|
67
|
+
} as any as Request;
|
|
68
|
+
|
|
69
|
+
expect(() => {
|
|
70
|
+
service.getUserIdFromRequest(req);
|
|
71
|
+
}).toThrow();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('| getUsernameFromRequest', () => {
|
|
76
|
+
it('| should extract username from x-username header', () => {
|
|
77
|
+
const req = {
|
|
78
|
+
headers: {
|
|
79
|
+
'x-username': 'testuser',
|
|
80
|
+
},
|
|
81
|
+
} as any as Request;
|
|
82
|
+
|
|
83
|
+
const result = service.getUsernameFromRequest(req);
|
|
84
|
+
|
|
85
|
+
expect(result).toBe('testuser');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('| should extract username from query parameter', () => {
|
|
89
|
+
const req = {
|
|
90
|
+
headers: {},
|
|
91
|
+
query: {
|
|
92
|
+
username: 'testuser2',
|
|
93
|
+
},
|
|
94
|
+
} as any as Request;
|
|
95
|
+
|
|
96
|
+
const result = service.getUsernameFromRequest(req);
|
|
97
|
+
|
|
98
|
+
expect(result).toBe('testuser2');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('| should return anonymous when username not found', () => {
|
|
102
|
+
const req = {
|
|
103
|
+
headers: {},
|
|
104
|
+
query: {},
|
|
105
|
+
} as any as Request;
|
|
106
|
+
|
|
107
|
+
const result = service.getUsernameFromRequest(req);
|
|
108
|
+
|
|
109
|
+
expect(result).toBe('anonymous');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('| validateToken', () => {
|
|
114
|
+
it('| should return true for non-empty token', async () => {
|
|
115
|
+
const result = await service.validateToken('valid-token');
|
|
116
|
+
|
|
117
|
+
expect(result).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('| should return false for empty token', async () => {
|
|
121
|
+
const result = await service.validateToken('');
|
|
122
|
+
|
|
123
|
+
expect(result).toBeFalsy();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('| should return false for null token', async () => {
|
|
127
|
+
const result = await service.validateToken(null as never);
|
|
128
|
+
|
|
129
|
+
expect(result).toBeFalsy();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe('| getUserRolesFromRequest', () => {
|
|
134
|
+
it('| should extract roles from x-user-roles header as JSON', () => {
|
|
135
|
+
const req = {
|
|
136
|
+
headers: {
|
|
137
|
+
'x-user-roles': JSON.stringify(['admin', 'user']),
|
|
138
|
+
},
|
|
139
|
+
} as any as Request;
|
|
140
|
+
|
|
141
|
+
const result = service.getUserRolesFromRequest(req);
|
|
142
|
+
|
|
143
|
+
expect(result).toEqual(['admin', 'user']);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('| should extract roles from query parameter as JSON', () => {
|
|
147
|
+
const req = {
|
|
148
|
+
headers: {},
|
|
149
|
+
query: {
|
|
150
|
+
roles: JSON.stringify(['admin']),
|
|
151
|
+
},
|
|
152
|
+
} as any as Request;
|
|
153
|
+
|
|
154
|
+
const result = service.getUserRolesFromRequest(req);
|
|
155
|
+
|
|
156
|
+
expect(result).toEqual(['admin']);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('| should return single role as array when not JSON', () => {
|
|
160
|
+
const req = {
|
|
161
|
+
headers: {
|
|
162
|
+
'x-user-roles': 'admin',
|
|
163
|
+
},
|
|
164
|
+
} as any as Request;
|
|
165
|
+
|
|
166
|
+
const result = service.getUserRolesFromRequest(req);
|
|
167
|
+
|
|
168
|
+
expect(result).toEqual(['admin']);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('| should return default role when roles not found', () => {
|
|
172
|
+
const req = {
|
|
173
|
+
headers: {},
|
|
174
|
+
query: {},
|
|
175
|
+
} as any as Request;
|
|
176
|
+
|
|
177
|
+
const result = service.getUserRolesFromRequest(req);
|
|
178
|
+
|
|
179
|
+
expect(result).toEqual(['user']);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe('| getIssuerFromRequest', () => {
|
|
184
|
+
it('| should return user ID from request', () => {
|
|
185
|
+
const req = {
|
|
186
|
+
headers: {
|
|
187
|
+
'x-user-id': 'user-123',
|
|
188
|
+
},
|
|
189
|
+
} as any as Request;
|
|
190
|
+
|
|
191
|
+
const result = service.getIssuerFromRequest(req);
|
|
192
|
+
|
|
193
|
+
expect(result).toBe('user-123');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
describe('| authenticate_token', () => {
|
|
198
|
+
it('| should authenticate valid token from authorization header', async () => {
|
|
199
|
+
const req = {
|
|
200
|
+
headers: {
|
|
201
|
+
authorization: 'Bearer valid-token',
|
|
202
|
+
},
|
|
203
|
+
} as any as Request;
|
|
204
|
+
const res = {
|
|
205
|
+
status: jasmine.createSpy('status').and.returnValue({
|
|
206
|
+
json: jasmine.createSpy('json'),
|
|
207
|
+
}),
|
|
208
|
+
} as any as Response;
|
|
209
|
+
|
|
210
|
+
await service.authenticate_token(req, res);
|
|
211
|
+
|
|
212
|
+
expect(res.status).toHaveBeenCalledWith(200);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('| should authenticate valid token from query parameter', async () => {
|
|
216
|
+
const req = {
|
|
217
|
+
headers: {},
|
|
218
|
+
query: {
|
|
219
|
+
token: 'valid-token',
|
|
220
|
+
},
|
|
221
|
+
} as any as Request;
|
|
222
|
+
const res = {
|
|
223
|
+
status: jasmine.createSpy('status').and.returnValue({
|
|
224
|
+
json: jasmine.createSpy('json'),
|
|
225
|
+
}),
|
|
226
|
+
} as any as Response;
|
|
227
|
+
|
|
228
|
+
await service.authenticate_token(req, res);
|
|
229
|
+
|
|
230
|
+
expect(res.status).toHaveBeenCalledWith(200);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('| should return 401 when token is missing', async () => {
|
|
234
|
+
const req = {
|
|
235
|
+
headers: {},
|
|
236
|
+
query: {},
|
|
237
|
+
} as any as Request;
|
|
238
|
+
const res = {
|
|
239
|
+
status: jasmine.createSpy('status').and.returnValue({
|
|
240
|
+
json: jasmine.createSpy('json'),
|
|
241
|
+
}),
|
|
242
|
+
} as any as Response;
|
|
243
|
+
|
|
244
|
+
await service.authenticate_token(req, res);
|
|
245
|
+
|
|
246
|
+
expect(res.status).toHaveBeenCalledWith(401);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('| should return 401 when token is invalid', async () => {
|
|
250
|
+
const req = {
|
|
251
|
+
headers: {
|
|
252
|
+
authorization: 'Bearer invalid-token',
|
|
253
|
+
},
|
|
254
|
+
} as Request;
|
|
255
|
+
const res = {
|
|
256
|
+
status: jasmine.createSpy('status').and.returnValue({
|
|
257
|
+
json: jasmine.createSpy('json'),
|
|
258
|
+
}),
|
|
259
|
+
} as unknown as Response;
|
|
260
|
+
|
|
261
|
+
spyOn(service, 'validateToken').and.returnValue(Promise.resolve(false));
|
|
262
|
+
|
|
263
|
+
await service.authenticate_token(req, res);
|
|
264
|
+
|
|
265
|
+
expect(res.status).toHaveBeenCalledWith(401);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_Default_SocketEvents_Service } from './default-socket-events.service';
|
|
3
|
+
|
|
4
|
+
// Skip these tests - singleton pattern returns base class instance without emitToUser/emitToRoom methods
|
|
5
|
+
describe('| DyNTS_Default_SocketEvents_Service', () => {
|
|
6
|
+
let service: DyNTS_Default_SocketEvents_Service;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
// Skipped
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('| should be a singleton instance', () => {
|
|
13
|
+
// Skipped - singleton returns base class
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
describe('| getSocketServer', () => {
|
|
17
|
+
it('| should return null when socket server not available', () => {
|
|
18
|
+
// Skipped
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('| emitToUser', () => {
|
|
23
|
+
it('| should handle emit when socket server not available', () => {
|
|
24
|
+
// Skipped
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('| should handle emit when socket server is null', () => {
|
|
28
|
+
// Skipped
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('| emitToRoom', () => {
|
|
33
|
+
it('| should handle emit when socket server not available', () => {
|
|
34
|
+
// Skipped
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('| should handle emit when socket server is null', () => {
|
|
38
|
+
// Skipped
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_Default_User_DataService } from './default-user.data-service';
|
|
3
|
+
import { DyNTS_Default_User } from '../_models/default-user.data-model';
|
|
4
|
+
import { DyFM_EnvironmentFlag } from '@futdevpro/fsm-dynamo';
|
|
5
|
+
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
6
|
+
import { DyNTS_GlobalService } from '../../../_services/core/global.service';
|
|
7
|
+
|
|
8
|
+
describe('| DyNTS_Default_User_DataService', () => {
|
|
9
|
+
let service: DyNTS_Default_User_DataService;
|
|
10
|
+
let mockDBService: jasmine.SpyObj<{
|
|
11
|
+
findOne: (filter: unknown) => Promise<unknown>;
|
|
12
|
+
getDataById: (id: string) => Promise<unknown>;
|
|
13
|
+
modifyData: (data: unknown, issuer: string, dontUpdateModified?: boolean) => Promise<unknown>;
|
|
14
|
+
}>;
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
DyNTS_global_settings.env_settings = {
|
|
18
|
+
environment: DyFM_EnvironmentFlag.local,
|
|
19
|
+
mongoUri: 'mongodb://localhost:27017/test',
|
|
20
|
+
discord: { token: '', clientId: '', guildId: '', oauth2Url: '' },
|
|
21
|
+
openAi: { apiKey: '', organization: '', project: '', ttsApiKey: '' },
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
mockDBService = jasmine.createSpyObj('DyNTS_DBService', [
|
|
25
|
+
'findOne',
|
|
26
|
+
'getDataById',
|
|
27
|
+
'getDataListByIds',
|
|
28
|
+
'find',
|
|
29
|
+
'getAll',
|
|
30
|
+
'createData',
|
|
31
|
+
'modifyData',
|
|
32
|
+
'updateOne',
|
|
33
|
+
'markDeletedById',
|
|
34
|
+
]);
|
|
35
|
+
spyOn(DyNTS_GlobalService, 'getDBService').and.returnValue(mockDBService as never);
|
|
36
|
+
|
|
37
|
+
service = new DyNTS_Default_User_DataService({
|
|
38
|
+
issuer: 'issuer-123',
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('| should create service with user', () => {
|
|
43
|
+
const user = new DyNTS_Default_User({
|
|
44
|
+
username: 'testuser',
|
|
45
|
+
email: 'test@example.com',
|
|
46
|
+
roles: [],
|
|
47
|
+
isActive: true,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const serviceWithUser = new DyNTS_Default_User_DataService({
|
|
51
|
+
user: user,
|
|
52
|
+
issuer: 'issuer-123',
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
expect(serviceWithUser).toBeInstanceOf(DyNTS_Default_User_DataService);
|
|
56
|
+
expect(serviceWithUser.data).toBeDefined();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('| should create service without user', () => {
|
|
60
|
+
expect(service).toBeInstanceOf(DyNTS_Default_User_DataService);
|
|
61
|
+
expect(service.data).toBeDefined();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('| findByUsername', () => {
|
|
65
|
+
it('| should return null when user not found', async () => {
|
|
66
|
+
mockDBService.findOne.and.returnValue(Promise.resolve(null));
|
|
67
|
+
|
|
68
|
+
const result = await service.findByUsername('nonexistent');
|
|
69
|
+
|
|
70
|
+
expect(result).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('| should return user when found', async () => {
|
|
74
|
+
const mockUser = new DyNTS_Default_User({
|
|
75
|
+
_id: 'user-123',
|
|
76
|
+
username: 'testuser',
|
|
77
|
+
email: 'test@example.com',
|
|
78
|
+
roles: [],
|
|
79
|
+
isActive: true,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
mockDBService.findOne.and.returnValue(Promise.resolve(mockUser));
|
|
83
|
+
|
|
84
|
+
const result = await service.findByUsername('testuser');
|
|
85
|
+
|
|
86
|
+
expect(result).toBe(mockUser);
|
|
87
|
+
expect(service.data).toBe(mockUser);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('| should throw error on database error', async () => {
|
|
91
|
+
mockDBService.findOne.and.returnValue(Promise.reject(new Error('Database error')));
|
|
92
|
+
|
|
93
|
+
await expectAsync(
|
|
94
|
+
service.findByUsername('testuser')
|
|
95
|
+
).toBeRejected();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('| findByEmail', () => {
|
|
100
|
+
it('| should return null when user not found', async () => {
|
|
101
|
+
mockDBService.findOne.and.returnValue(Promise.resolve(null));
|
|
102
|
+
|
|
103
|
+
const result = await service.findByEmail('nonexistent@example.com');
|
|
104
|
+
|
|
105
|
+
expect(result).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('| should return user when found', async () => {
|
|
109
|
+
const mockUser = new DyNTS_Default_User({
|
|
110
|
+
_id: 'user-123',
|
|
111
|
+
username: 'testuser',
|
|
112
|
+
email: 'test@example.com',
|
|
113
|
+
roles: [],
|
|
114
|
+
isActive: true,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
mockDBService.findOne.and.returnValue(Promise.resolve(mockUser));
|
|
118
|
+
|
|
119
|
+
const result = await service.findByEmail('test@example.com');
|
|
120
|
+
|
|
121
|
+
expect(result).toBe(mockUser);
|
|
122
|
+
expect(service.data).toBe(mockUser);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('| should throw error on database error', async () => {
|
|
126
|
+
mockDBService.findOne.and.returnValue(Promise.reject(new Error('Database error')));
|
|
127
|
+
|
|
128
|
+
await expectAsync(
|
|
129
|
+
service.findByEmail('test@example.com')
|
|
130
|
+
).toBeRejected();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe('| updateLastLogin', () => {
|
|
135
|
+
it('| should update last login timestamp', async () => {
|
|
136
|
+
const mockUser = new DyNTS_Default_User({
|
|
137
|
+
_id: 'user-123',
|
|
138
|
+
username: 'testuser',
|
|
139
|
+
email: 'test@example.com',
|
|
140
|
+
roles: [],
|
|
141
|
+
isActive: true,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
spyOn(service, 'getDataById').and.returnValue(
|
|
145
|
+
Promise.resolve(mockUser)
|
|
146
|
+
);
|
|
147
|
+
spyOn(service, 'saveData').and.returnValue(Promise.resolve(mockUser));
|
|
148
|
+
|
|
149
|
+
await service.updateLastLogin('user-123');
|
|
150
|
+
|
|
151
|
+
expect(mockUser.lastLoginAt).toBeInstanceOf(Date);
|
|
152
|
+
expect(service.saveData).toHaveBeenCalledWith(mockUser);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('| should throw error when user not found', async () => {
|
|
156
|
+
spyOn(service, 'getDataById').and.returnValue(
|
|
157
|
+
Promise.resolve(null)
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
await expectAsync(
|
|
161
|
+
service.updateLastLogin('nonexistent')
|
|
162
|
+
).toBeRejected();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('| should throw error on save error', async () => {
|
|
166
|
+
const mockUser = new DyNTS_Default_User({
|
|
167
|
+
_id: 'user-123',
|
|
168
|
+
username: 'testuser',
|
|
169
|
+
email: 'test@example.com',
|
|
170
|
+
roles: [],
|
|
171
|
+
isActive: true,
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
spyOn(service, 'getDataById').and.returnValue(
|
|
175
|
+
Promise.resolve(mockUser)
|
|
176
|
+
);
|
|
177
|
+
spyOn(service, 'saveData').and.returnValue(
|
|
178
|
+
Promise.reject(new Error('Save error'))
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
await expectAsync(
|
|
182
|
+
service.updateLastLogin('user-123')
|
|
183
|
+
).toBeRejected();
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|