@nsshunt/stsdevtools 1.0.3 → 1.0.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.
@@ -30,10 +30,9 @@ import https from "node:https";
30
30
  import crypto from "node:crypto";
31
31
  import axios from "axios";
32
32
  import { Network, GenericContainer, Wait } from "testcontainers";
33
- import { $Options, $ResetOptions } from "@nsshunt/stsconfig";
33
+ import { goptions, $ResetOptions } from "@nsshunt/stsconfig";
34
34
  import { defaultLogger, Sleep } from "@nsshunt/stsutils";
35
35
  import { AuthUtilsNode } from "@nsshunt/stsappframework";
36
- let goptions = $Options();
37
36
  class TestHelper {
38
37
  constructor() {
39
38
  //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url
@@ -137,7 +136,6 @@ class TestHelper {
137
136
  const networkIpAddress = __privateGet(this, _databaseContainer).getIpAddress(__privateGet(this, _network).getName());
138
137
  process.env.DB_HOST = `${host}:${httpPort}`;
139
138
  $ResetOptions();
140
- goptions = $Options();
141
139
  this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));
142
140
  this.LogDebugMessage(chalk.green(`host: [${host}]`));
143
141
  this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));
@@ -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 { $Options, $ResetOptions } from '@nsshunt/stsconfig'\nlet goptions = $Options()\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 goptions = $Options()\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 desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired: [\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.create',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.read',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.update',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.delete'\n ]\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\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 desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired: [\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.create',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.read',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.update',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.delete'\n ]\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,MAAM,WAAW;AAAA,EAwBpB,cAAc;AAtBd;AAAA,qDAA+B;AAE/B;AAAA;AAAA,wCAAkB;AAClB;AAAA,kCAAY;AAEZ;AAAA,uCAAiB,IAAI,cAAc,aAAa;AAChD;AAEA;AACA;AACA;AAEA,sCAAgB;AAChB,kCAAY;AACZ,kCAAY;AAEZ,oCAAc;AACd,oCAAc;AACd,wCAAkB;AAElB,oCAAkC;AAUlC,uCAAiB,MACjB;AACQ,UAAA,mBAAK,iBAAgB,MAAM;AAEtB,2BAAA,aAAc,IAAI,MAAM,MAAM;AAAA,UAC/B,WAAW,SAAS;AAAA,UACpB,YAAY,SAAS;AAAA,UACrB,iBAAiB,SAAS;AAAA,UAC1B,gBAAgB,SAAS;AAAA,UACzB,SAAS,SAAS;AAAA,UAClB,oBAAoB;AAAA,QAAA,CACvB;AAAA,MACL;AACA,aAAO,mBAAK;AAAA,IAAA;AAGhB,wCAAe,YAAY;AACvB,yBAAK,UAAW,MAAM,IAAI,UAAU,MAAM;AAAA,IAAA;AAG9C,uCAAc,YAAY;AAChB,YAAA,mBAAK,UAAS;IAAK;AAmC7B,8CAAqB,MAAM;AACvB,YAAM,UAAU;AAChB,UAAI,SAAS;AACP,YAAA,eAAyB,MAAM,KAAK,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;AACpF,mBAAa,QAAQ,CAAM,MAAA,UAAU,QAAQ,IAAI,QAAQ,MAAM,CAAE;AAC1D,aAAA;AAAA,IAAA;AAGX,iCAAQ,OAAO,UAAkB,aAAqB;AAC5C,YAAA,YAAY,QAAQ,IAAI;AAC9B,YAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,SAAS,QAAQ;AACtD,YAAM,gBAAgB;AAChB,YAAA,eAAe,QAAQ,IAAI;AACjC,YAAM,gBAAgB;AAChB,YAAA,QAAQ,QAAQ,IAAI;AAC1B,YAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,SAAS,QAAQ;AAChD,YAAA,gBAAgB,KAAK;AACrB,YAAA,iBAAiB,OAAO,WAAW,QAAQ,EAAE,OAAO,aAAa,EAAE,OAAO,QAAQ;AACxF,YAAM,wBAAwB;AAE9B,YAAM,mBAAwB;AAAA,QAC1B,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGJ,YAAM,MAAM,GAAG,mBAAK,cAAa,GAAG,SAAS,SAAS;AAChD,YAAA,UAAU,EAAE,gBAAgB;AAE5B,YAAA,SAAS,MAAM,MAAM;AAAA,QACvB;AAAA,QACC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,YAAY,mBAAK,gBAAL;AAAA,MAAoB,CACpC;AAkBM,aAAA;AAAA,IAAA;AAWX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAAc,OAAO,UAAmC;AAC7C,aAAA,MAAM,mBAAK,gBAAe,YAAY,OAAO,SAAS,iBAAiB,mBAAK,cAAa;AAAA,IAAA;AAGpG,yCAAgB,YAAY;AACnB,yBAAA,oBAAqB,MAAM,IAAI,iBAAiB,UAAU,EAC1D,iBAAiB,IAAI,EACrB,gBAAgB;AAAA,QACb,mBAAmB;AAAA;AAAA,MAAA,CAEtB,EACA,YAAY,mBAAK,SAAQ,EACzB,mBAAmB,UAAU,EAC7B;AAEL,YAAM,WAAW,mBAAK,oBAAmB,cAAc,IAAI;AACrD,YAAA,OAAO,mBAAK,oBAAmB,QAAQ;AAC7C,YAAM,mBAAmB,mBAAK,oBAAmB,aAAa,mBAAK,UAAS,SAAS;AAErF,cAAQ,IAAI,UAAU,GAAG,IAAI,IAAI,QAAQ;AAE3B;AAEd,WAAK,gBAAgB,MAAM,MAAM,cAAc,QAAQ,GAAG,CAAC;AAC3D,WAAK,gBAAgB,MAAM,MAAM,UAAU,IAAI,GAAG,CAAC;AACnD,WAAK,gBAAgB,MAAM,MAAM,sBAAsB,gBAAgB,GAAG,CAAC;AAC3E,WAAK,gBAAgB,MAAM,MAAM,sBAAsB,SAAS,gBAAgB,GAAG,CAAC;AACpF,WAAK,gBAAgB,MAAM,MAAM,qCAAqC,SAAS,+BAAgC,GAAG,CAAC;AAAA,IAAA;AAGvH,wCAAe,YAAY;AACvB,UAAI,mBAAK,qBAAoB;AACnB,cAAA,mBAAK,oBAAmB;AAE9B,aAAK,gBAAgB,MAAM,OAAO,gEAAgE,CAAC;AACnG,aAAK,gBAAgB,MAAM,OAAO,sBAAsB,SAAS,gBAAgB,GAAG,CAAC;AACrF,aAAK,gBAAgB,MAAM,OAAO,qCAAqC,SAAS,+BAAgC,GAAG,CAAC;AAAA,MACxH;AAAA,IAAA;AAKJ;AAAA;AAAA,8CAAqB,YAAY;AAC7B,YAAM,uBAAuB,MAAM,IAAI,iBAAiB,sBAAsB,EACzE,gBAAgB;AAAA,QACb,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,QACP,uBAAuB;AAAA,QACvB,wBAAwB;AAAA,QACxB,aAAa;AAAA,MAAA,CAChB,EACA,YAAY,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAC1C,YAAY,mBAAK,SAAQ,EACzB,mBAAmB,mBAAmB,EACtC,iBAAiB,KAAK,cAAc,+KAA+K,CAAC,EACpN;AAEL,YAAM,MAAM,GAAG;AAEf,YAAM,qBAAqB;IAAK;AAGpC,4CAAmB,YAAY;AACtB,yBAAA,mBAAoB,MAAM,IAAI,iBAAiB,sBAAsB,EACrE,iBAAiB,IAAI,EACrB,gBAAgB;AAAA,QACb,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,QACP,uBAAuB;AAAA,QACvB,wBAAwB;AAAA,QACxB,aAAa;AAAA,MAAA,CAChB,EACA,YAAY,mBAAK,SAAQ,EACzB,mBAAmB,eAAe,EAClC,iBAAiB,KAAK,QAAQ,yBAAyB,IAAI,EAAE,WAAW,cAAe,CAAA,EACvF;AAEL,YAAM,eAAe,mBAAK,mBAAkB,cAAc,IAAI;AAE9D,YAAM,MAAM,GAAG;AACf,yBAAK,WAAY;AACjB,yBAAK,WAAY;AACjB,yBAAK,eAAgB,GAAG,mBAAK,UAAS,IAAI,mBAAK,UAAS;AACnD,WAAA,gBAAgB,MAAM,MAAM,2CAA2C,mBAAK,UAAS,aAAa,mBAAK,UAAS,GAAG,CAAC;AAAA,IAAA;AAG7H,2CAAkB,YAAY;AAC1B,UAAI,mBAAK,oBAAmB;AAClB,cAAA,mBAAK,mBAAkB;AAC7B,cAAM,MAAM,GAAG;AAAA,MACnB;AAAA,IAAA;AAGJ,6CAAoB,YAAY;AAC5B,UAAI,mBAAK,sBAAqB;AACpB,cAAA,mBAAK,qBAAoB;AAC/B,cAAM,MAAM,GAAG;AAAA,MACnB;AAAA,IAAA;AAGJ,8CAAqB,YAAY;AAC7B,aAAO,WAAW,CAAC;AAEnB,YAAM,SAAS,MAAM,KAAK,MAAM,wBAAwB,gBAAgB;AACxE,aAAO,OAAO,MAAM,EAAE,QAAQ,GAAG;AAE5B,WAAA,gBAAgB,MAAM,IAAI,GAAG,KAAK,UAAU,OAAO,IAAI,CAAC,EAAE,CAAC;AAC3D,WAAA,gBAAgB,MAAM,QAAQ,GAAG,KAAK,UAAU,OAAO,OAAO,CAAC,EAAE,CAAC;AACvE,WAAK,gBAAgB,MAAM,OAAO,GAAG,KAAK,UAAU,OAAO,QAAQ,YAAY,CAAC,CAAC,EAAE,CAAC;AAE9E,YAAA,UAAU,OAAO,QAAQ,YAAY;AACtC,WAAA,gBAAgB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;AAClD,WAAK,gBAAgB,MAAM,MAAM,GAAG,KAAK,UAAU,MAAM,OAAO,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAErF,YAAM,SAAS,MAAM,OAAO,MAAM,QAAQ,CAAC,CAAC;AAE5C,YAAM,2BAA2B;AAAA,QAC7B,KAAK;AAAA,QACL,OAAO,OAAO,eAAe,mBAAK,6BAA4B;AAAA,QAC9D,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAGd,YAAM,eAAe,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAC/C,aAAA,YAAY,EAAE,cAAc,wBAAwB;AAE3D,YAAM,mBAAmB,IAAI,KAAK,OAAO,OAAO;AACzC,aAAA,iBAAiB,SAAS,EAAE,iBAAoB,oBAAA,KAAA,GAAO,QAAA,CAAS;AAEvE,YAAM,gBAAgB;AAAA,QAClB,WAAW,OAAO,eAAe,mBAAK,gBAAe;AAAA,QACrD,UAAU,OAAO,eAAe,mBAAK,UAAS;AAAA,QAC9C,iBAAiB;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,MAAA;AAEJ,aAAO,OAAO,KAAK,MAAM,EAAE,cAAc,aAAa;AAAA,IAAA;AAG1D,8CAAqB,YAAY;AACxB,yBAAA,qBAAsB,MAAM,IAAI,iBAAiB,wBAAwB,EACzE,iBAAiB,IAAI,EACrB,gBAAgB;AAAA,QACb,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,QACP,uBAAuB;AAAA,QACvB,wBAAwB;AAAA;AAAA,QAExB,aAAa;AAAA;AAAA;AAAA,QAEb,cAAc;AAAA,QACd,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAOZ,EACA,YAAY,mBAAK,SAAQ,EACzB,mBAAmB,QAAQ,EAC3B,iBAAiB,KAAK,QAAQ,yBAAyB,IAAI,EAAE,WAAW,cAAe,CAAA,EACvF;AAEL,YAAM,iBAAiB,mBAAK,qBAAoB,cAAc,IAAI;AAElE,YAAM,MAAM,GAAG;AAEf,yBAAK,aAAc;AACnB,yBAAK,aAAc;AACnB,yBAAK,iBAAkB,GAAG,mBAAK,YAAW,IAAI,mBAAK,YAAW;AAEzD,WAAA,gBAAgB,MAAM,MAAM,6CAA6C,KAAK,UAAU,aAAa,KAAK,UAAU,GAAG,CAAC;AAAA,IAAA;AApU7H,uBAAK,eAAgB;AAAA,EACzB;AAAA,EAEA,gBAAgB,SAAc;AAC1B,kBAAc,MAAM,OAAO;AAAA,EAC/B;AAAA,EA0BA,IAAI,UAAU;AACV,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,iBAAiB;AACjB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAI,gBAAgB;AAChB,WAAO,mBAAK,gBAAL;AAAA,EACX;AAyQJ;AA7VI;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAUA;"}
@@ -44,7 +44,6 @@ var __privateSet = (obj, member, value, setter) => {
44
44
  return Object.freeze(n);
45
45
  }
