dceky 1.2.5 → 1.4.1

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/README.md CHANGED
@@ -41,12 +41,12 @@ To start running ky tests, use one of these two options:
41
41
  1. Run `npm run ky:start` and follow the chooser prompts.
42
42
  2. Set environment variables before running `npm run ky:start`, either in your shell or in a `.env` file at the project root.
43
43
 
44
- The chooser guides you through whether tests run visibly or headless, which profile(s) to use, which browser(s) to use, which e2e test folder to run, and the "Num Test Files in Parallel Per Combo" for headless runs.
44
+ The chooser guides you through whether tests run visibly or headless, which profile(s) to use, which browser(s) to use, which e2e test folder to run, the "Num Test Files in Parallel Per Combo", and the "Num Combos in Parallel" for headless runs.
45
45
 
46
46
  To set environment variables directly in your shell, run:
47
47
 
48
48
  ```sh
49
- HEADLESS=true BROWSER=chrome,webkit PROFILE=Stage E2E_TEST_FOLDER=Activities THREADS_PER_COMBO=2 npm run ky:start
49
+ HEADLESS=true BROWSER=chrome,webkit PROFILE=Stage E2E_TEST_FOLDER=Activities THREADS_PER_COMBO=2 NUM_COMBOS_IN_PARALLEL=1 npm run ky:start
50
50
  ```
51
51
 
52
52
  Or create a `.env` file:
@@ -57,6 +57,7 @@ BROWSER=chrome,webkit
57
57
  PROFILE=Stage
58
58
  E2E_TEST_FOLDER=Activities
59
59
  THREADS_PER_COMBO=2
