diff --git a/README.md b/README.md index 3543c8ae..105525bc 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,12 @@ be accessed directly on http://localhost:9323/. # To ensure that k6 is operational, run: -k6 run load-tests/tests/smoke.js +k6 run \ + -e BASEURL=http://localhost:8000 \ + -e ADMIN_EMAIL=SHP_Admin@example.com -e ADMIN_PASSWORD=password12345678 \ + -e MERCHANT_EMAIL=service@example.com -e MERCHANT_PASSWORD=thisismypassword \ + -e USER_EMAIL=audrey.young@example.com -e USER_PASSWORD=whyaretherebirds \ + load-tests/tests/smoke.js ``` diff --git a/client/package-lock.json b/client/package-lock.json index 1b7d690e..0060c61a 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -87,7 +87,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -743,7 +742,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1627,7 +1625,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", @@ -2456,7 +2453,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2500,7 +2496,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3181,7 +3176,6 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.4.tgz", "integrity": "sha512-gEQL9pbJZZHT7lYJBKQCS723v1MGys2IFc94COXbUIyCTWa+qC77a7hUax4Yjd5ggEm35dk4AyYABpKKWC4MLw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4", "@mui/core-downloads-tracker": "^7.3.4", @@ -3292,7 +3286,6 @@ "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.3.tgz", "integrity": "sha512-Lqq3emZr5IzRLKaHPuMaLBDVaGvxoh6z7HMWd1RPKawBM5uMRaQ4ImsmmgXWtwJdfZux5eugfDhXJUo2mliS8Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4", "@mui/private-theming": "^7.3.3", @@ -3960,7 +3953,6 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -4502,7 +4494,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -5113,7 +5104,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -5167,7 +5157,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -5543,7 +5532,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5642,7 +5630,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6653,7 +6640,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -8838,7 +8824,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11893,7 +11878,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -12779,7 +12763,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -14979,7 +14962,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -16114,7 +16096,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16607,7 +16588,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16739,7 +16719,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -16874,7 +16853,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -17423,7 +17401,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -17666,7 +17643,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19096,6 +19072,23 @@ } } }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -19527,7 +19520,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -20163,7 +20155,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -20235,7 +20226,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", - "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -20648,7 +20638,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/load-tests/scenarios/admin.js b/load-tests/scenarios/admin.js index 1b758e45..e40430c2 100644 --- a/load-tests/scenarios/admin.js +++ b/load-tests/scenarios/admin.js @@ -3,15 +3,15 @@ import { check, sleep } from 'k6'; const BASE_URL = __ENV.BASEURL || 'http://localhost:8000'; -const TEST_EMAIL = __ENV.TEST_EMAIL; -const TEST_PASSWORD = __ENV.TEST_PASSWORD; +const ADMIN_EMAIL = __ENV.ADMIN_EMAIL; +const ADMIN_PASSWORD = __ENV.ADMIN_PASSWORD; export default function () { // Test login. let loginResult = http.post(`${BASE_URL}/login`, JSON.stringify({ - email: TEST_EMAIL, - password: TEST_PASSWORD, + email: ADMIN_EMAIL, + password: ADMIN_PASSWORD, }), { headers: { 'Content-Type': 'application/json' }, }); diff --git a/load-tests/scenarios/merchant.js b/load-tests/scenarios/merchant.js index fe537e53..9e152a04 100644 --- a/load-tests/scenarios/merchant.js +++ b/load-tests/scenarios/merchant.js @@ -3,16 +3,16 @@ import { check, sleep } from "k6"; const BASE_URL = __ENV.BASEURL || 'http://localhost:8000'; -const TEST_EMAIL = __ENV.TEST_EMAIL; -const TEST_PASSWORD = __ENV.TEST_PASSWORD; +const MERCHANT_EMAIL = __ENV.MERCHANT_EMAIL; +const MERCHANT_PASSWORD = __ENV.MERCHANT_PASSWORD; export default function () { // Test login. let loginResult = http.post( `${BASE_URL}/login`, JSON.stringify({ - email: TEST_EMAIL, - password: TEST_PASSWORD, + email: MERCHANT_EMAIL, + password: MERCHANT_PASSWORD, }), { headers: { "Content-Type": "application/json" }, diff --git a/load-tests/scenarios/user.js b/load-tests/scenarios/user.js index 6b042f38..c3154074 100644 --- a/load-tests/scenarios/user.js +++ b/load-tests/scenarios/user.js @@ -3,16 +3,16 @@ import { check, sleep } from "k6"; const BASE_URL = __ENV.BASEURL || 'http://localhost:8000'; -const TEST_EMAIL = __ENV.TEST_EMAIL; -const TEST_PASSWORD = __ENV.TEST_PASSWORD; +const USER_EMAIL = __ENV.USER_EMAIL; +const USER_PASSWORD = __ENV.USER_PASSWORD; export default function () { // Test login. let loginResult = http.post( `${BASE_URL}/login`, JSON.stringify({ - email: TEST_EMAIL, - password: TEST_PASSWORD, + email: USER_EMAIL, + password: USER_PASSWORD, }), { headers: { "Content-Type": "application/json" }, diff --git a/load-tests/tests/average.js b/load-tests/tests/average.js index f6b6cf7a..c13da445 100644 --- a/load-tests/tests/average.js +++ b/load-tests/tests/average.js @@ -3,23 +3,29 @@ import merchant from '../scenarios/merchant.js'; import admin from '../scenarios/admin.js'; +const HAS_USER = __ENV.USER_EMAIL && __ENV.USER_PASSWORD; +const HAS_MERCHANT = __ENV.MERCHANT_EMAIL && __ENV.MERCHANT_PASSWORD; +const HAS_ADMIN = __ENV.ADMIN_EMAIL && __ENV.ADMIN_PASSWORD; + export const options = { scenarios: { users: { executor: 'constant-vus', - vus: 1000, + vus: 50, duration: '5m', exec: 'runUser', }, + merchants: { executor: 'constant-vus', - vus: 100, + vus: 10, duration: '5m', exec: 'runMerchant', }, + admins: { executor: 'constant-vus', - vus: 5, + vus: 2, duration: '5m', exec: 'runAdmin', }, @@ -27,13 +33,16 @@ export const options = { }; export function runUser() { + if (!HAS_USER) return; user(); } export function runMerchant() { + if (!HAS_USER) return; merchant(); } export function runAdmin() { + if (!HAS_ADMIN) return; admin(); } diff --git a/load-tests/tests/breakpoint.js b/load-tests/tests/breakpoint.js index 067d15ac..ee6e2520 100644 --- a/load-tests/tests/breakpoint.js +++ b/load-tests/tests/breakpoint.js @@ -3,22 +3,23 @@ import merchant from '../scenarios/merchant.js'; import admin from '../scenarios/admin.js'; +const HAS_USER = __ENV.USER_EMAIL && __ENV.USER_PASSWORD; +const HAS_MERCHANT = __ENV.MERCHANT_EMAIL && __ENV.MERCHANT_PASSWORD; +const HAS_ADMIN = __ENV.ADMIN_EMAIL && __ENV.ADMIN_PASSWORD; + export const options = { scenarios: { users: { executor: 'ramping-vus', stages: [ - { duration: '1m', target: 500 }, - { duration: '1m', target: 1000 }, - { duration: '1m', target: 1000 }, - { duration: '1m', target: 2000 }, - { duration: '1m', target: 2500 }, - { duration: '1m', target: 3000 }, - { duration: '1m', target: 3200 }, - { duration: '1m', target: 3400 }, - { duration: '30s', target: 3600 }, - { duration: '30s', target: 3800 }, - { duration: '10s', target: 4000 }, + { duration: '2m', target: 100 }, + { duration: '2m', target: 200 }, + { duration: '2m', target: 400 }, + { duration: '2m', target: 600 }, + { duration: '2m', target: 800 }, + { duration: '2m', target: 1000 }, + { duration: '2m', target: 1500 }, + { duration: '2m', target: 2000 }, ], exec: 'runUser', }, @@ -26,17 +27,14 @@ export const options = { merchants: { executor: 'ramping-vus', stages: [ - { duration: '1m', target: 20 }, - { duration: '1m', target: 40 }, - { duration: '1m', target: 80 }, - { duration: '1m', target: 100 }, - { duration: '1m', target: 150 }, - { duration: '1m', target: 200 }, - { duration: '1m', target: 220 }, - { duration: '1m', target: 240 }, - { duration: '30s', target: 260 }, - { duration: '30s', target: 280 }, - { duration: '10s', target: 300 }, + { duration: '2m', target: 10 }, + { duration: '2m', target: 20 }, + { duration: '2m', target: 40 }, + { duration: '2m', target: 60 }, + { duration: '2m', target: 80 }, + { duration: '2m', target: 100 }, + { duration: '2m', target: 150 }, + { duration: '2m', target: 200 }, ], exec: 'runMerchant', }, @@ -44,16 +42,14 @@ export const options = { admins: { executor: 'ramping-vus', stages: [ - { duration: '1m', target: 5 }, - { duration: '1m', target: 10 }, - { duration: '1m', target: 15 }, - { duration: '1m', target: 20 }, - { duration: '1m', target: 25 }, - { duration: '1m', target: 30 }, - { duration: '1m', target: 35 }, - { duration: '30s', target: 40 }, - { duration: '30s', target: 45 }, - { duration: '10s', target: 50 }, + { duration: '2m', target: 2 }, + { duration: '2m', target: 4 }, + { duration: '2m', target: 8 }, + { duration: '2m', target: 12 }, + { duration: '2m', target: 16 }, + { duration: '2m', target: 20 }, + { duration: '2m', target: 30 }, + { duration: '2m', target: 40 }, ], exec: 'runAdmin', }, @@ -61,13 +57,16 @@ export const options = { }; export function runUser() { + if (!HAS_USER) return; user(); } export function runMerchant() { + if (!HAS_USER) return; merchant(); } export function runAdmin() { + if (!HAS_ADMIN) return; admin(); } diff --git a/load-tests/tests/smoke.js b/load-tests/tests/smoke.js index a93dcede..3ffbec08 100644 --- a/load-tests/tests/smoke.js +++ b/load-tests/tests/smoke.js @@ -3,6 +3,10 @@ import merchant from '../scenarios/merchant.js'; import admin from '../scenarios/admin.js'; +const HAS_USER = __ENV.USER_EMAIL && __ENV.USER_PASSWORD; +const HAS_MERCHANT = __ENV.MERCHANT_EMAIL && __ENV.MERCHANT_PASSWORD; +const HAS_ADMIN = __ENV.ADMIN_EMAIL && __ENV.ADMIN_PASSWORD; + export const options = { scenarios: { users: { @@ -26,15 +30,18 @@ export const options = { }, }; - export function runUser() { + if (!HAS_USER) return; user(); } export function runMerchant() { + if (!HAS_USER) return; merchant(); } export function runAdmin() { + if (!HAS_ADMIN) return; admin(); } + \ No newline at end of file diff --git a/load-tests/tests/soak.js b/load-tests/tests/soak.js index a59e71f9..62ec7a3a 100644 --- a/load-tests/tests/soak.js +++ b/load-tests/tests/soak.js @@ -3,23 +3,29 @@ import merchant from '../scenarios/merchant.js'; import admin from '../scenarios/admin.js'; +const HAS_USER = __ENV.USER_EMAIL && __ENV.USER_PASSWORD; +const HAS_MERCHANT = __ENV.MERCHANT_EMAIL && __ENV.MERCHANT_PASSWORD; +const HAS_ADMIN = __ENV.ADMIN_EMAIL && __ENV.ADMIN_PASSWORD; + export const options = { scenarios: { users: { executor: 'constant-vus', - vus: 200, + vus: 50, duration: '2h', exec: 'runUser', }, + merchants: { executor: 'constant-vus', - vus: 20, + vus: 5, duration: '2h', exec: 'runMerchant', }, + admins: { executor: 'constant-vus', - vus: 5, + vus: 1, duration: '2h', exec: 'runAdmin', }, @@ -27,13 +33,17 @@ export const options = { }; export function runUser() { + if (!HAS_USER) return; user(); } export function runMerchant() { + if (!HAS_USER) return; merchant(); } export function runAdmin() { + if (!HAS_ADMIN) return; admin(); } + \ No newline at end of file diff --git a/load-tests/tests/spike.js b/load-tests/tests/spike.js index 0b8fe3e6..20711cad 100644 --- a/load-tests/tests/spike.js +++ b/load-tests/tests/spike.js @@ -3,15 +3,19 @@ import merchant from '../scenarios/merchant.js'; import admin from '../scenarios/admin.js'; +const HAS_USER = __ENV.USER_EMAIL && __ENV.USER_PASSWORD; +const HAS_MERCHANT = __ENV.MERCHANT_EMAIL && __ENV.MERCHANT_PASSWORD; +const HAS_ADMIN = __ENV.ADMIN_EMAIL && __ENV.ADMIN_PASSWORD; + export const options = { scenarios: { users: { executor: 'ramping-vus', stages: [ - { duration: '30s', target: 200 }, - { duration: '30s', target: 1000 }, - { duration: '1m', target: 2000 }, - { duration: '30s', target: 200 }, + { duration: '30s', target: 50 }, + { duration: '30s', target: 500 }, + { duration: '1m', target: 500 }, + { duration: '30s', target: 50 }, ], exec: 'runUser', }, @@ -19,10 +23,10 @@ export const options = { merchants: { executor: 'ramping-vus', stages: [ - { duration: '30s', target: 20 }, - { duration: '30s', target: 200 }, - { duration: '1m', target: 400 }, - { duration: '30s', target: 20 }, + { duration: '30s', target: 5 }, + { duration: '30s', target: 50 }, + { duration: '1m', target: 50 }, + { duration: '30s', target: 5 }, ], exec: 'runMerchant', }, @@ -30,10 +34,10 @@ export const options = { admins: { executor: 'ramping-vus', stages: [ - { duration: '30s', target: 5 }, + { duration: '30s', target: 1 }, { duration: '30s', target: 10 }, - { duration: '1m', target: 30 }, - { duration: '30s', target: 5 }, + { duration: '1m', target: 10 }, + { duration: '30s', target: 1 }, ], exec: 'runAdmin', }, @@ -41,13 +45,16 @@ export const options = { }; export function runUser() { + if (!HAS_USER) return; user(); } export function runMerchant() { + if (!HAS_USER) return; merchant(); } export function runAdmin() { + if (!HAS_ADMIN) return; admin(); } diff --git a/load-tests/tests/stress.js b/load-tests/tests/stress.js index 7e810f54..76e306f9 100644 --- a/load-tests/tests/stress.js +++ b/load-tests/tests/stress.js @@ -3,15 +3,19 @@ import merchant from '../scenarios/merchant.js'; import admin from '../scenarios/admin.js'; +const HAS_USER = __ENV.USER_EMAIL && __ENV.USER_PASSWORD; +const HAS_MERCHANT = __ENV.MERCHANT_EMAIL && __ENV.MERCHANT_PASSWORD; +const HAS_ADMIN = __ENV.ADMIN_EMAIL && __ENV.ADMIN_PASSWORD; + export const options = { scenarios: { users: { executor: 'ramping-vus', stages: [ - { duration: '1m', target: 100 }, + { duration: '1m', target: 50 }, + { duration: '2m', target: 150 }, { duration: '2m', target: 300 }, - { duration: '2m', target: 600 }, - { duration: '2m', target: 1000 }, + { duration: '2m', target: 500 }, { duration: '1m', target: 0 }, ], exec: 'runUser', @@ -20,10 +24,10 @@ export const options = { merchants: { executor: 'ramping-vus', stages: [ - { duration: '1m', target: 25 }, - { duration: '2m', target: 100 }, - { duration: '2m', target: 200 }, - { duration: '2m', target: 300 }, + { duration: '1m', target: 5 }, + { duration: '2m', target: 15 }, + { duration: '2m', target: 30 }, + { duration: '2m', target: 50 }, { duration: '1m', target: 0 }, ], exec: 'runMerchant', @@ -32,10 +36,10 @@ export const options = { admins: { executor: 'ramping-vus', stages: [ - { duration: '1m', target: 5 }, - { duration: '2m', target: 20 }, - { duration: '2m', target: 50 }, - { duration: '2m', target: 80 }, + { duration: '1m', target: 1 }, + { duration: '2m', target: 3 }, + { duration: '2m', target: 6 }, + { duration: '2m', target: 10 }, { duration: '1m', target: 0 }, ], exec: 'runAdmin', @@ -44,13 +48,17 @@ export const options = { }; export function runUser() { + if (!HAS_USER) return; user(); } export function runMerchant() { + if (!HAS_USER) return; merchant(); } export function runAdmin() { + if (!HAS_ADMIN) return; admin(); } + \ No newline at end of file diff --git a/server/routers/health_prediction.py b/server/routers/health_prediction.py index 28eb6f86..641a4af9 100644 --- a/server/routers/health_prediction.py +++ b/server/routers/health_prediction.py @@ -319,7 +319,6 @@ async def upload_csv(request: Request, uploaded_file: UploadFile = File(...), if not patient: skipped_rows += 1 - # TODO: Create the Patient if they don't exist. continue try: