@adaas/a-server 0.0.29 → 0.0.30

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.
Files changed (84) hide show
  1. package/dist/browser/index.d.mts +123 -69
  2. package/dist/browser/index.mjs +211 -69
  3. package/dist/browser/index.mjs.map +1 -1
  4. package/dist/node/controllers/A-EntityController/A-EntityController.component.d.mts +2 -5
  5. package/dist/node/controllers/A-EntityController/A-EntityController.component.d.ts +2 -5
  6. package/dist/node/controllers/A-EntityController/A-EntityController.component.js +66 -88
  7. package/dist/node/controllers/A-EntityController/A-EntityController.component.js.map +1 -1
  8. package/dist/node/controllers/A-EntityController/A-EntityController.component.mjs +67 -89
  9. package/dist/node/controllers/A-EntityController/A-EntityController.component.mjs.map +1 -1
  10. package/dist/node/controllers/A-ListingController/A-ListingController.component.js +20 -18
  11. package/dist/node/controllers/A-ListingController/A-ListingController.component.js.map +1 -1
  12. package/dist/node/controllers/A-ListingController/A-ListingController.component.mjs +20 -18
  13. package/dist/node/controllers/A-ListingController/A-ListingController.component.mjs.map +1 -1
  14. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.mts +0 -2
  15. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.ts +0 -2
  16. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js +10 -1
  17. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js.map +1 -1
  18. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.mjs +10 -1
  19. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.mjs.map +1 -1
  20. package/dist/node/index.d.mts +3 -1
  21. package/dist/node/index.d.ts +3 -1
  22. package/dist/node/index.js +14 -0
  23. package/dist/node/index.mjs +2 -0
  24. package/dist/node/lib/A-Server/A-HttpServer.container.d.mts +4 -6
  25. package/dist/node/lib/A-Server/A-HttpServer.container.d.ts +4 -6
  26. package/dist/node/lib/A-ServerController/A-ServerController.component.js +17 -4
  27. package/dist/node/lib/A-ServerController/A-ServerController.component.js.map +1 -1
  28. package/dist/node/lib/A-ServerController/A-ServerController.component.mjs +17 -4
  29. package/dist/node/lib/A-ServerController/A-ServerController.component.mjs.map +1 -1
  30. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.d.mts +52 -28
  31. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.d.ts +52 -28
  32. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.js +117 -44
  33. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.js.map +1 -1
  34. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.mjs +118 -45
  35. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.mjs.map +1 -1
  36. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.d.mts +14 -6
  37. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.d.ts +14 -6
  38. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.js.map +1 -1
  39. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.mjs.map +1 -1
  40. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.d.mts +12 -0
  41. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.d.ts +12 -0
  42. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.js +25 -0
  43. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.js.map +1 -0
  44. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.mjs +24 -0
  45. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.mjs.map +1 -0
  46. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.d.mts +18 -0
  47. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.d.ts +18 -0
  48. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.js +48 -0
  49. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.js.map +1 -0
  50. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.mjs +47 -0
  51. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.mjs.map +1 -0
  52. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.mts +6 -8
  53. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.ts +6 -8
  54. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.js +3 -4
  55. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.js.map +1 -1
  56. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.mjs +4 -5
  57. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.mjs.map +1 -1
  58. package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.mts +0 -2
  59. package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.ts +0 -2
  60. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.js +1 -1
  61. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.js.map +1 -1
  62. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.mjs +1 -1
  63. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.mjs.map +1 -1
  64. package/dist/node/repositories/A-EntityRepository/A-EntityRepository.component.d.mts +1 -0
  65. package/dist/node/repositories/A-EntityRepository/A-EntityRepository.component.d.ts +1 -0
  66. package/examples/simple-server/components/Users.repository.ts +2 -2
  67. package/jest.config.ts +1 -0
  68. package/package.json +1 -1
  69. package/src/controllers/A-EntityController/A-EntityController.component.ts +69 -109
  70. package/src/controllers/A-ListingController/A-ListingController.component.ts +22 -20
  71. package/src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts +11 -1
  72. package/src/index.ts +2 -0
  73. package/src/lib/A-ServerController/A-ServerController.component.ts +17 -8
  74. package/src/lib/A-ServerEntityList/A-EntityList.entity.ts +159 -55
  75. package/src/lib/A-ServerEntityList/A-EntityList.types.ts +17 -7
  76. package/src/lib/A-ServerEntityList/A-EntityListCacheState.context.ts +27 -0
  77. package/src/lib/A-ServerEntityList/A-EntityListPagination.context.ts +48 -0
  78. package/src/lib/A-ServerLogger/A-ServerLogger.component.ts +3 -4
  79. package/src/middlewares/A-ServerCORS/A_ServerCORS.component.ts +1 -1
  80. package/tests/A-Server-CORS.test.ts +542 -0
  81. package/tests/A-Server-Entity.test.ts +205 -0
  82. package/tests/A-Server-Health.test.ts +89 -0
  83. package/tests/A-Server-Routes.test.ts +113 -0
  84. package/tests/A-ServerEntityList.test.ts +416 -0