60
+ NUM_COMBOS_IN_PARALLEL=1
60
61
  ```
61
62
 
62
63
  Environment variables:
@@ -68,6 +69,7 @@ Environment variables:
68
69
  | `PROFILE` | Profile(s) to run, as a comma-separated list such as `Stage` or `Stage,Prod`. Visible runs use one profile; headless runs can use multiple. If omitted, ky asks in the chooser. |
69
70
  | `E2E_TEST_FOLDER` | E2E test folder to run for headless runs. Use a folder path under `cypress/e2e`, such as `Activities` or `Activities/Respond`. Use `all`, `*`, or `.` to run all e2e tests. If omitted, ky asks in the chooser. |
70
71
  | `THREADS_PER_COMBO` | Number of test files to run in parallel for each profile and browser combination during headless runs. Use a positive whole number. If omitted, ky asks for a number and uses `1` when left blank. |
72
+ | `NUM_COMBOS_IN_PARALLEL` | Number of profile and browser combinations to run in parallel during headless runs. Use a positive whole number. If omitted, ky asks for a number and uses `1` when left blank. |
71
73
 
72
74
  ### Setup Ky: `npm run ky:setup`
73
75
 
@@ -14,6 +14,9 @@ const LOGIN_PAGE = 'https://harvard.proxy.cirrusidentity.com/cas/login?service=h
14
14
  const IDP_BASE_URL = 'https://apps.cirrusidentity.com';
15
15
  // HarvardKey IdP button ID on Cirrus discovery page
16
16
  const HARVARDKEY_IDP_BUTTON_ID = 'idp_1001962798_button';
17
+ // TODO: Update to have a better of way of determining user agent
18
+ // Force a non-headless User-Agent; the IdP WAF rejects the default headless UA
19
+ const LOGIN_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36';
17
20
  /*----------------------------------------*/
18
21
  /* --------------- Command -------------- */
19
22
  /*----------------------------------------*/
@@ -31,7 +34,7 @@ const logIntoPorta = () => {
31
34
  if (!username || !password) {
32
35
  throw new Error(`Credential "${name}" is missing username and/or password`);
33
36
  }
34
- const htmlHeaders = { accept: 'text/html' };
37
+ const htmlHeaders = { accept: 'text/html', 'user-agent': LOGIN_USER_AGENT };
35
38
  // Request 1: GET Cirrus Identity discovery page
36
39
  cy.sendRequest({
37
40
  url: LOGIN_PAGE,
@@ -1 +1 @@
1
- {"version":3,"file":"logIntoPorta.js","sourceRoot":"","sources":["../../../src/commands/logIntoPorta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logIntoPorta.js","sourceRoot":"","sources":["../../../src/commands/logIntoPorta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Default number of profile/browser combos to run in parallel
3
+ * @author Yuen Ler Chow
4
+ */
5
+ declare const DEFAULT_NUM_COMBOS_IN_PARALLEL = 1;
6
+ export default DEFAULT_NUM_COMBOS_IN_PARALLEL;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Default number of profile/browser combos to run in parallel
5
+ * @author Yuen Ler Chow
6
+ */
7
+ const DEFAULT_NUM_COMBOS_IN_PARALLEL = 1;
8
+ exports.default = DEFAULT_NUM_COMBOS_IN_PARALLEL;
9
+ //# sourceMappingURL=DEFAULT_NUM_COMBOS_IN_PARALLEL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DEFAULT_NUM_COMBOS_IN_PARALLEL.js","sourceRoot":"","sources":["../../../start/constants/DEFAULT_NUM_COMBOS_IN_PARALLEL.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEzC,kBAAe,8BAA8B,CAAC"}
@@ -1,17 +1,19 @@
1
1
  import Profile from '../types/Profile';
2
2
  /**
3
- * Execute all headless Cypress test combinations in parallel
3
+ * Execute all headless Cypress test combinations
4
4
  * @author Yuen Ler Chow
5
5
  * @param opts - object of arguments
6
6
  * @param opts.selectedProfiles - Array of selected profiles
7
7
  * @param opts.selectedBrowsers - Array of selected browsers
8
8
  * @param opts.threadsPerCombo - Number of parallel threads per combo
9
+ * @param opts.numCombosInParallel - Number of profile/browser combos to run in parallel
9
10
  * @param opts.e2eSpecPattern - E2E test spec glob
10
11
  */
11
12
  declare const executeAllHeadlessCombinations: (opts: {
12
13
  selectedProfiles: Profile[];
13
14
  selectedBrowsers: string[];
14
15
  threadsPerCombo: number;
16
+ numCombosInParallel: number;
15
17
  e2eSpecPattern: string;
16
18
  }) => Promise<void>;
17
19
  export default executeAllHeadlessCombinations;
@@ -16,6 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
16
16
  const fs_1 = __importDefault(require("fs"));
17
17
  const path_1 = __importDefault(require("path"));
18
18
  const clear_1 = __importDefault(require("clear"));
19
+ const dce_commonkit_1 = require("dce-commonkit");
19
20
  // Import helpers
20
21
  const runCypressHeadless_1 = __importDefault(require("./runCypressHeadless"));
21
22
  const getDateLabeledDir_1 = __importDefault(require("./getDateLabeledDir"));
@@ -23,16 +24,17 @@ const generateReportHomepage_1 = __importDefault(require("./generateReportHomepa
23
24
  const mergeAllReportsAndGenerateHtml_1 = __importDefault(require("./mergeAllReportsAndGenerateHtml"));
24
25
  const print_1 = __importDefault(require("./print"));
25
26
  /**
26
- * Execute all headless Cypress test combinations in parallel
27
+ * Execute all headless Cypress test combinations
27
28
  * @author Yuen Ler Chow
28
29
  * @param opts - object of arguments
29
30
  * @param opts.selectedProfiles - Array of selected profiles
30
31
  * @param opts.selectedBrowsers - Array of selected browsers
31
32
  * @param opts.threadsPerCombo - Number of parallel threads per combo
33
+ * @param opts.numCombosInParallel - Number of profile/browser combos to run in parallel
32
34
  * @param opts.e2eSpecPattern - E2E test spec glob
33
35
  */
34
36
  const executeAllHeadlessCombinations = (opts) => __awaiter(void 0, void 0, void 0, function* () {
35
- const { selectedProfiles, selectedBrowsers, threadsPerCombo, e2eSpecPattern, } = opts;
37
+ const { selectedProfiles, selectedBrowsers, threadsPerCombo, numCombosInParallel, e2eSpecPattern, } = opts;
36
38
  // Create date-labeled output directory
37
39
  const outputDir = (0, getDateLabeledDir_1.default)();
38
40
  if (!fs_1.default.existsSync(outputDir)) {
@@ -49,18 +51,23 @@ const executeAllHeadlessCombinations = (opts) => __awaiter(void 0, void 0, void
49
51
  });
50
52
  });
51
53
  });
52
- console.log(`🔄 Running ${combinations.length} test combination(s) in parallel...\n`);
53
- // Run all combinations in parallel
54
- const runPromises = combinations.map((combo) => {
55
- return (0, runCypressHeadless_1.default)({
56
- profileName: combo.profileName,
57
- browser: combo.browser,
58
- outputDir,
59
- numThreads: threadsPerCombo,
60
- e2eSpecPattern,
54
+ const comboParallelism = Math.min(numCombosInParallel, combinations.length);
55
+ console.log(`🔄 Running ${combinations.length} test combination(s) `
56
+ + `with up to ${comboParallelism} combo(s) in parallel...\n`);
57
+ const taskFunctions = combinations.map((combo, comboIndex) => {
58
+ return () => __awaiter(void 0, void 0, void 0, function* () {
59
+ console.log(`▶️ Running combo ${comboIndex + 1}/${combinations.length}: `
60
+ + `${combo.profileName} + ${combo.browser}\n`);
61
+ return (0, runCypressHeadless_1.default)({
62
+ profileName: combo.profileName,
63
+ browser: combo.browser,
64
+ outputDir,
65
+ numThreads: threadsPerCombo,
66
+ e2eSpecPattern,
67
+ });
61
68
  });
62
69
  });
63
- const results = yield Promise.all(runPromises);
70
+ const results = yield (0, dce_commonkit_1.parallelLimit)(taskFunctions, comboParallelism);
64
71
  // Generate combined HTML report across all profile+browser combinations
65
72
  (0, mergeAllReportsAndGenerateHtml_1.default)(outputDir, results);
66
73
  // Generate report homepage
@@ -1 +1 @@
1
- {"version":3,"file":"executeAllHeadlessCombinations.js","sourceRoot":"","sources":["../../../start/helpers/executeAllHeadlessCombinations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executeAllHeadlessCombinations.js","sourceRoot":"","sources":["../../../start/helpers/executeAllHeadlessCombinations.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import Profile from '../types/Profile';
7
7
  * @param opts.selectedBrowsers - Array of selected browsers
8
8
  * @param opts.isHeadless - Whether to run in headless mode
9
9
  * @param opts.threadsPerCombo - Number of parallel threads per combo
10
+ * @param opts.numCombosInParallel - Number of profile/browser combos to run in parallel
10
11
  * @param opts.e2eTestFolder - E2E test folder label
11
12
  * @param opts.e2eSpecPattern - E2E test spec glob
12
13
  */
@@ -15,6 +16,7 @@ declare const executeCypress: (opts: {
15
16
  selectedBrowsers: string[];
16
17
  isHeadless: boolean;
17
18
  threadsPerCombo: number;
19
+ numCombosInParallel: number;
18
20
  e2eTestFolder: string;
19
21
  e2eSpecPattern: string;
20
22
  }) => Promise<void>;
@@ -24,11 +24,12 @@ const executeAllHeadlessCombinations_1 = __importDefault(require("./executeAllHe
24
24
  * @param opts.selectedBrowsers - Array of selected browsers
25
25
  * @param opts.isHeadless - Whether to run in headless mode
26
26
  * @param opts.threadsPerCombo - Number of parallel threads per combo
27
+ * @param opts.numCombosInParallel - Number of profile/browser combos to run in parallel
27
28
  * @param opts.e2eTestFolder - E2E test folder label
28
29
  * @param opts.e2eSpecPattern - E2E test spec glob
29
30
  */
30
31
  const executeCypress = (opts) => __awaiter(void 0, void 0, void 0, function* () {
31
- const { selectedProfiles, selectedBrowsers, isHeadless, threadsPerCombo, e2eTestFolder, e2eSpecPattern, } = opts;
32
+ const { selectedProfiles, selectedBrowsers, isHeadless, threadsPerCombo, numCombosInParallel, e2eTestFolder, e2eSpecPattern, } = opts;
32
33
  console.log('\n═══════════════════════════════════════════════════════════');
33
34
  console.log('Starting Cypress with the following configuration:');
34
35
  console.log(`Profile(s): ${selectedProfiles.map((p) => { return p.profileName; }).join(', ')}`);
@@ -37,6 +38,7 @@ const executeCypress = (opts) => __awaiter(void 0, void 0, void 0, function* ()
37
38
  if (isHeadless) {
38
39
  console.log(`E2E test folder: ${e2eTestFolder}`);
39
40
  console.log(`Num Test Files in Parallel Per Combo: ${threadsPerCombo}`);
41
+ console.log(`Num Combos in Parallel: ${numCombosInParallel}`);
40
42
  }
41
43
  console.log('═══════════════════════════════════════════════════════════\n');
42
44
  try {
@@ -51,6 +53,7 @@ const executeCypress = (opts) => __awaiter(void 0, void 0, void 0, function* ()
51
53
  selectedProfiles,
52
54
  selectedBrowsers,
53
55
  threadsPerCombo,
56
+ numCombosInParallel,
54
57
  e2eSpecPattern,
55
58
  });
56
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"executeCypress.js","sourceRoot":"","sources":["../../../start/helpers/executeCypress.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;;;;;;;;;;AAK/B,iBAAiB;AACjB,4EAAoD;AACpD,sGAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,CACrB,IAOC,EACc,EAAE;IACjB,MAAM,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,GACf,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,eAAe,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,wCAAwC;YACxC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAA,2BAAiB,EAAC,WAAW,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,IAAA,wCAA8B,EAAC;gBACnC,gBAAgB;gBAChB,gBAAgB;gBAChB,eAAe;gBACf,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,kBAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"executeCypress.js","sourceRoot":"","sources":["../../../start/helpers/executeCypress.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;;;;;;;;;;AAK/B,iBAAiB;AACjB,4EAAoD;AACpD,sGAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,cAAc,GAAG,CACrB,IAQC,EACc,EAAE;IACjB,MAAM,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,cAAc,GACf,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,eAAe,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,2BAA2B,mBAAmB,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,wCAAwC;YACxC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAA,2BAAiB,EAAC,WAAW,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,IAAA,wCAA8B,EAAC;gBACnC,gBAAgB;gBAChB,gBAAgB;gBAChB,eAAe;gBACf,mBAAmB;gBACnB,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,kBAAe,cAAc,CAAC"}
@@ -38,6 +38,7 @@ const getE2ETestFoldersForChooser_1 = __importDefault(require("./helpers/getE2ET
38
38
  const findE2ETestFolderByName_1 = __importDefault(require("./helpers/findE2ETestFolderByName"));
39
39
  // Import constants
40
40
  const DEFAULT_THREADS_PER_COMBO_1 = __importDefault(require("./constants/DEFAULT_THREADS_PER_COMBO"));
41
+ const DEFAULT_NUM_COMBOS_IN_PARALLEL_1 = __importDefault(require("./constants/DEFAULT_NUM_COMBOS_IN_PARALLEL"));
41
42
  const ALL_E2E_TESTS_LABEL_1 = __importDefault(require("./constants/ALL_E2E_TESTS_LABEL"));
42
43
  const ALL_E2E_TESTS_SPEC_PATTERN_1 = __importDefault(require("./constants/ALL_E2E_TESTS_SPEC_PATTERN"));
43
44
  // Get the project directory
@@ -92,6 +93,9 @@ isHeadless = !!(envHeadlessRaw && envHeadlessRaw.toLowerCase() !== 'false');
92
93
  // Check for THREADS_PER_COMBO
93
94
  const threadsRaw = process.env.THREADS_PER_COMBO;
94
95
  let threadsPerCombo = DEFAULT_THREADS_PER_COMBO_1.default;
96
+ // Check for NUM_COMBOS_IN_PARALLEL
97
+ const numCombosInParallelRaw = process.env.NUM_COMBOS_IN_PARALLEL;
98
+ let numCombosInParallel = DEFAULT_NUM_COMBOS_IN_PARALLEL_1.default;
95
99
  const start = () => __awaiter(void 0, void 0, void 0, function* () {
96
100
  // If headless wasn't specified, ask the user to choose
97
101
  if (!envHeadlessRaw) {
@@ -111,6 +115,40 @@ const start = () => __awaiter(void 0, void 0, void 0, function* () {
111
115
  ? (0, getCypressDetectedBrowsersForChooser_1.default)()
112
116
  : null);
113
117
  if (isHeadless) {
118
+ if (numCombosInParallelRaw) {
119
+ const trimmedNumCombos = numCombosInParallelRaw.trim();
120
+ const parsed = Number.parseInt(trimmedNumCombos, 10);
121
+ if (/^\d+$/.test(trimmedNumCombos) && parsed > 0) {
122
+ numCombosInParallel = parsed;
123
+ }
124
+ else {
125
+ console.warn(`⚠️ Invalid NUM_COMBOS_IN_PARALLEL value: "${numCombosInParallelRaw}". `
126
+ + 'Use a positive whole number. '
127
+ + `Using default (${DEFAULT_NUM_COMBOS_IN_PARALLEL_1.default}).`);
128
+ }
129
+ }
130
+ else {
131
+ let parsedNumCombos = null;
132
+ (0, clear_1.default)();
133
+ print_1.default.title('Num Combos in Parallel');
134
+ console.log('');
135
+ print_1.default.subtitle('How many profile/browser combos should run in parallel? (Press Enter for 1)');
136
+ while (parsedNumCombos === null) {
137
+ const response = (0, prompt_1.default)('> ', true).trim();
138
+ if (!response) {
139
+ parsedNumCombos = DEFAULT_NUM_COMBOS_IN_PARALLEL_1.default;
140
+ }
141
+ else {
142
+ const parsed = Number.parseInt(response, 10);
143
+ parsedNumCombos = /^\d+$/.test(response) && parsed > 0 ? parsed : null;
144
+ }
145
+ if (parsedNumCombos === null) {
146
+ console.log('Please enter a positive whole number, or press Enter for 1.');
147
+ console.log('');
148
+ }
149
+ }
150
+ numCombosInParallel = parsedNumCombos;
151
+ }
114
152
  if (threadsRaw) {
115
153
  const trimmedThreads = threadsRaw.trim();
116
154
  const parsed = Number.parseInt(trimmedThreads, 10);
@@ -287,6 +325,7 @@ const start = () => __awaiter(void 0, void 0, void 0, function* () {
287
325
  selectedBrowsers,
288
326
  isHeadless,
289
327
  threadsPerCombo,
328
+ numCombosInParallel,
290
329
  e2eTestFolder: selectedE2ETestFolder,
291
330
  e2eSpecPattern: selectedE2ESpecPattern,
292
331
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../start/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../start/index.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B;;;;;GAKG;;;;;;;;;;;;;;AAEH,cAAc;AACd,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAC5B,kDAA0B;AAE1B,iBAAiB;AACjB,wEAAgD;AAChD,wFAAgE;AAChE,wFAAgE;AAChE,kFAA0D;AAC1D,wEAAgD;AAChD,8DAAsC;AACtC,4DAAoC;AACpC,8EAAsD;AACtD,0HAAkG;AAClG,wGAAgF;AAChF,gGAAwE;AAExE,mBAAmB;AACnB,sGAA8E;AAC9E,gHAAwF;AACxF,0FAAkE;AAClE,wGAAgF;AAEhF,4BAA4B;AAC5B,MAAM,GAAG,GAAG,IAAA,qBAAW,GAAE,CAAC;AAE1B,sDAAsD;AACtD,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAEhD,kDAAkD;AAClD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AACvD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,4CAA4C,WAAW,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,gEAAgE;AAChE,MAAM,YAAY,GAAG,CACnB,YAAE;KACC,WAAW,CAAC,WAAW,CAAC;KACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;IACZ,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC,CAAC,CACL,CAAC;AAEF,8CAA8C;AAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,4BAA4B;AAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,yBAAyB,WAAW,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,4CAA4C;AAC5C,IAAI,gBAAgB,GAA4C,EAAE,CAAC;AACnE,IAAI,gBAAgB,GAAa,EAAE,CAAC;AACpC,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,qBAAqB,GAAG,6BAAmB,CAAC;AAChD,IAAI,sBAAsB,GAAG,oCAA0B,CAAC;AAExD,oBAAoB;AACpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAEvC,IAAI,UAAU,EAAE,CAAC;IACf,MAAM,YAAY,GAAG,IAAA,6BAAmB,EAAC,UAAU,CAAC,CAAC;IACrD,gBAAgB,GAAG,IAAA,6BAAmB,EAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAEvC,IAAI,UAAU,EAAE,CAAC;IACf,MAAM,YAAY,GAAG,IAAA,6BAAmB,EAAC,UAAU,CAAC,CAAC;IACrD,gBAAgB,GAAG,IAAA,0BAAgB,EAAC,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,4BAA4B;AAC5B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAErD,qBAAqB;AACrB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5C,UAAU,GAAG,CAAC,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;AAE5E,8BAA8B;AAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACjD,IAAI,eAAe,GAAG,mCAAyB,CAAC;AAEhD,mCAAmC;AACnC,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAClE,IAAI,mBAAmB,GAAG,wCAA8B,CAAC;AAEzD,MAAM,KAAK,GAAG,GAAwB,EAAE;IACxC,uDAAuD;IACrD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC;YAC1B,QAAQ,EAAE,uBAAuB;YACjC,OAAO,EAAE;gBACP,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE;gBAC3C,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,EAAE;aAC9C;YACD,KAAK,EAAE,aAAa;YACpB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QAEH,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACtC,CAAC;IAED,qGAAqG;IACrG,MAAM,8BAA8B,GAAG,CACrC,UAAU,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QACzC,CAAC,CAAC,IAAA,8CAAoC,GAAE;QACxC,CAAC,CAAC,IAAI,CACT,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,sBAAsB,EAAE,CAAC;YAC3B,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,mBAAmB,GAAG,MAAM,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,6CAA6C,sBAAsB,KAAK;sBACxE,+BAA+B;sBAC/B,kBAAkB,wCAA8B,IAAI,CACrD,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,eAAe,GAAkB,IAAI,CAAC;YAC1C,IAAA,eAAK,GAAE,CAAC;YACR,eAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,eAAK,CAAC,QAAQ,CAAC,6EAA6E,CAAC,CAAC;YAC9F,OAAO,eAAe,KAAK,IAAI,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,IAAA,gBAAM,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,eAAe,GAAG,wCAA8B,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC7C,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzE,CAAC;gBAED,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,mBAAmB,GAAG,eAAe,CAAC;QACxC,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,eAAe,GAAG,MAAM,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,wCAAwC,UAAU,KAAK;sBACvD,+BAA+B;sBAC/B,kBAAkB,mCAAyB,IAAI,CAChD,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,aAAa,GAAkB,IAAI,CAAC;YACxC,IAAA,eAAK,GAAE,CAAC;YACR,eAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,eAAK,CAAC,QAAQ,CAAC,2FAA2F,CAAC,CAAC;YAC5G,OAAO,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAA,gBAAM,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,aAAa,GAAG,mCAAyB,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC7C,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvE,CAAC;gBAED,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,eAAe,GAAG,aAAa,CAAC;QAClC,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,uBAAuB,GAAG,IAAA,qCAA2B,GAAE,CAAC;QAE9D,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,IAAA,iCAAuB,EAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;YACxF,qBAAqB,GAAG,YAAY,CAAC,WAAW,CAAC;YACjD,sBAAsB,GAAG,YAAY,CAAC,WAAW,CAAC;QACpD,CAAC;aAAM,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC;gBAC1B,QAAQ,EAAE,yBAAyB;gBACnC,OAAO,EAAE;oBACP;wBACE,GAAG,EAAE,GAAG;wBACR,WAAW,EAAE,6BAAmB;qBACjC;oBACD,GAAG,uBAAuB;iBAC3B;gBACD,KAAK,EAAE,kBAAkB;gBACzB,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC7C,OAAO,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC7D,OAAO,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACvC,CAAC,CAAC,CAAC;gBACH,IAAI,cAAc,EAAE,CAAC;oBACnB,qBAAqB,GAAG,cAAc,CAAC,YAAY,CAAC;oBACpD,sBAAsB,GAAG,cAAc,CAAC,WAAW,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,UAAU,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,iBAAiB,GAAG,MAAM,8BAA8B,CAAC;QAC/D,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;YAC3G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;YACtD,OAAO;gBACL,GAAG;gBACH,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,OAAO,CAAC;gBACd,GAAG,EAAE,GAAG;gBACR,WAAW,EAAE,cAAc;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC;YAC1B,QAAQ,EAAE,8CAA8C;YACxD,OAAO;YACP,KAAK,EAAE,mBAAmB;YAC1B,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAChD,OAAO,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,IAAI,iBAAiB,EAAE,CAAC;YACtB,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC7C,OAAO,CAAC,CAAC,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,gBAAgB,GAAG,CACjB,OAAO;iBACJ,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;;gBACd,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;oBACzD,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAChE,CAAC,CAAC,CAAC;gBACH,OAAO,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,mCAAI,IAAI,CAAC;YACvC,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACf,OAAO,IAAI,KAAK,IAAI,CAAC;YACvB,CAAC,CAAC,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,wDAAwD;IACxD,2DAA2D;IAC3D,qHAAqH;IACrH,IACE,gBAAgB,CAAC,MAAM,KAAK,CAAC;WAC5B,CAAC,CAAC,UAAU,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,EAC7C,CAAC;QACH,wDAAwD;QACtD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9C,OAAO,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YAC/C,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,wEAAwE;QACxE,IAAI,UAAU,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC;gBACd,GAAG,EAAE,GAAG;gBACR,WAAW,EAAE,cAAc;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC;YAC1B,QAAQ,EAAE,CACR,UAAU;gBACR,CAAC,CAAC,+CAA+C;gBACjD,CAAC,CAAC,iBAAiB,CACtB;YACD,OAAO;YACP,KAAK,EAAE,iBAAiB,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/C,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAChD,OAAO,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,IAAI,iBAAiB,EAAE,CAAC;YACtB,gBAAgB,GAAG,iBAAiB,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,gBAAgB,GAAG,CACjB,OAAO;iBACJ,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;;gBACd,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACzD,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC/B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,MAAA,iBAAiB,CAAC,YAAY,CAAC,mCAAI,IAAI,CAAC;YACjD,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;gBAClB,OAAO,OAAO,KAAK,IAAI,CAAC;YAC1B,CAAC,CAAC,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,IAAA,wBAAc,EAAC;QACnB,gBAAgB;QAChB,gBAAgB;QAChB,UAAU;QACV,eAAe;QACf,mBAAmB;QACnB,aAAa,EAAE,qBAAqB;QACpC,cAAc,EAAE,sBAAsB;KACvC,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dceky",
3
- "version": "1.2.5",
3
+ "version": "1.4.1",
4
4
  "description": "Cypress toolkit for Harvard DCE",
5
5
  "main": "./lib/src/index.js",
6
6
  "types": "./lib/src/index.d.ts",
@@ -35,6 +35,7 @@
35
35
  "child_process": "^1.0.2",
36
36
  "clear": "^0.1.0",
37
37
  "cypress-iframe": "^1.0.1",
38
+ "dce-commonkit": "^5.0.2",
38
39
  "deepmerge": "4.3.1",
39
40
  "dotenv": "^17.4.2",
40
41
  "ejs": "^3.1.10",
@@ -39,6 +39,9 @@ const LOGIN_PAGE = 'https://harvard.proxy.cirrusidentity.com/cas/login?service=h
39
39
  const IDP_BASE_URL = 'https://apps.cirrusidentity.com';
40
40
  // HarvardKey IdP button ID on Cirrus discovery page
41
41
  const HARVARDKEY_IDP_BUTTON_ID = 'idp_1001962798_button';
42
+ // TODO: Update to have a better of way of determining user agent
43
+ // Force a non-headless User-Agent; the IdP WAF rejects the default headless UA
44
+ const LOGIN_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36';
42
45
 
43
46
  /*----------------------------------------*/
44
47
  /* --------------- Command -------------- */
@@ -66,7 +69,7 @@ const logIntoPorta = () => {
66
69
  throw new Error(`Credential "${name}" is missing username and/or password`);
67
70
  }
68
71
 
69
- const htmlHeaders = { accept: 'text/html' };
72
+ const htmlHeaders = { accept: 'text/html', 'user-agent': LOGIN_USER_AGENT };
70
73
 
71
74
  // Request 1: GET Cirrus Identity discovery page
72
75
  cy.sendRequest({
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Default number of profile/browser combos to run in parallel
3
+ * @author Yuen Ler Chow
4
+ */
5
+ const DEFAULT_NUM_COMBOS_IN_PARALLEL = 1;
6
+
7
+ export default DEFAULT_NUM_COMBOS_IN_PARALLEL;
@@ -2,6 +2,7 @@
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
4
  import clear from 'clear';
5
+ import { parallelLimit } from 'dce-commonkit';
5
6
 
6
7
  // Import helpers
7
8
  import runCypressHeadless from './runCypressHeadless';
@@ -12,14 +13,16 @@ import print from './print';
12
13
 
13
14
  // Import shared types
14
15
  import Profile from '../types/Profile';
16
+ import RunResult from '../types/RunResult';
15
17
 
16
18
  /**
17
- * Execute all headless Cypress test combinations in parallel
19
+ * Execute all headless Cypress test combinations
18
20
  * @author Yuen Ler Chow
19
21
  * @param opts - object of arguments
20
22
  * @param opts.selectedProfiles - Array of selected profiles
21
23
  * @param opts.selectedBrowsers - Array of selected browsers
22
24
  * @param opts.threadsPerCombo - Number of parallel threads per combo
25
+ * @param opts.numCombosInParallel - Number of profile/browser combos to run in parallel
23
26
  * @param opts.e2eSpecPattern - E2E test spec glob
24
27
  */
25
28
  const executeAllHeadlessCombinations = async (
@@ -27,6 +30,7 @@ const executeAllHeadlessCombinations = async (
27
30
  selectedProfiles: Profile[],
28
31
  selectedBrowsers: string[],
29
32
  threadsPerCombo: number,
33
+ numCombosInParallel: number,
30
34
  e2eSpecPattern: string,
31
35
  },
32
36
  ): Promise<void> => {
@@ -34,6 +38,7 @@ const executeAllHeadlessCombinations = async (
34
38
  selectedProfiles,
35
39
  selectedBrowsers,
36
40
  threadsPerCombo,
41
+ numCombosInParallel,
37
42
  e2eSpecPattern,
38
43
  } = opts;
39
44
 
@@ -56,19 +61,30 @@ const executeAllHeadlessCombinations = async (
56
61
  });
57
62
  });
58
63
 
59
- console.log(`🔄 Running ${combinations.length} test combination(s) in parallel...\n`);
64
+ const comboParallelism = Math.min(numCombosInParallel, combinations.length);
65
+ console.log(
66
+ `🔄 Running ${combinations.length} test combination(s) `
67
+ + `with up to ${comboParallelism} combo(s) in parallel...\n`,
68
+ );
60
69
 
61
- // Run all combinations in parallel
62
- const runPromises = combinations.map((combo) => {
63
- return runCypressHeadless({
64
- profileName: combo.profileName,
65
- browser: combo.browser,
66
- outputDir,
67
- numThreads: threadsPerCombo,
68
- e2eSpecPattern,
69
- });
70
+ const taskFunctions: (() => Promise<RunResult>)[] = combinations.map((combo, comboIndex) => {
71
+ return async () => {
72
+ console.log(
73
+ `▶️ Running combo ${comboIndex + 1}/${combinations.length}: `
74
+ + `${combo.profileName} + ${combo.browser}\n`,
75
+ );
76
+
77
+ return runCypressHeadless({
78
+ profileName: combo.profileName,
79
+ browser: combo.browser,
80
+ outputDir,
81
+ numThreads: threadsPerCombo,
82
+ e2eSpecPattern,
83
+ });
84
+ };
70
85
  });
71
- const results = await Promise.all(runPromises);
86
+
87
+ const results: RunResult[] = await parallelLimit(taskFunctions, comboParallelism);
72
88
 
73
89
  // Generate combined HTML report across all profile+browser combinations
74
90
  mergeAllReportsAndGenerateHtml(outputDir, results);
@@ -15,6 +15,7 @@ import executeAllHeadlessCombinations from './executeAllHeadlessCombinations';
15
15
  * @param opts.selectedBrowsers - Array of selected browsers
16
16
  * @param opts.isHeadless - Whether to run in headless mode
17
17
  * @param opts.threadsPerCombo - Number of parallel threads per combo
18
+ * @param opts.numCombosInParallel - Number of profile/browser combos to run in parallel
18
19
  * @param opts.e2eTestFolder - E2E test folder label
19
20
  * @param opts.e2eSpecPattern - E2E test spec glob
20
21
  */
@@ -24,6 +25,7 @@ const executeCypress = async (
24
25
  selectedBrowsers: string[],
25
26
  isHeadless: boolean,
26
27
  threadsPerCombo: number,
28
+ numCombosInParallel: number,
27
29
  e2eTestFolder: string,
28
30
  e2eSpecPattern: string,
29
31
  },
@@ -33,6 +35,7 @@ const executeCypress = async (
33
35
  selectedBrowsers,
34
36
  isHeadless,
35
37
  threadsPerCombo,
38
+ numCombosInParallel,
36
39
  e2eTestFolder,
37
40
  e2eSpecPattern,
38
41
  } = opts;
@@ -45,6 +48,7 @@ const executeCypress = async (
45
48
  if (isHeadless) {
46
49
  console.log(`E2E test folder: ${e2eTestFolder}`);
47
50
  console.log(`Num Test Files in Parallel Per Combo: ${threadsPerCombo}`);
51
+ console.log(`Num Combos in Parallel: ${numCombosInParallel}`);
48
52
  }
49
53
  console.log('═══════════════════════════════════════════════════════════\n');
50
54
 
@@ -59,6 +63,7 @@ const executeCypress = async (
59
63
  selectedProfiles,
60
64
  selectedBrowsers,
61
65
  threadsPerCombo,
66
+ numCombosInParallel,
62
67
  e2eSpecPattern,
63
68
  });
64
69
  }
package/start/index.ts CHANGED
@@ -27,6 +27,7 @@ import findE2ETestFolderByName from './helpers/findE2ETestFolderByName';
27
27
 
28
28
  // Import constants
29
29
  import DEFAULT_THREADS_PER_COMBO from './constants/DEFAULT_THREADS_PER_COMBO';
30
+ import DEFAULT_NUM_COMBOS_IN_PARALLEL from './constants/DEFAULT_NUM_COMBOS_IN_PARALLEL';
30
31
  import ALL_E2E_TESTS_LABEL from './constants/ALL_E2E_TESTS_LABEL';
31
32
  import ALL_E2E_TESTS_SPEC_PATTERN from './constants/ALL_E2E_TESTS_SPEC_PATTERN';
32
33
 
@@ -98,6 +99,10 @@ isHeadless = !!(envHeadlessRaw && envHeadlessRaw.toLowerCase() !== 'false');
98
99
  const threadsRaw = process.env.THREADS_PER_COMBO;
99
100
  let threadsPerCombo = DEFAULT_THREADS_PER_COMBO;
100
101
 
102
+ // Check for NUM_COMBOS_IN_PARALLEL
103
+ const numCombosInParallelRaw = process.env.NUM_COMBOS_IN_PARALLEL;
104
+ let numCombosInParallel = DEFAULT_NUM_COMBOS_IN_PARALLEL;
105
+
101
106
  const start = async (): Promise<void> => {
102
107
  // If headless wasn't specified, ask the user to choose
103
108
  if (!envHeadlessRaw) {
@@ -122,6 +127,42 @@ const start = async (): Promise<void> => {
122
127
  );
123
128
 
124
129
  if (isHeadless) {
130
+ if (numCombosInParallelRaw) {
131
+ const trimmedNumCombos = numCombosInParallelRaw.trim();
132
+ const parsed = Number.parseInt(trimmedNumCombos, 10);
133
+ if (/^\d+$/.test(trimmedNumCombos) && parsed > 0) {
134
+ numCombosInParallel = parsed;
135
+ } else {
136
+ console.warn(
137
+ `⚠️ Invalid NUM_COMBOS_IN_PARALLEL value: "${numCombosInParallelRaw}". `
138
+ + 'Use a positive whole number. '
139
+ + `Using default (${DEFAULT_NUM_COMBOS_IN_PARALLEL}).`,
140
+ );
141
+ }
142
+ } else {
143
+ let parsedNumCombos: number | null = null;
144
+ clear();
145
+ print.title('Num Combos in Parallel');
146
+ console.log('');
147
+ print.subtitle('How many profile/browser combos should run in parallel? (Press Enter for 1)');
148
+ while (parsedNumCombos === null) {
149
+ const response = prompt('> ', true).trim();
150
+ if (!response) {
151
+ parsedNumCombos = DEFAULT_NUM_COMBOS_IN_PARALLEL;
152
+ } else {
153
+ const parsed = Number.parseInt(response, 10);
154
+ parsedNumCombos = /^\d+$/.test(response) && parsed > 0 ? parsed : null;
155
+ }
156
+
157
+ if (parsedNumCombos === null) {
158
+ console.log('Please enter a positive whole number, or press Enter for 1.');
159
+ console.log('');
160
+ }
161
+ }
162
+
163
+ numCombosInParallel = parsedNumCombos;
164
+ }
165
+
125
166
  if (threadsRaw) {
126
167
  const trimmedThreads = threadsRaw.trim();
127
168
  const parsed = Number.parseInt(trimmedThreads, 10);
@@ -315,6 +356,7 @@ const start = async (): Promise<void> => {
315
356
  selectedBrowsers,
316
357
  isHeadless,
317
358
  threadsPerCombo,
359
+ numCombosInParallel,
318
360
  e2eTestFolder: selectedE2ETestFolder,
319
361
  e2eSpecPattern: selectedE2ESpecPattern,
320
362
  });