46
46
  const tough__namespace = /* @__PURE__ */ _interopNamespaceDefault(tough);
47
- let goptions = stsconfig.$Options();
48
47
  class TestHelper {
49
48
  constructor() {
50
49
  //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url
@@ -70,11 +69,11 @@ var __privateSet = (obj, member, value, setter) => {
70
69
  __privateAdd(this, _GetHttpsAgent, () => {
71
70
  if (__privateGet(this, _httpsAgent) === null) {
72
71
  __privateSet(this, _httpsAgent, new https.Agent({
73
- keepAlive: goptions.keepAlive,
74
- maxSockets: goptions.maxSockets,
75
- maxTotalSockets: goptions.maxTotalSockets,
76
- maxFreeSockets: goptions.maxFreeSockets,
77
- timeout: goptions.timeout,
72
+ keepAlive: stsconfig.goptions.keepAlive,
73
+ maxSockets: stsconfig.goptions.maxSockets,
74
+ maxTotalSockets: stsconfig.goptions.maxTotalSockets,
75
+ maxFreeSockets: stsconfig.goptions.maxFreeSockets,
76
+ timeout: stsconfig.goptions.timeout,
78
77
  rejectUnauthorized: false
79
78
  }));
80
79
  }
@@ -117,7 +116,7 @@ var __privateSet = (obj, member, value, setter) => {
117
116
  code_challenge,
118
117
  code_challenge_method
119
118
  };
120
- const url = `${__privateGet(this, _authEndpoint)}${goptions.asapiroot}/login`;
119
+ const url = `${__privateGet(this, _authEndpoint)}${stsconfig.goptions.asapiroot}/login`;
121
120
  const headers = { "Content-Type": "application/json" };
122
121
  const retVal = await axios({
123
122
  url,
@@ -136,7 +135,7 @@ var __privateSet = (obj, member, value, setter) => {
136
135
  }
137
136
  */
138
137
  __publicField(this, "ValidateJWT", async (token) => {
139
- return await __privateGet(this, _authUtilsNode).ValidateJWT(token, goptions.asapiidentifier, __privateGet(this, _authEndpoint));
138
+ return await __privateGet(this, _authUtilsNode).ValidateJWT(token, stsconfig.goptions.asapiidentifier, __privateGet(this, _authEndpoint));
140
139
  });
141
140
  __publicField(this, "StartDatabase", async () => {
142
141
  __privateSet(this, _databaseContainer, await new testcontainers.GenericContainer("postgres").withExposedPorts(5432).withEnvironment({
@@ -148,19 +147,18 @@ var __privateSet = (obj, member, value, setter) => {
148
147
  const networkIpAddress = __privateGet(this, _databaseContainer).getIpAddress(__privateGet(this, _network).getName());
149
148
  process.env.DB_HOST = `${host}:${httpPort}`;
150
149
  stsconfig.$ResetOptions();
151
- goptions = stsconfig.$Options();
152
150
  this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));
153
151
  this.LogDebugMessage(chalk.green(`host: [${host}]`));
154
152
  this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));
155
- this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));
156
- this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString}]`));
153
+ this.LogDebugMessage(chalk.green(`connectionString: [${stsconfig.goptions.connectionString}]`));
154
+ this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${stsconfig.goptions.defaultDatabaseConnectionString}]`));
157
155
  });
158
156
  __publicField(this, "StopDatabase", async () => {
159
157
  if (__privateGet(this, _databaseContainer)) {
160
158
  await __privateGet(this, _databaseContainer).stop();
161
159
  this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));
162
- this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));
163
- this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString}]`));
160
+ this.LogDebugMessage(chalk.yellow(`connectionString: [${stsconfig.goptions.connectionString}]`));
161
+ this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${stsconfig.goptions.defaultDatabaseConnectionString}]`));
164
162
  }