@@ -0,0 +1,205 @@
1
+ import http from 'http';
2
+ import { A_Concept, ASEID, A_Component, A_Entity, A_Feature, A_Inject, A_TYPES__EntityFeatures } from '@adaas/a-concept';
3
+ import { A_Config, ENVConfigReader } from '@adaas/a-utils/a-config';
4
+ import { A_Polyfill } from '@adaas/a-utils/a-polyfill';
5
+ import { A_HttpServer } from '@adaas/a-server/server/A-HttpServer.container';
6
+ import { A_ServerRouter } from '@adaas/a-server/router/A-ServerRouter.component';
7
+ import { A_ServerLogger } from '@adaas/a-server/logger/A-ServerLogger.component';
8
+ import { A_ServerController } from '@adaas/a-server/controller/A-ServerController.component';
9
+ import { A_ServerHealthMonitor } from '@adaas/a-server/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component';
10
+ import { A_EntityController } from '@adaas/a-server/controllers/A-EntityController/A-EntityController.component';
11
+
12
+ // --- Test-local types ---
13
+ type NewUser = { id: number; email: string; name: string; };
14
+ type UserJSON = NewUser & { aseid: string; };
15
+
16
+ class User extends A_Entity<NewUser, UserJSON> {
17
+ static get entity() { return 'user'; }
18
+ static get concept() { return 'a-server'; }
19
+ static get scope() { return 'entity-test'; }
20
+
21
+ email!: string;
22
+ name!: string;
23
+
24
+ get id(): number { return Number(this.aseid.id); }
25
+
26
+ fromNew(newEntity: NewUser): void {
27
+ this.aseid = new ASEID({ concept: User.concept, scope: User.scope, entity: User.entity, id: newEntity.id });
28
+ this.email = newEntity.email;
29
+ this.name = newEntity.name;
30
+ }
31
+
32
+ fromJSON(serialized: UserJSON): void {
33
+ this.aseid = new ASEID(serialized.aseid);
34
+ this.email = serialized.email;
35
+ this.name = serialized.name;
36
+ }
37
+
38
+ toJSON(): UserJSON {
39
+ return { id: this.id, aseid: this.aseid.toString(), email: this.email, name: this.name };
40
+ }
41
+ }
42
+
43
+ class UsersRepository extends A_Component {
44
+ private mockedUsers: UserJSON[] = [
45
+ new User({ id: 1, name: 'John Doe', email: 'joe@doe.com' }).toJSON(),
46
+ new User({ id: 2, name: 'mr Smith', email: 'mr.smith@doe.com' }).toJSON(),
47
+ ];
48
+
49
+ @A_Feature.Extend({ name: A_TYPES__EntityFeatures.LOAD })
50
+ load(@A_Inject(User) user: User) {
51
+ const existedUser = this.mockedUsers.find(u => u.id === user.id);
52
+ if (!existedUser) throw new Error('User not found');
53
+ user.fromJSON(existedUser);
54
+ }
55
+
56
+ @A_Feature.Extend({ name: A_TYPES__EntityFeatures.SAVE })
57
+ create(@A_Inject(User) user: User) {
58
+ this.mockedUsers.push(user.toJSON());
59
+ }
60
+ }
61
+
62
+ jest.retryTimes(0);
63
+ jest.setTimeout(30_000);
64
+
65
+ const TEST_PORT = 3902;
66
+
67
+ function httpRequest(
68
+ method: string,
69
+ path: string,
70
+ body?: Record<string, unknown>
71
+ ): Promise<{ status: number; body: unknown }> {
72
+ return new Promise((resolve, reject) => {
73
+ const bodyStr = body ? JSON.stringify(body) : undefined;
74
+ const options: http.RequestOptions = {
75
+ hostname: 'localhost',
76
+ port: TEST_PORT,
77
+ path,
78
+ method,
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ ...(bodyStr ? { 'Content-Length': Buffer.byteLength(bodyStr) } : {}),
82
+ },
83
+ };
84
+ const req = http.request(options, (res) => {
85
+ let raw = '';
86
+ res.on('data', (chunk: Buffer) => { raw += chunk.toString(); });
87
+ res.on('end', () => {
88
+ try {
89
+ resolve({ status: res.statusCode ?? 0, body: JSON.parse(raw) });
90
+ } catch {
91
+ resolve({ status: res.statusCode ?? 0, body: raw });
92
+ }
93
+ });
94
+ });
95
+ req.on('error', reject);
96
+ if (bodyStr) req.write(bodyStr);
97
+ req.end();
98
+ });
99
+ }
100
+
101
+ describe('A-Server Entity Tests', () => {
102
+ let concept: A_Concept;
103
+
104
+ beforeAll(async () => {
105
+ const server = new A_HttpServer({
106
+ name: 'entity-test-server',
107
+ components: [
108
+ A_Polyfill,
109
+ A_ServerLogger,
110
+ ENVConfigReader,
111
+ A_ServerRouter,
112
+ A_ServerController,
113
+ A_ServerHealthMonitor,
114
+ A_EntityController,
115
+ UsersRepository,
116
+ ],
117
+ entities: [User],
118
+ fragments: [
119
+ new A_Config({
120
+ variables: ['A_SERVER_PORT', 'A_ROUTER__PARSE_PARAMS_AUTOMATICALLY', 'CONFIG_VERBOSE'] as const,
121
+ defaults: {
122
+ A_SERVER_PORT: TEST_PORT,
123
+ A_ROUTER__PARSE_PARAMS_AUTOMATICALLY: true,
124
+ CONFIG_VERBOSE: false,
125
+ },
126
+ }),
127
+ ],
128
+ });
129
+
130
+ concept = new A_Concept({
131
+ name: 'entity-test-concept',
132
+ containers: [server],
133
+ components: [],
134
+ fragments: [],
135
+ entities: [],
136
+ });
137
+
138
+ await concept.load();
139
+ await concept.start();
140
+ });
141
+
142
+ afterAll(async () => {
143
+ await concept.stop();
144
+ });
145
+
146
+ it('should load an existing user by ASEID', async () => {
147
+ const aseid = new ASEID({ concept: User.concept, scope: User.scope, entity: User.entity, id: 1 });
148
+ const path = `/a-entity/v1/${encodeURIComponent(aseid.toString())}`;
149
+ const { status, body } = await httpRequest('GET', path);
150
+
151
+ expect(status).toBe(200);
152
+ expect(body).toMatchObject({ name: 'John Doe', email: 'joe@doe.com' });
153
+ });
154
+
155
+ it('should load a second user by ASEID', async () => {
156
+ const aseid = new ASEID({ concept: User.concept, scope: User.scope, entity: User.entity, id: 2 });
157
+ const path = `/a-entity/v1/${encodeURIComponent(aseid.toString())}`;
158
+ const { status, body } = await httpRequest('GET', path);
159
+
160
+ expect(status).toBe(200);
161
+ expect(body).toMatchObject({ name: 'mr Smith', email: 'mr.smith@doe.com' });
162
+ });
163
+
164
+ it('should return an error for a non-existent user ASEID', async () => {
165
+ const aseid = new ASEID({ concept: User.concept, scope: User.scope, entity: User.entity, id: 999 });
166
+ const path = `/a-entity/v1/${encodeURIComponent(aseid.toString())}`;
167
+ const { status } = await httpRequest('GET', path);
168
+
169
+ expect(status).toBeGreaterThanOrEqual(500);
170
+ });
171
+
172
+ it('should return 400 for an invalid ASEID', async () => {
173
+ const { status } = await httpRequest('GET', '/a-entity/v1/not-a-valid-aseid');
174
+
175
+ expect(status).toBe(400);
176
+ });
177
+
178
+ it('should return 404 for an unregistered entity type in ASEID', async () => {
179
+ // Valid ASEID format but entity type not registered in this server
180
+ const aseid = new ASEID({ concept: 'a-server', scope: 'entity-test', entity: 'unknown-entity', id: 1 });
181
+ const path = `/a-entity/v1/${encodeURIComponent(aseid.toString())}`;
182
+ const { status } = await httpRequest('GET', path);
183
+
184
+ expect(status).toBe(404);
185
+ });
186
+
187
+ it('should return 400 for PUT with invalid ASEID', async () => {
188
+ const { status } = await httpRequest('PUT', '/a-entity/v1/not-a-valid-aseid', { name: 'Test' });
189
+
190
+ expect(status).toBe(400);
191
+ });
192
+
193
+ it('should return 400 for DELETE with invalid ASEID', async () => {
194
+ const { status } = await httpRequest('DELETE', '/a-entity/v1/not-a-valid-aseid');
195
+
196
+ expect(status).toBe(400);
197
+ });
198
+
199
+ it('should create a new user via POST and receive a response', async () => {
200
+ const newUser = { id: 3, name: 'Alice', email: 'alice@example.com' };
201
+ const { status } = await httpRequest('POST', '/a-entity/v1/', newUser);
202
+
203
+ expect(status).toBeGreaterThanOrEqual(200);
204
+ });
205
+ });
@@ -0,0 +1,89 @@
1
+ import http from 'http';
2
+ import { A_Concept, ASEID } from '@adaas/a-concept';
3
+ import { A_Config, ENVConfigReader } from '@adaas/a-utils/a-config';
4
+ import { A_Polyfill } from '@adaas/a-utils/a-polyfill';
5
+ import { A_HttpServer } from '@adaas/a-server/server/A-HttpServer.container';
6
+ import { A_ServerRouter } from '@adaas/a-server/router/A-ServerRouter.component';
7
+ import { A_ServerLogger } from '@adaas/a-server/logger/A-ServerLogger.component';
8
+ import { A_ServerController } from '@adaas/a-server/controller/A-ServerController.component';
9
+ import { A_ServerHealthMonitor } from '@adaas/a-server/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component';
10
+
11
+ jest.retryTimes(0);
12
+ jest.setTimeout(30_000);
13
+
14
+ const TEST_PORT = 3901;
15
+
16
+ function httpGet(url: string): Promise<{ status: number; body: string }> {
17
+ return new Promise((resolve, reject) => {
18
+ http.get(url, (res) => {
19
+ let body = '';
20
+ res.on('data', (chunk: Buffer) => { body += chunk.toString(); });
21
+ res.on('end', () => resolve({ status: res.statusCode ?? 0, body }));
22
+ }).on('error', reject);
23
+ });
24
+ }
25
+
26
+ describe('A-Server Health Tests', () => {
27
+ let concept: A_Concept;
28
+
29
+ beforeAll(async () => {
30
+ const server = new A_HttpServer({
31
+ name: 'health-test-server',
32
+ components: [
33
+ A_Polyfill,
34
+ A_ServerLogger,
35
+ ENVConfigReader,
36
+ A_ServerRouter,
37
+ A_ServerController,
38
+ A_ServerHealthMonitor,
39
+ ],
40
+ entities: [],
41
+ fragments: [
42
+ new A_Config({
43
+ variables: ['A_SERVER_PORT', 'CONFIG_VERBOSE'] as const,
44
+ defaults: {
45
+ A_SERVER_PORT: TEST_PORT,
46
+ CONFIG_VERBOSE: false,
47
+ },
48
+ }),
49
+ ],
50
+ });
51
+
52
+ concept = new A_Concept({
53
+ name: 'health-test-concept',
54
+ containers: [server],
55
+ components: [],
56
+ fragments: [],
57
+ entities: [],
58
+ });
59
+
60
+ await concept.load();
61
+ await concept.start();
62
+ });
63
+
64
+ afterAll(async () => {
65
+ await concept.stop();
66
+ });
67
+
68
+ it('should respond 200 on GET /health/v1/', async () => {
69
+ const { status, body } = await httpGet(`http://localhost:${TEST_PORT}/health/v1/`);
70
+
71
+ expect(status).toBe(200);
72
+ expect(body).toBeDefined();
73
+ });
74
+
75
+ it('should return package.json fields in health response', async () => {
76
+ const { status, body } = await httpGet(`http://localhost:${TEST_PORT}/health/v1/`);
77
+ const parsed = JSON.parse(body);
78
+
79
+ expect(status).toBe(200);
80
+ expect(parsed).toHaveProperty('name');
81
+ expect(parsed).toHaveProperty('version');
82
+ });
83
+
84
+ it('should return 404 for unknown routes', async () => {
85
+ const { status } = await httpGet(`http://localhost:${TEST_PORT}/unknown/path`);
86
+
87
+ expect(status).toBe(404);
88
+ });
89
+ });
@@ -0,0 +1,113 @@
1
+ import http from 'http';
2
+ import { A_Concept, A_Component, A_Inject } from '@adaas/a-concept';
3
+ import { A_Config, ENVConfigReader } from '@adaas/a-utils/a-config';
4
+ import { A_Polyfill } from '@adaas/a-utils/a-polyfill';
5
+ import { A_HttpServer } from '@adaas/a-server/server/A-HttpServer.container';
6
+ import { A_ServerRouter } from '@adaas/a-server/router/A-ServerRouter.component';
7
+ import { A_ServerLogger } from '@adaas/a-server/logger/A-ServerLogger.component';
8
+ import { A_ServerController } from '@adaas/a-server/controller/A-ServerController.component';
9
+ import { A_ServerHealthMonitor } from '@adaas/a-server/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component';
10
+ import { A_Request } from '@adaas/a-server/request/A-Request.entity';
11
+ import { A_Response } from '@adaas/a-server/response/A-Response.entity';
12
+ import { A_Logger } from '@adaas/a-utils/a-logger';
13
+
14
+ class TestController extends A_Component {
15
+ @A_ServerRouter.Get({
16
+ path: '/test',
17
+ version: 'v1',
18
+ prefix: 'test',
19
+ })
20
+ async test(
21
+ @A_Inject(A_Request) request: A_Request,
22
+ @A_Inject(A_Response) response: A_Response,
23
+ @A_Inject(A_Logger) logger: A_Logger
24
+ ) {
25
+ response.add('test', 'test');
26
+ }
27
+ }
28
+
29
+ jest.retryTimes(0);
30
+ jest.setTimeout(30_000);
31
+
32
+ const TEST_PORT = 3904;
33
+
34
+ function httpGet(url: string): Promise<{ status: number; body: unknown }> {
35
+ return new Promise((resolve, reject) => {
36
+ http.get(url, (res) => {
37
+ let raw = '';
38
+ res.on('data', (chunk: Buffer) => { raw += chunk.toString(); });
39
+ res.on('end', () => {
40
+ try {
41
+ resolve({ status: res.statusCode ?? 0, body: JSON.parse(raw) });
42
+ } catch {
43
+ resolve({ status: res.statusCode ?? 0, body: raw });
44
+ }
45
+ });
46
+ }).on('error', reject);
47
+ });
48
+ }
49
+
50
+ describe('A-Server Custom Route Tests', () => {
51
+ let concept: A_Concept;
52
+
53
+ beforeAll(async () => {
54
+ const server = new A_HttpServer({
55
+ name: 'routes-test-server',
56
+ components: [
57
+ A_Polyfill,
58
+ A_ServerLogger,
59
+ ENVConfigReader,
60
+ A_ServerRouter,
61
+ A_ServerController,
62
+ A_ServerHealthMonitor,
63
+ TestController,
64
+ ],
65
+ entities: [],
66
+ fragments: [
67
+ new A_Config({
68
+ variables: ['A_SERVER_PORT', 'A_ROUTER__PARSE_PARAMS_AUTOMATICALLY', 'CONFIG_VERBOSE'] as const,
69
+ defaults: {
70
+ A_SERVER_PORT: TEST_PORT,
71
+ A_ROUTER__PARSE_PARAMS_AUTOMATICALLY: true,
72
+ CONFIG_VERBOSE: false,
73
+ },
74
+ }),
75
+ ],
76
+ });
77
+
78
+ concept = new A_Concept({
79
+ name: 'routes-test-concept',
80
+ containers: [server],
81
+ components: [],
82
+ fragments: [],
83
+ entities: [],
84
+ });
85
+
86
+ await concept.load();
87
+ await concept.start();
88
+ });
89
+
90
+ afterAll(async () => {
91
+ await concept.stop();
92
+ });
93
+
94
+ it('should respond 200 on GET /test/v1/test', async () => {
95
+ const { status, body } = await httpGet(`http://localhost:${TEST_PORT}/test/v1/test`);
96
+
97
+ expect(status).toBe(200);
98
+ expect(body).toHaveProperty('test');
99
+ });
100
+
101
+ it('should return the test field value', async () => {
102
+ const { status, body } = await httpGet(`http://localhost:${TEST_PORT}/test/v1/test`);
103
+
104
+ expect(status).toBe(200);
105
+ expect((body as Record<string, unknown>).test).toBe('test');
106
+ });
107
+
108
+ it('should still respond to healthcheck on the same server', async () => {
109
+ const { status } = await httpGet(`http://localhost:${TEST_PORT}/health/v1/`);
110
+
111
+ expect(status).toBe(200);
112
+ });
113
+ });