@nsshunt/stsdevtools 1.0.3 → 1.0.4
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
|
@@ -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 {
|
|
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}]`));
|
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 { $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":"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"}
|
package/dist/stsdevtools.umd.js
CHANGED
|
@@ -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
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/stsdevtools.umd.js",
|
|
6
6
|
"module": "./dist/stsdevtools.mjs",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"parser": "@babel/eslint-parser"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@nsshunt/stsappframework": "^3.1.
|
|
24
|
-
"@nsshunt/stsconfig": "^1.25.
|
|
23
|
+
"@nsshunt/stsappframework": "^3.1.118",
|
|
24
|
+
"@nsshunt/stsconfig": "^1.25.130",
|
|
25
25
|
"@nsshunt/stsutils": "^1.16.59",
|
|
26
26
|
"axios": "^1.6.8",
|
|
27
27
|
"chalk": "^4.1.2",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,MAAM,YAAY,CAAA;
|
|
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"}
|