@nsshunt/stsdevtools 1.0.68 → 1.0.70
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
|
@@ -43,7 +43,9 @@ class TestHelper {
|
|
|
43
43
|
this.#network = await new Network().start();
|
|
44
44
|
};
|
|
45
45
|
StopNetwork = async () => {
|
|
46
|
-
|
|
46
|
+
if (this.#network) {
|
|
47
|
+
await this.#network.stop();
|
|
48
|
+
}
|
|
47
49
|
};
|
|
48
50
|
get network() {
|
|
49
51
|
return this.#network;
|
|
@@ -182,8 +184,10 @@ class TestHelper {
|
|
|
182
184
|
this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));
|
|
183
185
|
};
|
|
184
186
|
StopRedis = async () => {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
+
if (this.#ioRedisContainer) {
|
|
188
|
+
await this.#ioRedisContainer.stop();
|
|
189
|
+
await Sleep(200);
|
|
190
|
+
}
|
|
187
191
|
};
|
|
188
192
|
StartAuthService = async () => {
|
|
189
193
|
this.#stsAuthContainer = await new GenericContainer("serza/stsauth:latest").withExposedPorts(3002).withEnvironment({
|
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\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\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, AgentManager, STSAxiosConfig } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\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 #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\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 fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\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\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = new AgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\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 StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\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://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://stscore.stsmda.org\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhirv2/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\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 StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\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 console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\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 console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stsdevtools.mjs","sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\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, AgentManager, STSAxiosConfig } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\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 #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n if (this.#network) {\n await this.#network.stop();\n }\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 fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\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\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = new AgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\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 StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n if (this.#ioRedisContainer) {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\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://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://stscore.stsmda.org\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhirv2/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\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 StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\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 console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\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 console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/stsdevtools.umd.js
CHANGED
|
@@ -54,7 +54,9 @@
|
|
|
54
54
|
this.#network = await new testcontainers.Network().start();
|
|
55
55
|
};
|
|
56
56
|
StopNetwork = async () => {
|
|
57
|
-
|
|
57
|
+
if (this.#network) {
|
|
58
|
+
await this.#network.stop();
|
|
59
|
+
}
|
|
58
60
|
};
|
|
59
61
|
get network() {
|
|
60
62
|
return this.#network;
|
|
@@ -193,8 +195,10 @@
|
|
|
193
195
|
this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));
|
|
194
196
|
};
|
|
195
197
|
StopRedis = async () => {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
+
if (this.#ioRedisContainer) {
|
|
199
|
+
await this.#ioRedisContainer.stop();
|
|
200
|
+
await stsutils.Sleep(200);
|
|
201
|
+
}
|
|
198
202
|
};
|
|
199
203
|
StartAuthService = async () => {
|
|
200
204
|
this.#stsAuthContainer = await new testcontainers.GenericContainer("serza/stsauth:latest").withExposedPorts(3002).withEnvironment({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stsdevtools.umd.js","sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\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, AgentManager, STSAxiosConfig } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\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 #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\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 fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\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\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = new AgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\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 StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\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://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://stscore.stsmda.org\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhirv2/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\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 StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\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 console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\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 console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":["defaultLogger","Network","goptions","AgentManager","STSAxiosConfig","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\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\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, AgentManager, STSAxiosConfig } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\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 #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n if (this.#network) {\n await this.#network.stop();\n }\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 fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\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\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = new AgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\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 StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n if (this.#ioRedisContainer) {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\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://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://stscore.stsmda.org\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhirv2/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\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 StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\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 console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\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 console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"names":["defaultLogger","Network","goptions","AgentManager","STSAxiosConfig","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.70",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/stsdevtools.umd.js",
|
|
6
6
|
"module": "./dist/stsdevtools.mjs",
|
|
@@ -19,22 +19,22 @@
|
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@nsshunt/stsconfig": "^1.27.
|
|
23
|
-
"@nsshunt/stsutils": "^1.19.
|
|
22
|
+
"@nsshunt/stsconfig": "^1.27.35",
|
|
23
|
+
"@nsshunt/stsutils": "^1.19.46",
|
|
24
24
|
"axios": "^1.12.2",
|
|
25
25
|
"chalk": "^4.1.2",
|
|
26
|
-
"testcontainers": "^11.7.
|
|
26
|
+
"testcontainers": "^11.7.1",
|
|
27
27
|
"tough-cookie": "^6.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@types/node": "^24.6.
|
|
30
|
+
"@types/node": "^24.6.2",
|
|
31
31
|
"@types/tough-cookie": "^4.0.5",
|
|
32
32
|
"@typescript-eslint/eslint-plugin": "^8.45.0",
|
|
33
33
|
"@typescript-eslint/parser": "^8.45.0",
|
|
34
|
-
"eslint": "^9.
|
|
34
|
+
"eslint": "^9.37.0",
|
|
35
35
|
"globals": "^16.4.0",
|
|
36
36
|
"typescript": "^5.9.3",
|
|
37
|
-
"vite": "^7.1.
|
|
37
|
+
"vite": "^7.1.9",
|
|
38
38
|
"vitest": "^3.2.4"
|
|
39
39
|
},
|
|
40
40
|
"repository": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":"AAqBA,qBAAa,UAAU;;;IAgCnB,eAAe,CAAC,OAAO,EAAE,GAAG;IAI5B,YAAY,sBAEX;IAED,WAAW,
|
|
1
|
+
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../src/testHelpers.ts"],"names":[],"mappings":"AAqBA,qBAAa,UAAU;;;IAgCnB,eAAe,CAAC,OAAO,EAAE,GAAG;IAI5B,YAAY,sBAEX;IAED,WAAW,sBAIV;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,QAAQ,WAEX;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,YAAY,WAEf;IAED,IAAI,0BAA0B,WAE7B;IAED,kBAAkB,eAMjB;IAED,KAAK,GAAU,UAAU,MAAM,EAAE,UAAU,MAAM,0DA+DhD;IAUD,aAAa,sBAwBZ;IAED,YAAY,sBAQX;IAID,kBAAkB,sBAsBjB;IAED,UAAU,sBAkBT;IAED,SAAS,sBAKR;IAED,gBAAgB,sBA2Bf;IAED,gBAAgB,sBA2Cf;IAED,eAAe,sBAKd;IAED,iBAAiB,sBAKhB;IAED,eAAe,sBAKd;IAED,kBAAkB,sBAyDjB;IAED,kBAAkB,sBAuCjB;CACJ"}
|