@nsshunt/stsdevtools 1.0.13 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/stsdevtools.mjs
CHANGED
|
@@ -8,7 +8,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
8
8
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
9
9
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
10
10
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
11
|
-
var _regexURLSafeStringComponent, _regexSTSBase64, _regexJWT, _authUtilsNode, _network, _databaseContainer, _stsAuthContainer, _stsRest01Container, _authEndpoint, _authPort, _authHost, _rest01Host, _rest01Port, _rest01Endpoint, _httpsAgent, _GetHttpsAgent;
|
|
11
|
+
var _regexURLSafeStringComponent, _regexSTSBase64, _regexJWT, _authUtilsNode, _network, _databaseContainer, _stsAuthContainer, _stsRest01Container, _ioRedisContainer, _ioRedisMessageProcessorUrl, _authEndpoint, _authPort, _authHost, _rest01Host, _rest01Port, _rest01Endpoint, _httpsAgent, _GetHttpsAgent;
|
|
12
12
|
import { expect } from "vitest";
|
|
13
13
|
import chalk from "chalk";
|
|
14
14
|
import * as tough from "tough-cookie";
|
|
@@ -34,6 +34,8 @@ class TestHelper {
|
|
|
34
34
|
__privateAdd(this, _databaseContainer);
|
|
35
35
|
__privateAdd(this, _stsAuthContainer);
|
|
36
36
|
__privateAdd(this, _stsRest01Container);
|
|
37
|
+
__privateAdd(this, _ioRedisContainer);
|
|
38
|
+
__privateAdd(this, _ioRedisMessageProcessorUrl, "");
|
|
37
39
|
__privateAdd(this, _authEndpoint, "");
|
|
38
40
|
__privateAdd(this, _authPort, "");
|
|
39
41
|
__privateAdd(this, _authHost, "");
|
|
@@ -154,6 +156,18 @@ class TestHelper {
|
|
|
154
156
|
await Sleep(500);
|
|
155
157
|
await stsAuthContainerInit.stop();
|
|
156
158
|
});
|
|
159
|
+
__publicField(this, "StartRedis", async () => {
|
|
160
|
+
__privateSet(this, _ioRedisContainer, await new GenericContainer("redis/redis-stack-server").withEnvironment({
|
|
161
|
+
REDIS_ARGS: '--save "" --appendonly no'
|
|
162
|
+
}).withExposedPorts(6379).withNetwork(__privateGet(this, _network)).withNetworkAliases("redisstackserver").start());
|
|
163
|
+
__privateSet(this, _ioRedisMessageProcessorUrl, `redis://${__privateGet(this, _ioRedisContainer).getHost()}:${__privateGet(this, _ioRedisContainer).getMappedPort(6379)}`);
|
|
164
|
+
await Sleep(2e3);
|
|
165
|
+
this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${__privateGet(this, _ioRedisMessageProcessorUrl)}]`));
|
|
166
|
+
});
|
|
167
|
+
__publicField(this, "StopRedis", async () => {
|
|
168
|
+
await __privateGet(this, _ioRedisContainer).stop();
|
|
169
|
+
await Sleep(200);
|
|
170
|
+
});
|
|
157
171
|
__publicField(this, "StartAuthService", async () => {
|
|
158
172
|
__privateSet(this, _stsAuthContainer, await new GenericContainer("serza/stsauth:latest").withExposedPorts(3002).withEnvironment({
|
|
159
173
|
DB_USER: "postgres",
|
|
@@ -164,7 +178,8 @@ class TestHelper {
|
|
|
164
178
|
DEBUG: "proc*",
|
|
165
179
|
HTTPS_SERVER_KEY_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.key",
|
|
166
180
|
HTTPS_SERVER_CERT_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.cert",
|
|
167
|
-
AS_ENDPOINT: "https://stscore.stsmda.org"
|
|
181
|
+
AS_ENDPOINT: "https://stscore.stsmda.org",
|
|
182
|
+
IM_REDIS_MESSAGE_PROCESSOR_URL: "redis://redisstackserver:6379"
|
|
168
183
|
}).withNetwork(__privateGet(this, _network)).withNetworkAliases("stsauthrunner").withWaitStrategy(Wait.forHttp("/stsauth/v1.0/latency", 3002).usingTls().allowInsecure()).start());
|
|
169
184
|
const httpAuthPort = __privateGet(this, _stsAuthContainer).getMappedPort(3002);
|
|
170
185
|
await Sleep(200);
|
|
@@ -232,7 +247,8 @@ class TestHelper {
|
|
|
232
247
|
// this.authHost,
|
|
233
248
|
//AS_ENDPOINT: 'https://localhost', // this.authHost,
|
|
234
249
|
AS_HOST_PORT: "3002",
|
|
235
|
-
AS_PORT: "3002"
|
|
250
|
+
AS_PORT: "3002",
|
|
251
|
+
IM_REDIS_MESSAGE_PROCESSOR_URL: "redis://redisstackserver:6379"
|
|
236
252
|
//AS_HOST_PORT: this.authPort,
|
|
237
253
|
//AS_PORT: this.authPort,
|
|
238
254
|
//REST01_PORT: '3003',
|
|
@@ -284,6 +300,8 @@ _network = new WeakMap();
|
|
|
284
300
|
_databaseContainer = new WeakMap();
|
|
285
301
|
_stsAuthContainer = new WeakMap();
|
|
286
302
|
_stsRest01Container = new WeakMap();
|
|
303
|
+
_ioRedisContainer = new WeakMap();
|
|
304
|
+
_ioRedisMessageProcessorUrl = new WeakMap();
|
|
287
305
|
_authEndpoint = new WeakMap();
|
|
288
306
|
_authPort = new WeakMap();
|
|
289
307
|
_authHost = new WeakMap();
|
package/dist/stsdevtools.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stsdevtools.mjs","sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport https from 'node:https'\nimport crypto from 'node:crypto';\n\nimport axios from 'axios';\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\";\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger } from '@nsshunt/stsutils'\n\nimport { AuthUtilsNode } from '@nsshunt/stsappframework'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n\n #authUtilsNode = new AuthUtilsNode(defaultLogger);\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #httpsAgent: https.Agent | null = null;\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n #GetHttpsAgent = () =>\n {\n if (this.#httpsAgent === null) {\n // https://nodejs.org/api/http.html#class-httpagent\n this.#httpsAgent = new https.Agent({ \n keepAlive: goptions.keepAlive,\n maxSockets: goptions.maxSockets,\n maxTotalSockets: goptions.maxTotalSockets,\n maxFreeSockets: goptions.maxFreeSockets,\n timeout: goptions.timeout,\n rejectUnauthorized: false\n });\n }\n return this.#httpsAgent;\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n await this.#network.stop();\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get getHttpsAgent() {\n return this.#GetHttpsAgent();\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n const headers = { 'Content-Type': 'application/json'};\n\n const retVal = await axios({\n url\n ,method: 'post'\n ,data: authoriseOptions\n ,headers: headers\n ,httpsAgent: this.#GetHttpsAgent()\n });\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n ValidateJWT = async (token: string): Promise<string> => {\n return await this.#authUtilsNode.ValidateJWT(token, goptions.asapiidentifier, this.#authEndpoint);\n }\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n const cookieExpireDate = new Date(cookie.expires);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n expect(retVal.data.detail).toMatchObject(desiredResult);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stsdevtools.mjs","sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport https from 'node:https'\nimport crypto from 'node:crypto';\n\nimport axios from 'axios';\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\";\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger } from '@nsshunt/stsutils'\n\nimport { AuthUtilsNode } from '@nsshunt/stsappframework'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n\n #authUtilsNode = new AuthUtilsNode(defaultLogger);\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #httpsAgent: https.Agent | null = null;\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n #GetHttpsAgent = () =>\n {\n if (this.#httpsAgent === null) {\n // https://nodejs.org/api/http.html#class-httpagent\n this.#httpsAgent = new https.Agent({ \n keepAlive: goptions.keepAlive,\n maxSockets: goptions.maxSockets,\n maxTotalSockets: goptions.maxTotalSockets,\n maxFreeSockets: goptions.maxFreeSockets,\n timeout: goptions.timeout,\n rejectUnauthorized: false\n });\n }\n return this.#httpsAgent;\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n await this.#network.stop();\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get getHttpsAgent() {\n return this.#GetHttpsAgent();\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n const headers = { 'Content-Type': 'application/json'};\n\n const retVal = await axios({\n url\n ,method: 'post'\n ,data: authoriseOptions\n ,headers: headers\n ,httpsAgent: this.#GetHttpsAgent()\n });\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n ValidateJWT = async (token: string): Promise<string> => {\n return await this.#authUtilsNode.ValidateJWT(token, goptions.asapiidentifier, this.#authEndpoint);\n }\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n const cookieExpireDate = new Date(cookie.expires);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n expect(retVal.data.detail).toMatchObject(desiredResult);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/stsdevtools.umd.js
CHANGED
|
@@ -12,7 +12,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
12
12
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
13
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
14
14
|
|
|
15
|
-
var _regexURLSafeStringComponent, _regexSTSBase64, _regexJWT, _authUtilsNode, _network, _databaseContainer, _stsAuthContainer, _stsRest01Container, _authEndpoint, _authPort, _authHost, _rest01Host, _rest01Port, _rest01Endpoint, _httpsAgent, _GetHttpsAgent;
|
|
15
|
+
var _regexURLSafeStringComponent, _regexSTSBase64, _regexJWT, _authUtilsNode, _network, _databaseContainer, _stsAuthContainer, _stsRest01Container, _ioRedisContainer, _ioRedisMessageProcessorUrl, _authEndpoint, _authPort, _authHost, _rest01Host, _rest01Port, _rest01Endpoint, _httpsAgent, _GetHttpsAgent;
|
|
16
16
|
function _interopNamespaceDefault(e) {
|
|
17
17
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
18
18
|
if (e) {
|
|
@@ -45,6 +45,8 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
|
|
|
45
45
|
__privateAdd(this, _databaseContainer);
|
|
46
46
|
__privateAdd(this, _stsAuthContainer);
|
|
47
47
|
__privateAdd(this, _stsRest01Container);
|
|
48
|
+
__privateAdd(this, _ioRedisContainer);
|
|
49
|
+
__privateAdd(this, _ioRedisMessageProcessorUrl, "");
|
|
48
50
|
__privateAdd(this, _authEndpoint, "");
|
|
49
51
|
__privateAdd(this, _authPort, "");
|
|
50
52
|
__privateAdd(this, _authHost, "");
|
|
@@ -165,6 +167,18 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
|
|
|
165
167
|
await stsutils.Sleep(500);
|
|
166
168
|
await stsAuthContainerInit.stop();
|
|
167
169
|
});
|
|
170
|
+
__publicField(this, "StartRedis", async () => {
|
|
171
|
+
__privateSet(this, _ioRedisContainer, await new testcontainers.GenericContainer("redis/redis-stack-server").withEnvironment({
|
|
172
|
+
REDIS_ARGS: '--save "" --appendonly no'
|
|
173
|
+
}).withExposedPorts(6379).withNetwork(__privateGet(this, _network)).withNetworkAliases("redisstackserver").start());
|
|
174
|
+
__privateSet(this, _ioRedisMessageProcessorUrl, `redis://${__privateGet(this, _ioRedisContainer).getHost()}:${__privateGet(this, _ioRedisContainer).getMappedPort(6379)}`);
|
|
175
|
+
await stsutils.Sleep(2e3);
|
|
176
|
+
this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${__privateGet(this, _ioRedisMessageProcessorUrl)}]`));
|
|
177
|
+
});
|
|
178
|
+
__publicField(this, "StopRedis", async () => {
|
|
179
|
+
await __privateGet(this, _ioRedisContainer).stop();
|
|
180
|
+
await stsutils.Sleep(200);
|
|
181
|
+
});
|
|
168
182
|
__publicField(this, "StartAuthService", async () => {
|
|
169
183
|
__privateSet(this, _stsAuthContainer, await new testcontainers.GenericContainer("serza/stsauth:latest").withExposedPorts(3002).withEnvironment({
|
|
170
184
|
DB_USER: "postgres",
|
|
@@ -175,7 +189,8 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
|
|
|
175
189
|
DEBUG: "proc*",
|
|
176
190
|
HTTPS_SERVER_KEY_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.key",
|
|
177
191
|
HTTPS_SERVER_CERT_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.cert",
|
|
178
|
-
AS_ENDPOINT: "https://stscore.stsmda.org"
|
|
192
|
+
AS_ENDPOINT: "https://stscore.stsmda.org",
|
|
193
|
+
IM_REDIS_MESSAGE_PROCESSOR_URL: "redis://redisstackserver:6379"
|
|
179
194
|
}).withNetwork(__privateGet(this, _network)).withNetworkAliases("stsauthrunner").withWaitStrategy(testcontainers.Wait.forHttp("/stsauth/v1.0/latency", 3002).usingTls().allowInsecure()).start());
|
|
180
195
|
const httpAuthPort = __privateGet(this, _stsAuthContainer).getMappedPort(3002);
|
|
181
196
|
await stsutils.Sleep(200);
|
|
@@ -243,7 +258,8 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
|
|
|
243
258
|
// this.authHost,
|
|
244
259
|
//AS_ENDPOINT: 'https://localhost', // this.authHost,
|
|
245
260
|
AS_HOST_PORT: "3002",
|
|
246
|
-
AS_PORT: "3002"
|
|
261
|
+
AS_PORT: "3002",
|
|
262
|
+
IM_REDIS_MESSAGE_PROCESSOR_URL: "redis://redisstackserver:6379"
|
|
247
263
|
//AS_HOST_PORT: this.authPort,
|
|
248
264
|
//AS_PORT: this.authPort,
|
|
249
265
|
//REST01_PORT: '3003',
|
|
@@ -295,6 +311,8 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
|
|
|
295
311
|
_databaseContainer = new WeakMap();
|
|
296
312
|
_stsAuthContainer = new WeakMap();
|
|
297
313
|
_stsRest01Container = new WeakMap();
|
|
314
|
+
_ioRedisContainer = new WeakMap();
|
|
315
|
+
_ioRedisMessageProcessorUrl = new WeakMap();
|
|
298
316
|
_authEndpoint = new WeakMap();
|
|
299
317
|
_authPort = new WeakMap();
|
|
300
318
|
_authHost = new WeakMap();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stsdevtools.umd.js","sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport https from 'node:https'\nimport crypto from 'node:crypto';\n\nimport axios from 'axios';\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\";\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger } from '@nsshunt/stsutils'\n\nimport { AuthUtilsNode } from '@nsshunt/stsappframework'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n\n #authUtilsNode = new AuthUtilsNode(defaultLogger);\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #httpsAgent: https.Agent | null = null;\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n #GetHttpsAgent = () =>\n {\n if (this.#httpsAgent === null) {\n // https://nodejs.org/api/http.html#class-httpagent\n this.#httpsAgent = new https.Agent({ \n keepAlive: goptions.keepAlive,\n maxSockets: goptions.maxSockets,\n maxTotalSockets: goptions.maxTotalSockets,\n maxFreeSockets: goptions.maxFreeSockets,\n timeout: goptions.timeout,\n rejectUnauthorized: false\n });\n }\n return this.#httpsAgent;\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n await this.#network.stop();\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get getHttpsAgent() {\n return this.#GetHttpsAgent();\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n const headers = { 'Content-Type': 'application/json'};\n\n const retVal = await axios({\n url\n ,method: 'post'\n ,data: authoriseOptions\n ,headers: headers\n ,httpsAgent: this.#GetHttpsAgent()\n });\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n ValidateJWT = async (token: string): Promise<string> => {\n return await this.#authUtilsNode.ValidateJWT(token, goptions.asapiidentifier, this.#authEndpoint);\n }\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n const cookieExpireDate = new Date(cookie.expires);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n expect(retVal.data.detail).toMatchObject(desiredResult);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":["AuthUtilsNode","defaultLogger","goptions","Network","GenericContainer","$ResetOptions","Wait","Sleep","expect","tough"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stsdevtools.umd.js","sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport https from 'node:https'\nimport crypto from 'node:crypto';\n\nimport axios from 'axios';\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\";\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger } from '@nsshunt/stsutils'\n\nimport { AuthUtilsNode } from '@nsshunt/stsappframework'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n\n #authUtilsNode = new AuthUtilsNode(defaultLogger);\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #httpsAgent: https.Agent | null = null;\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n #GetHttpsAgent = () =>\n {\n if (this.#httpsAgent === null) {\n // https://nodejs.org/api/http.html#class-httpagent\n this.#httpsAgent = new https.Agent({ \n keepAlive: goptions.keepAlive,\n maxSockets: goptions.maxSockets,\n maxTotalSockets: goptions.maxTotalSockets,\n maxFreeSockets: goptions.maxFreeSockets,\n timeout: goptions.timeout,\n rejectUnauthorized: false\n });\n }\n return this.#httpsAgent;\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n await this.#network.stop();\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get getHttpsAgent() {\n return this.#GetHttpsAgent();\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n const headers = { 'Content-Type': 'application/json'};\n\n const retVal = await axios({\n url\n ,method: 'post'\n ,data: authoriseOptions\n ,headers: headers\n ,httpsAgent: this.#GetHttpsAgent()\n });\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n ValidateJWT = async (token: string): Promise<string> => {\n return await this.#authUtilsNode.ValidateJWT(token, goptions.asapiidentifier, this.#authEndpoint);\n }\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n const cookieExpireDate = new Date(cookie.expires);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n expect(retVal.data.detail).toMatchObject(desiredResult);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":["AuthUtilsNode","defaultLogger","goptions","Network","GenericContainer","$ResetOptions","Wait","Sleep","expect","tough"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nsshunt/stsdevtools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/stsdevtools.umd.js",
|
|
6
6
|
"module": "./dist/stsdevtools.mjs",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"parser": "@babel/eslint-parser"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@nsshunt/stsappframework": "^3.1.
|
|
23
|
+
"@nsshunt/stsappframework": "^3.1.157",
|
|
24
24
|
"@nsshunt/stsconfig": "^1.25.136",
|
|
25
25
|
"@nsshunt/stsutils": "^1.16.65",
|
|
26
26
|
"axios": "^1.7.2",
|
package/types/testHelpers.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export declare class TestHelper {
|
|
|
19
19
|
StartDatabase: () => Promise<void>;
|
|
20
20
|
StopDatabase: () => Promise<void>;
|
|
21
21
|
InitializeDatabase: () => Promise<void>;
|
|
22
|
+
StartRedis: () => Promise<void>;
|
|
23
|
+
StopRedis: () => Promise<void>;
|
|
22
24
|
StartAuthService: () => Promise<void>;
|
|
23
25
|
StopAuthService: () => Promise<void>;
|
|
24
26
|
StopRest01Service: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAA;AAa9B,qBAAa,UAAU;;;
|
|
1
|
+
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAA;AAa9B,qBAAa,UAAU;;;IA+BnB,eAAe,CAAC,OAAO,EAAE,GAAG;IAoB5B,YAAY,sBAEX;IAED,WAAW,sBAEV;IAED,IAAI,OAAO,QAEV;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,YAAY,WAEf;IAED,IAAI,UAAU,WAEb;IAED,IAAI,UAAU,WAEb;IAED,IAAI,cAAc,WAEjB;IAED,IAAI,aAAa,gBAEhB;IAED,kBAAkB,eAMjB;IAED,KAAK,aAAoB,MAAM,YAAY,MAAM,sDAsDhD;IAUD,WAAW,UAAiB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,CAEnD;IAED,aAAa,sBAwBZ;IAED,YAAY,sBAQX;IAID,kBAAkB,sBAsBjB;IAED,UAAU,sBAkBT;IAED,SAAS,sBAGR;IAED,gBAAgB,sBA2Bf;IAED,eAAe,sBAKd;IAED,iBAAiB,sBAKhB;IAED,kBAAkB,sBAwCjB;IAED,kBAAkB,sBAuCjB;CACJ"}
|