@nsshunt/stsdevtools 1.0.100 → 1.0.101

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"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, STSAxiosConfig, createAgentManager } 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 = createAgentManager({\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://stsauthrunnerinit' // \"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://stsauthrunner', // \"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://<endpoint>\",\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(\"/stsfhir/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://<endpoint>\",\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://<endpoint>'\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"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, STSAxiosConfig, createAgentManager } 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 = createAgentManager({\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\",\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://stsauthrunnerinit' // \"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://stsauthrunner', // \"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://<endpoint>\",\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(\"/stsfhir/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://<endpoint>\",\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://<endpoint>'\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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"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, STSAxiosConfig, createAgentManager } 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 = createAgentManager({\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://stsauthrunnerinit' // \"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://stsauthrunner', // \"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://<endpoint>\",\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(\"/stsfhir/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://<endpoint>\",\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://<endpoint>'\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"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, STSAxiosConfig, createAgentManager } 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 = createAgentManager({\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\",\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://stsauthrunnerinit' // \"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://stsauthrunner', // \"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://<endpoint>\",\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(\"/stsfhir/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://<endpoint>\",\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://<endpoint>'\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsdevtools",
3
- "version": "1.0.100",
3
+ "version": "1.0.101",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -21,23 +21,23 @@
21
21
  "README.md"
22
22
  ],
23
23
  "dependencies": {
24
- "@nsshunt/stsconfig": "^1.27.67",
25
- "@nsshunt/stsutils": "^1.19.105",
24
+ "@nsshunt/stsconfig": "^1.27.68",
25
+ "@nsshunt/stsutils": "^1.19.106",
26
26
  "axios": "^1.16.1",
27
27
  "chalk": "^5.6.2",
28
28
  "testcontainers": "^11.14.0",
29
29
  "tough-cookie": "^6.0.1"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/node": "^25.8.0",
32
+ "@types/node": "^25.9.1",
33
33
  "@types/tough-cookie": "^4.0.5",
34
- "@typescript-eslint/eslint-plugin": "^8.59.3",
35
- "@typescript-eslint/parser": "^8.59.3",
34
+ "@typescript-eslint/eslint-plugin": "^8.60.0",
35
+ "@typescript-eslint/parser": "^8.60.0",
36
36
  "eslint": "^10.4.0",
37
37
  "globals": "^17.6.0",
38
38
  "typescript": "^6.0.3",
39
- "vite": "^8.0.13",
40
- "vitest": "^4.1.6"
39
+ "vite": "^8.0.14",
40
+ "vitest": "^4.1.7"
41
41
  },
42
42
  "repository": {
43
43
  "type": "git",