165
163
  });
166
164
  // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open
@@ -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 { $Options, $ResetOptions } from '@nsshunt/stsconfig'\nlet goptions = $Options()\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 goptions = $Options()\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 desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired: [\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.create',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.read',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.update',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.delete'\n ]\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":["$Options","AuthUtilsNode","defaultLogger","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\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 desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired: [\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.create',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.read',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.update',\n 'api://d8277fce-bb48-44c2-bbf1-257fe13a444b/res01.delete'\n ]\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsdevtools",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "",
5
5
  "main": "./dist/stsdevtools.umd.js",
6
6
  "module": "./dist/stsdevtools.mjs",
@@ -20,9 +20,9 @@
20
20
  "parser": "@babel/eslint-parser"
21
21
  },
22
22
  "dependencies": {
23
- "@nsshunt/stsappframework": "^3.1.117",
24
- "@nsshunt/stsconfig": "^1.25.127",
25
- "@nsshunt/stsutils": "^1.16.59",
23
+ "@nsshunt/stsappframework": "^3.1.123",
24
+ "@nsshunt/stsconfig": "^1.25.131",
25
+ "@nsshunt/stsutils": "^1.16.60",
26
26
  "axios": "^1.6.8",
27
27
  "chalk": "^4.1.2",
28
28
  "dotenv": "^16.4.5",
@@ -31,10 +31,10 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@tsconfig/node20": "^20.1.4",
34
- "@types/node": "^20.12.8",
34
+ "@types/node": "^20.12.12",
35
35
  "@types/tough-cookie": "^4.0.5",
36
- "@typescript-eslint/eslint-plugin": "^7.8.0",
37
- "@typescript-eslint/parser": "^7.8.0",
36
+ "@typescript-eslint/eslint-plugin": "^7.9.0",
37
+ "@typescript-eslint/parser": "^7.9.0",
38
38
  "eslint": "^8.57.0",
39
39
  "typescript": "^5.4.5",
40
40
  "vite": "^5.2.11",
@@ -1 +1 @@
1
- {"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,MAAM,YAAY,CAAA;AAc9B,qBAAa,UAAU;;;IA4BnB,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,QAAQ,MAAM,CAAC,CAEnD;IAED,aAAa,sBAyBZ;IAED,YAAY,sBAQX;IAID,kBAAkB,sBAsBjB;IAED,gBAAgB,sBA0Bf;IAED,eAAe,sBAKd;IAED,iBAAiB,sBAKhB;IAED,kBAAkB,sBA0CjB;IAED,kBAAkB,sBAsCjB;CACJ"}
1
+ {"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,MAAM,YAAY,CAAA;AAa9B,qBAAa,UAAU;;;IA4BnB,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,QAAQ,MAAM,CAAC,CAEnD;IAED,aAAa,sBAwBZ;IAED,YAAY,sBAQX;IAID,kBAAkB,sBAsBjB;IAED,gBAAgB,sBA0Bf;IAED,eAAe,sBAKd;IAED,iBAAiB,sBAKhB;IAED,kBAAkB,sBA0CjB;IAED,kBAAkB,sBAsCjB;CACJ"}