Browse Source

feat(cli): add support for JUnit reporter (#4189)

James George 7 months ago
parent
commit
5f96cda5e2

+ 6 - 3
packages/hoppscotch-cli/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@hoppscotch/cli",
-  "version": "0.9.1",
+  "version": "0.10.0",
   "description": "A CLI to run Hoppscotch test scripts in CI environments.",
   "homepage": "https://hoppscotch.io",
   "type": "module",
@@ -20,9 +20,11 @@
     "debugger": "node debugger.js 9999",
     "prepublish": "pnpm exec tsup",
     "prettier-format": "prettier --config .prettierrc 'src/**/*.ts' --write",
-    "test": "pnpm run build && vitest run && rm -rf dist",
+    "pretest": "pnpm run build",
+    "test": "vitest run",
     "do-typecheck": "pnpm exec tsc --noEmit",
-    "do-test": "pnpm test"
+    "do-test": "pnpm run test",
+    "postinstall": "pnpm run build"
   },
   "keywords": [
     "cli",
@@ -48,6 +50,7 @@
     "lodash-es": "4.17.21",
     "qs": "6.11.2",
     "verzod": "0.2.2",
+    "xmlbuilder2": "3.1.1",
     "zod": "3.22.4"
   },
   "devDependencies": {

+ 529 - 0
packages/hoppscotch-cli/src/__tests__/e2e/commands/__snapshots__/test.spec.ts.snap

@@ -0,0 +1,529 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`hopp test [options] <file_path_or_id> > Test\`hopp test <file_path_or_id> --env <file_path_or_id> --reporter-junit [path] > Generates a JUnit report at the default path 1`] = `
+"<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>
+<testsuites tests=\\"76\\" failures=\\"2\\" errors=\\"66\\" time=\\"time\\">
+  <testsuite name=\\"test-junit-report-export/request-level-errors/invalid-url\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"22\\" failures=\\"0\\" errors=\\"22\\">
+    <system-err><![CDATA[
+      REQUEST_ERROR - TypeError: Invalid URL]]></system-err>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be null\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toInclude should not be null\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be undefined\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toInclude should not be undefined\\"/>
+    </testcase>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/request-level-errors/test-script-reference-error\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"0\\" failures=\\"0\\" errors=\\"0\\">
+    <system-err><![CDATA[
+      REQUEST_ERROR - TypeError: Invalid URL
+      TEST_SCRIPT_ERROR - Script execution failed: ReferenceError: status is not defined]]></system-err>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"22\\" failures=\\"0\\" errors=\\"22\\">
+    <system-err><![CDATA[
+      PARSING_ERROR - {
+  \\"key\\": \\"<<key>>\\"
+} (ENV_EXPAND_LOOP)]]></system-err>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be null\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toInclude should not be null\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be undefined\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toInclude should not be undefined\\"/>
+    </testcase>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/assertions/error\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"22\\" failures=\\"0\\" errors=\\"22\\">
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be null\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toInclude should not be null\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be undefined\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toInclude should not be undefined\\"/>
+    </testcase>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/assertions/success\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"5\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Status code is 200 - Expected '200' to be '200'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Check headers - Expected 'application/json, text/plain, */*,image/webp' to be 'application/json, text/plain, */*,image/webp'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Check headers - Expected 'echo.hoppscotch.io' to be 'echo.hoppscotch.io'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Check headers - Expected 'undefined' to be 'undefined'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Status code is 2xx - Expected '200' to be 200-level status\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/assertions/failure\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"5\\" failures=\\"2\\" errors=\\"0\\">
+    <testcase name=\\"Simulating failure - Status code is 200 - Expected '200' to not be '200'\\" classname=\\"test-junit-report-export/assertions/failure\\">
+      <failure type=\\"AssertionFailure\\" message=\\"Expected '200' to not be '200'\\"/>
+    </testcase>
+    <testcase name=\\"Simulating failure - Check headers - Expected 'application/json, text/plain, */*,image/webp' to not be 'application/json, text/plain, */*'\\" classname=\\"test-junit-report-export/assertions/failure\\"/>
+    <testcase name=\\"Simulating failure - Check headers - Expected 'echo.hoppscotch.io' to not be 'httpbin.org'\\" classname=\\"test-junit-report-export/assertions/failure\\"/>
+    <testcase name=\\"Simulating failure - Check headers - Expected 'undefined' to not be 'value'\\" classname=\\"test-junit-report-export/assertions/failure\\"/>
+    <testcase name=\\"Simulating failure - Status code is 2xx - Expected '200' to not be 200-level status\\" classname=\\"test-junit-report-export/assertions/failure\\">
+      <failure type=\\"AssertionFailure\\" message=\\"Expected '200' to not be 200-level status\\"/>
+    </testcase>
+  </testsuite>
+</testsuites>"
+`;
+
+exports[`hopp test [options] <file_path_or_id> > Test\`hopp test <file_path_or_id> --env <file_path_or_id> --reporter-junit [path] > Generates a JUnit report at the specified path 1`] = `
+"<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>
+<testsuites tests=\\"76\\" failures=\\"2\\" errors=\\"66\\" time=\\"time\\">
+  <testsuite name=\\"test-junit-report-export/request-level-errors/invalid-url\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"22\\" failures=\\"0\\" errors=\\"22\\">
+    <system-err><![CDATA[
+      REQUEST_ERROR - TypeError: Invalid URL]]></system-err>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be null\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toInclude should not be null\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be undefined\\" classname=\\"test-junit-report-export/request-level-errors/invalid-url\\">
+      <error message=\\"Argument for toInclude should not be undefined\\"/>
+    </testcase>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/request-level-errors/test-script-reference-error\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"0\\" failures=\\"0\\" errors=\\"0\\">
+    <system-err><![CDATA[
+      REQUEST_ERROR - TypeError: Invalid URL
+      TEST_SCRIPT_ERROR - Script execution failed: ReferenceError: status is not defined]]></system-err>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"22\\" failures=\\"0\\" errors=\\"22\\">
+    <system-err><![CDATA[
+      PARSING_ERROR - {
+  \\"key\\": \\"<<key>>\\"
+} (ENV_EXPAND_LOOP)]]></system-err>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be null\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toInclude should not be null\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be undefined\\" classname=\\"test-junit-report-export/request-level-errors/non-existent-env-var\\">
+      <error message=\\"Argument for toInclude should not be undefined\\"/>
+    </testcase>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/assertions/error\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"22\\" failures=\\"0\\" errors=\\"22\\">
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeLevelxxx()\` error scenarios - Expected 200-level status but could not parse value 'foo'\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected 200-level status but could not parse value 'foo'\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toBeType()\` error scenarios - Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toBeType should be &quot;string&quot;, &quot;boolean&quot;, &quot;number&quot;, &quot;object&quot;, &quot;undefined&quot;, &quot;bigint&quot;, &quot;symbol&quot; or &quot;function&quot;\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Expected toHaveLength to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toHaveLength to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toHaveLength()\` error scenarios - Argument for toHaveLength should be a number\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toHaveLength should be a number\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Expected toInclude to be called for an array or string\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Expected toInclude to be called for an array or string\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be null\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toInclude should not be null\\"/>
+    </testcase>
+    <testcase name=\\"\`toInclude() error scenarios\` - Argument for toInclude should not be undefined\\" classname=\\"test-junit-report-export/assertions/error\\">
+      <error message=\\"Argument for toInclude should not be undefined\\"/>
+    </testcase>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/assertions/success\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"5\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Status code is 200 - Expected '200' to be '200'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Check headers - Expected 'application/json, text/plain, */*,image/webp' to be 'application/json, text/plain, */*,image/webp'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Check headers - Expected 'echo.hoppscotch.io' to be 'echo.hoppscotch.io'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Check headers - Expected 'undefined' to be 'undefined'\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+    <testcase name=\\"Status code is 2xx - Expected '200' to be 200-level status\\" classname=\\"test-junit-report-export/assertions/success\\"/>
+  </testsuite>
+  <testsuite name=\\"test-junit-report-export/assertions/failure\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"5\\" failures=\\"2\\" errors=\\"0\\">
+    <testcase name=\\"Simulating failure - Status code is 200 - Expected '200' to not be '200'\\" classname=\\"test-junit-report-export/assertions/failure\\">
+      <failure type=\\"AssertionFailure\\" message=\\"Expected '200' to not be '200'\\"/>
+    </testcase>
+    <testcase name=\\"Simulating failure - Check headers - Expected 'application/json, text/plain, */*,image/webp' to not be 'application/json, text/plain, */*'\\" classname=\\"test-junit-report-export/assertions/failure\\"/>
+    <testcase name=\\"Simulating failure - Check headers - Expected 'echo.hoppscotch.io' to not be 'httpbin.org'\\" classname=\\"test-junit-report-export/assertions/failure\\"/>
+    <testcase name=\\"Simulating failure - Check headers - Expected 'undefined' to not be 'value'\\" classname=\\"test-junit-report-export/assertions/failure\\"/>
+    <testcase name=\\"Simulating failure - Status code is 2xx - Expected '200' to not be 200-level status\\" classname=\\"test-junit-report-export/assertions/failure\\">
+      <failure type=\\"AssertionFailure\\" message=\\"Expected '200' to not be 200-level status\\"/>
+    </testcase>
+  </testsuite>
+</testsuites>"
+`;
+
+exports[`hopp test [options] <file_path_or_id> > Test\`hopp test <file_path_or_id> --env <file_path_or_id> --reporter-junit [path] > Generates a JUnit report for a collection referring to environment variables 1`] = `
+"<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>
+<testsuites tests=\\"12\\" failures=\\"0\\" errors=\\"0\\" time=\\"time\\">
+  <testsuite name=\\"Test environment variables in request body/test-request\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"12\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Status code is 200 - Expected '200' to be '200'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments recursively - Expected 'Hello' to be 'Hello'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments recursively - Expected 'Hello' to be 'Hello'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments recursively - Expected 'Hello' to be 'Hello'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'Hello' to be 'Hello'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'Hello' to be 'Hello'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'Hello' to be 'Hello'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected '7' to be '7'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'John' to be 'John'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'Doe' to be 'Doe'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'John Doe' to be 'John Doe'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+    <testcase name=\\"Successfully resolves environments referenced in the request body - Expected 'Hello, John Doe' to be 'Hello, John Doe'\\" classname=\\"Test environment variables in request body/test-request\\"/>
+  </testsuite>
+</testsuites>"
+`;
+
+exports[`hopp test [options] <file_path_or_id> > Test\`hopp test <file_path_or_id> --env <file_path_or_id> --reporter-junit [path] > Generates a JUnit report for a collection with authorization/headers set at the collection level 1`] = `
+"<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>
+<testsuites tests=\\"12\\" failures=\\"0\\" errors=\\"0\\" time=\\"time\\">
+  <testsuite name=\\"CollectionB/RequestA\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"2\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Correctly inherits auth and headers from the root collection - Expected 'Set at root collection' to be 'Set at root collection'\\" classname=\\"CollectionB/RequestA\\"/>
+    <testcase name=\\"Correctly inherits auth and headers from the root collection - Expected 'Bearer BearerToken' to be 'Bearer BearerToken'\\" classname=\\"CollectionB/RequestA\\"/>
+  </testsuite>
+  <testsuite name=\\"CollectionB/FolderA/RequestB\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"2\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Correctly inherits auth and headers from the parent folder - Expected 'Set at root collection' to be 'Set at root collection'\\" classname=\\"CollectionB/FolderA/RequestB\\"/>
+    <testcase name=\\"Correctly inherits auth and headers from the parent folder - Expected 'Bearer BearerToken' to be 'Bearer BearerToken'\\" classname=\\"CollectionB/FolderA/RequestB\\"/>
+  </testsuite>
+  <testsuite name=\\"CollectionA/RequestA\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"2\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Correctly inherits auth and headers from the root collection - Expected 'Set at root collection' to be 'Set at root collection'\\" classname=\\"CollectionA/RequestA\\"/>
+    <testcase name=\\"Correctly inherits auth and headers from the root collection - Expected 'Bearer BearerToken' to be 'Bearer BearerToken'\\" classname=\\"CollectionA/RequestA\\"/>
+  </testsuite>
+  <testsuite name=\\"CollectionA/FolderA/RequestB\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"2\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Correctly inherits auth and headers from the parent folder - Expected 'Set at root collection' to be 'Set at root collection'\\" classname=\\"CollectionA/FolderA/RequestB\\"/>
+    <testcase name=\\"Correctly inherits auth and headers from the parent folder - Expected 'Bearer BearerToken' to be 'Bearer BearerToken'\\" classname=\\"CollectionA/FolderA/RequestB\\"/>
+  </testsuite>
+  <testsuite name=\\"CollectionA/FolderA/FolderB/RequestC\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"2\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Correctly inherits auth and headers from the parent folder - Expected 'Overriden at FolderB' to be 'Overriden at FolderB'\\" classname=\\"CollectionA/FolderA/FolderB/RequestC\\"/>
+    <testcase name=\\"Correctly inherits auth and headers from the parent folder - Expected 'test-key' to be 'test-key'\\" classname=\\"CollectionA/FolderA/FolderB/RequestC\\"/>
+  </testsuite>
+  <testsuite name=\\"CollectionA/FolderA/FolderB/FolderC/RequestD\\" time=\\"time\\" timestamp=\\"timestamp\\" tests=\\"2\\" failures=\\"0\\" errors=\\"0\\">
+    <testcase name=\\"Overrides auth and headers set at the parent folder - Expected 'Overriden at RequestD' to be 'Overriden at RequestD'\\" classname=\\"CollectionA/FolderA/FolderB/FolderC/RequestD\\"/>
+    <testcase name=\\"Overrides auth and headers set at the parent folder - Expected 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=' to be 'Basic dXNlcm5hbWU6cGFzc3dvcmQ='\\" classname=\\"CollectionA/FolderA/FolderB/FolderC/RequestD\\"/>
+  </testsuite>
+</testsuites>"
+`;

+ 163 - 2
packages/hoppscotch-cli/src/__tests__/e2e/commands/test.spec.ts

@@ -1,5 +1,7 @@
 import { ExecException } from "child_process";
-import { describe, expect, test } from "vitest";
+import { afterAll, beforeAll, describe, expect, test } from "vitest";
+import fs from "fs";
+import path from "path";
 
 import { HoppErrorCode } from "../../../types/errors";
 import { getErrorCode, getTestJsonFilePath, runCLI } from "../../utils";
@@ -229,7 +231,7 @@ describe("hopp test [options] <file_path_or_id>", () => {
       expect(error).toBeNull();
     });
 
-    test("Works with shorth `-e` flag", async () => {
+    test("Works with short `-e` flag", async () => {
       const TESTS_PATH = getTestJsonFilePath(
         "env-flag-tests-coll.json",
         "collection"
@@ -506,4 +508,163 @@ describe("hopp test [options] <file_path_or_id>", () => {
       expect(error).toBeNull();
     });
   });
+
+  describe("Test`hopp test <file_path_or_id> --env <file_path_or_id> --reporter-junit [path]", () => {
+    const genPath = path.resolve("hopp-cli-test");
+
+    // Helper function to replace dynamic values before generating test snapshots
+    // Currently scoped to JUnit report generation
+    const replaceDynamicValuesInStr = (input: string): string =>
+      input.replace(
+        /(time|timestamp)="[^"]+"/g,
+        (_, attr) => `${attr}="${attr}"`
+      );
+
+    beforeAll(() => {
+      fs.mkdirSync(genPath);
+    });
+
+    afterAll(() => {
+      fs.rmdirSync(genPath, { recursive: true });
+    });
+
+    test("Report export fails with the code `REPORT_EXPORT_FAILED` while encountering an error during path creation", async () => {
+      const exportPath = "hopp-junit-report.xml";
+
+      const COLL_PATH = getTestJsonFilePath("passes-coll.json", "collection");
+
+      const args = `test ${COLL_PATH} --reporter-junit /non-existent-path/report.xml`;
+
+      const { stdout, stderr } = await runCLI(args, {
+        cwd: path.resolve("hopp-cli-test"),
+      });
+
+      const out = getErrorCode(stderr);
+      expect(out).toBe<HoppErrorCode>("REPORT_EXPORT_FAILED");
+
+      expect(stdout).not.toContain(
+        `Successfully exported the JUnit report to: ${exportPath}`
+      );
+    });
+
+    test("Generates a JUnit report at the default path", async () => {
+      const exportPath = "hopp-junit-report.xml";
+
+      const COLL_PATH = getTestJsonFilePath(
+        "test-junit-report-export-coll.json",
+        "collection"
+      );
+
+      const args = `test ${COLL_PATH} --reporter-junit`;
+
+      const { stdout } = await runCLI(args, {
+        cwd: path.resolve("hopp-cli-test"),
+      });
+
+      expect(stdout).not.toContain(
+        `Overwriting the pre-existing path: ${exportPath}`
+      );
+
+      expect(stdout).toContain(
+        `Successfully exported the JUnit report to: ${exportPath}`
+      );
+
+      const fileContents = fs
+        .readFileSync(path.resolve(genPath, exportPath))
+        .toString();
+
+      expect(replaceDynamicValuesInStr(fileContents)).toMatchSnapshot();
+    });
+
+    test("Generates a JUnit report at the specified path", async () => {
+      const exportPath = "outer-dir/inner-dir/report.xml";
+
+      const COLL_PATH = getTestJsonFilePath(
+        "test-junit-report-export-coll.json",
+        "collection"
+      );
+
+      const args = `test ${COLL_PATH} --reporter-junit ${exportPath}`;
+
+      const { stdout } = await runCLI(args, {
+        cwd: path.resolve("hopp-cli-test"),
+      });
+
+      expect(stdout).not.toContain(
+        `Overwriting the pre-existing path: ${exportPath}`
+      );
+
+      expect(stdout).toContain(
+        `Successfully exported the JUnit report to: ${exportPath}`
+      );
+
+      const fileContents = fs
+        .readFileSync(path.resolve(genPath, exportPath))
+        .toString();
+
+      expect(replaceDynamicValuesInStr(fileContents)).toMatchSnapshot();
+    });
+
+    test("Generates a JUnit report for a collection with authorization/headers set at the collection level", async () => {
+      const exportPath = "hopp-junit-report.xml";
+
+      const COLL_PATH = getTestJsonFilePath(
+        "collection-level-auth-headers-coll.json",
+        "collection"
+      );
+
+      const args = `test ${COLL_PATH} --reporter-junit`;
+
+      const { stdout } = await runCLI(args, {
+        cwd: path.resolve("hopp-cli-test"),
+      });
+
+      expect(stdout).toContain(
+        `Overwriting the pre-existing path: ${exportPath}`
+      );
+
+      expect(stdout).toContain(
+        `Successfully exported the JUnit report to: ${exportPath}`
+      );
+
+      const fileContents = fs
+        .readFileSync(path.resolve(genPath, exportPath))
+        .toString();
+
+      expect(replaceDynamicValuesInStr(fileContents)).toMatchSnapshot();
+    });
+
+    test("Generates a JUnit report for a collection referring to environment variables", async () => {
+      const exportPath = "hopp-junit-report.xml";
+
+      const COLL_PATH = getTestJsonFilePath(
+        "req-body-env-vars-coll.json",
+        "collection"
+      );
+      const ENV_PATH = getTestJsonFilePath(
+        "req-body-env-vars-envs.json",
+        "environment"
+      );
+
+      const args = `test ${COLL_PATH} --env ${ENV_PATH} --reporter-junit`;
+
+      const { stdout } = await runCLI(args, {
+        cwd: path.resolve("hopp-cli-test"),
+      });
+
+      expect(stdout).toContain(
+        `Overwriting the pre-existing path: ${exportPath}`
+      );
+
+      expect(stdout).toContain(
+        `Successfully exported the JUnit report to: ${exportPath}`
+      );
+
+      const fileContents = fs
+        .readFileSync(path.resolve(genPath, exportPath))
+        .toString();
+
+      expect(replaceDynamicValuesInStr(fileContents)).toMatchSnapshot();
+    });
+  });
 });

+ 150 - 0
packages/hoppscotch-cli/src/__tests__/e2e/fixtures/collections/test-junit-report-export-coll.json

@@ -0,0 +1,150 @@
+{
+    "v": 2,
+    "name": "test-junit-report-export",
+    "folders": [
+        {
+            "v": 2,
+            "name": "assertions",
+            "folders": [],
+            "requests": [
+                {
+                    "v": "5",
+                    "auth": {
+                        "authType": "inherit",
+                        "authActive": true
+                    },
+                    "body": {
+                        "body": null,
+                        "contentType": null
+                    },
+                    "name": "error",
+                    "method": "GET",
+                    "params": [],
+                    "headers": [],
+                    "endpoint": "https://echo.hoppscotch.io",
+                    "testScript": "pw.test(\"`toBeLevelxxx()` error scenarios\", ()=> {\n    pw.expect(\"foo\").toBeLevel2xx();\n    pw.expect(\"foo\").not.toBeLevel2xx();\n});\n\npw.test(\"`toBeType()` error scenarios\", () => {\n  pw.expect(2).toBeType(\"foo\")\n  pw.expect(\"2\").toBeType(\"bar\")\n  pw.expect(true).toBeType(\"baz\")\n  pw.expect({}).toBeType(\"qux\")\n  pw.expect(undefined).toBeType(\"quux\")\n  \n  pw.expect(2).not.toBeType(\"foo\")\n  pw.expect(\"2\").not.toBeType(\"bar\")\n  pw.expect(true).not.toBeType(\"baz\")\n  pw.expect({}).not.toBeType(\"qux\")\n  pw.expect(undefined).not.toBeType(\"quux\")\n})\n\npw.test(\"`toHaveLength()` error scenarios\", () => {\n  pw.expect(5).toHaveLength(0)\n  pw.expect(true).toHaveLength(0)\n\n  pw.expect(5).not.toHaveLength(0)\n  pw.expect(true).not.toHaveLength(0)\n\n  pw.expect([1, 2, 3, 4]).toHaveLength(\"a\")\n\n  pw.expect([1, 2, 3, 4]).not.toHaveLength(\"a\")\n})\n\npw.test(\"`toInclude() error scenarios`\", () => {\n  pw.expect(5).not.toInclude(0)\n  pw.expect(true).not.toInclude(0)\n\n  pw.expect([1, 2, 3, 4]).not.toInclude(null)\n\n  pw.expect([1, 2, 3, 4]).not.toInclude(undefined)\n})",
+                    "preRequestScript": "",
+                    "requestVariables": []
+                },
+                {
+                    "v": "5",
+                    "auth": {
+                        "authType": "inherit",
+                        "authActive": true
+                    },
+                    "body": {
+                        "body": null,
+                        "contentType": null
+                    },
+                    "name": "success",
+                    "method": "GET",
+                    "params": [],
+                    "headers": [],
+                    "endpoint": "https://echo.hoppscotch.io",
+                    "testScript": "\n\n// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n    pw.expect(pw.response.status).toBe(200);\n});\n\n// Check headers\npw.test(\"Check headers\", ()=> {\n    pw.expect(pw.response.body.headers[\"accept\"]).toBe(\"application/json, text/plain, */*,image/webp\");\n    pw.expect(pw.response.body.headers[\"host\"]).toBe(\"echo.hoppscotch.io\")\n  pw.expect(pw.response.body.headers[\"custom-header\"]).toBe(undefined)\n});\n\n// Check status code is 2xx\npw.test(\"Status code is 2xx\", ()=> {\n    pw.expect(pw.response.status).toBeLevel2xx();\n});",
+                    "preRequestScript": "",
+                    "requestVariables": []
+                },
+                {
+                    "v": "5",
+                    "auth": {
+                        "authType": "inherit",
+                        "authActive": true
+                    },
+                    "body": {
+                        "body": null,
+                        "contentType": null
+                    },
+                    "name": "failure",
+                    "method": "GET",
+                    "params": [],
+                    "headers": [],
+                    "endpoint": "https://echo.hoppscotch.io",
+                    "testScript": "\n\n// Check status code is 200\npw.test(\"Simulating failure - Status code is 200\", ()=> {\n    pw.expect(pw.response.status).not.toBe(200);\n});\n\n// Check JSON response property\npw.test(\"Simulating failure - Check headers\", ()=> {\n    pw.expect(pw.response.body.headers[\"accept\"]).not.toBe(\"application/json, text/plain, */*\");\n    pw.expect(pw.response.body.headers[\"host\"]).not.toBe(\"httpbin.org\")\n  pw.expect(pw.response.body.headers[\"custom-header\"]).not.toBe(\"value\")\n});\n\n// Check status code is 2xx\npw.test(\"Simulating failure - Status code is 2xx\", ()=> {\n    pw.expect(pw.response.status).not.toBeLevel2xx();\n});",
+                    "preRequestScript": "",
+                    "requestVariables": []
+                }
+            ],
+            "auth": {
+                "authType": "inherit",
+                "authActive": true
+            },
+            "headers": []
+        },
+        {
+            "v": 2,
+            "name": "request-level-errors",
+            "folders": [],
+            "requests": [
+                {
+                    "v": "5",
+                    "auth": {
+                        "authType": "inherit",
+                        "authActive": true
+                    },
+                    "body": {
+                        "body": null,
+                        "contentType": null
+                    },
+                    "name": "invalid-url",
+                    "method": "GET",
+                    "params": [],
+                    "headers": [],
+                    "endpoint": "invalid-url",
+                    "testScript": "pw.test(\"`toBeLevelxxx()` error scenarios\", ()=> {\n    pw.expect(\"foo\").toBeLevel2xx();\n    pw.expect(\"foo\").not.toBeLevel2xx();\n});\n\npw.test(\"`toBeType()` error scenarios\", () => {\n  pw.expect(2).toBeType(\"foo\")\n  pw.expect(\"2\").toBeType(\"bar\")\n  pw.expect(true).toBeType(\"baz\")\n  pw.expect({}).toBeType(\"qux\")\n  pw.expect(undefined).toBeType(\"quux\")\n  \n  pw.expect(2).not.toBeType(\"foo\")\n  pw.expect(\"2\").not.toBeType(\"bar\")\n  pw.expect(true).not.toBeType(\"baz\")\n  pw.expect({}).not.toBeType(\"qux\")\n  pw.expect(undefined).not.toBeType(\"quux\")\n})\n\npw.test(\"`toHaveLength()` error scenarios\", () => {\n  pw.expect(5).toHaveLength(0)\n  pw.expect(true).toHaveLength(0)\n\n  pw.expect(5).not.toHaveLength(0)\n  pw.expect(true).not.toHaveLength(0)\n\n  pw.expect([1, 2, 3, 4]).toHaveLength(\"a\")\n\n  pw.expect([1, 2, 3, 4]).not.toHaveLength(\"a\")\n})\n\npw.test(\"`toInclude() error scenarios`\", () => {\n  pw.expect(5).not.toInclude(0)\n  pw.expect(true).not.toInclude(0)\n\n  pw.expect([1, 2, 3, 4]).not.toInclude(null)\n\n  pw.expect([1, 2, 3, 4]).not.toInclude(undefined)\n})",
+                    "preRequestScript": "",
+                    "requestVariables": []
+                },
+                {
+                    "v": "5",
+                    "auth": {
+                        "authType": "inherit",
+                        "authActive": true
+                    },
+                    "body": {
+                        "body": null,
+                        "contentType": null
+                    },
+                    "name": "test-script-reference-error",
+                    "method": "GET",
+                    "params": [],
+                    "headers": [],
+                    "endpoint": "invalid-url",
+                    "testScript": "pw.test(\"Reference error\", () => {\n  pw.expect(status).toBe(200);\n})",
+                    "preRequestScript": "",
+                    "requestVariables": []
+                },
+                {
+                    "v": "5",
+                    "auth": {
+                        "authType": "inherit",
+                        "authActive": true
+                    },
+                    "body": {
+                        "body": "{\n  \"key\": \"<<key>>\"\n}",
+                        "contentType": "application/json"
+                    },
+                    "name": "non-existent-env-var",
+                    "method": "POST",
+                    "params": [],
+                    "headers": [],
+                    "endpoint": "https://echo.hoppscotch.io",
+                    "testScript": "pw.test(\"`toBeLevelxxx()` error scenarios\", ()=> {\n    pw.expect(\"foo\").toBeLevel2xx();\n    pw.expect(\"foo\").not.toBeLevel2xx();\n});\n\npw.test(\"`toBeType()` error scenarios\", () => {\n  pw.expect(2).toBeType(\"foo\")\n  pw.expect(\"2\").toBeType(\"bar\")\n  pw.expect(true).toBeType(\"baz\")\n  pw.expect({}).toBeType(\"qux\")\n  pw.expect(undefined).toBeType(\"quux\")\n  \n  pw.expect(2).not.toBeType(\"foo\")\n  pw.expect(\"2\").not.toBeType(\"bar\")\n  pw.expect(true).not.toBeType(\"baz\")\n  pw.expect({}).not.toBeType(\"qux\")\n  pw.expect(undefined).not.toBeType(\"quux\")\n})\n\npw.test(\"`toHaveLength()` error scenarios\", () => {\n  pw.expect(5).toHaveLength(0)\n  pw.expect(true).toHaveLength(0)\n\n  pw.expect(5).not.toHaveLength(0)\n  pw.expect(true).not.toHaveLength(0)\n\n  pw.expect([1, 2, 3, 4]).toHaveLength(\"a\")\n\n  pw.expect([1, 2, 3, 4]).not.toHaveLength(\"a\")\n})\n\npw.test(\"`toInclude() error scenarios`\", () => {\n  pw.expect(5).not.toInclude(0)\n  pw.expect(true).not.toInclude(0)\n\n  pw.expect([1, 2, 3, 4]).not.toInclude(null)\n\n  pw.expect([1, 2, 3, 4]).not.toInclude(undefined)\n})",
+                    "preRequestScript": "",
+                    "requestVariables": []
+                }
+            ],
+            "auth": {
+                "authType": "inherit",
+                "authActive": true
+            },
+            "headers": []
+        }
+    ],
+    "requests": [],
+    "auth": {
+        "authType": "inherit",
+        "authActive": true
+    },
+    "headers": []
+}

+ 2 - 2
packages/hoppscotch-cli/src/commands/test.ts

@@ -1,7 +1,7 @@
 import { handleError } from "../handlers/error";
 import { parseDelayOption } from "../options/test/delay";
 import { parseEnvsData } from "../options/test/env";
-import { TestCmdOptions, TestCmdEnvironmentOptions } from "../types/commands";
+import { TestCmdEnvironmentOptions, TestCmdOptions } from "../types/commands";
 import { HoppEnvs } from "../types/request";
 import { isHoppCLIError } from "../utils/checks";
 import {
@@ -22,7 +22,7 @@ export const test = (pathOrId: string, options: TestCmdOptions) => async () => {
     const collections = await parseCollectionData(pathOrId, options);
 
     const report = await collectionsRunner({ collections, envs, delay });
-    const hasSucceeded = collectionsRunnerResult(report);
+    const hasSucceeded = collectionsRunnerResult(report, options.reporterJunit);
 
     collectionsRunnerExit(hasSucceeded);
   } catch (e) {

+ 4 - 0
packages/hoppscotch-cli/src/handlers/error.ts

@@ -97,6 +97,10 @@ export const handleError = <T extends HoppErrorCode>(error: HoppError<T>) => {
     case "SERVER_CONNECTION_REFUSED":
       ERROR_MSG = `Unable to connect to the server. Please check your network connection or server instance URL and try again: ${error.data}`;
       break;
+    case "REPORT_EXPORT_FAILED":
+      const moreInfo = error.data ? `: ${error.data}` : S.empty;
+      ERROR_MSG = `Failed to export the report at ${error.path}${moreInfo}`;
+      break;
   }
 
   if (!S.isEmpty(ERROR_MSG)) {

+ 16 - 1
packages/hoppscotch-cli/src/index.ts

@@ -65,6 +65,10 @@ program
     "personal access token to access collections/environments from a workspace"
   )
   .option("--server <server_url>", "server URL for SH instance")
+  .option(
+    "--reporter-junit [path]",
+    "generate JUnit report optionally specifying the path"
+  )
   .allowExcessArguments(false)
   .allowUnknownOption(false)
   .description("running hoppscotch collection.json file")
@@ -74,7 +78,18 @@ program
       "https://docs.hoppscotch.io/documentation/clients/cli/overview#commands"
     )}`
   )
-  .action(async (pathOrId, options) => await test(pathOrId, options)());
+  .action(async (pathOrId, options) => {
+    const overrides: Record<string, unknown> = {};
+
+    // Choose `hopp-junit-report.xml` as the default value if `reporter-junit` flag is supplied without a value
+    if (options.reporterJunit === true) {
+      overrides.reporterJunit = "hopp-junit-report.xml";
+    }
+
+    const effectiveOptions = { ...options, ...overrides };
+
+    await test(pathOrId, effectiveOptions)();
+  });
 
 export const cli = async (args: string[]) => {
   try {

+ 1 - 0
packages/hoppscotch-cli/src/types/commands.ts

@@ -3,6 +3,7 @@ export type TestCmdOptions = {
   delay?: string;
   token?: string;
   server?: string;
+  reporterJunit?: string;
 };
 
 // Consumed in the collection `file_path_or_id` argument action handler

+ 1 - 0
packages/hoppscotch-cli/src/types/errors.ts

@@ -31,6 +31,7 @@ type HoppErrors = {
   INVALID_ID: HoppErrorData;
   INVALID_SERVER_URL: HoppErrorData;
   SERVER_CONNECTION_REFUSED: HoppErrorData;
+  REPORT_EXPORT_FAILED: HoppErrorPath & HoppErrorData;
 };
 
 export type HoppErrorCode = keyof HoppErrors;

+ 76 - 37
packages/hoppscotch-cli/src/utils/collections.ts

@@ -27,6 +27,7 @@ import {
 } from "./display";
 import { exceptionColors } from "./getters";
 import { getPreRequestMetrics } from "./pre-request";
+import { buildJUnitReport, generateJUnitReportExport } from "./reporters/junit";
 import {
   getRequestMetrics,
   preProcessRequest,
@@ -56,19 +57,22 @@ export const collectionsRunner = async (
     // Pop out top-most collection from stack to be processed.
     const { collection, path } = <CollectionStack>collectionStack.pop();
 
-      // Processing each request in collection
-      for (const request of collection.requests) {
-        const _request = preProcessRequest(request as HoppRESTRequest, collection);
-        const requestPath = `${path}/${_request.name}`;
-        const processRequestParams: ProcessRequestParams = {
-          path: requestPath,
-          request: _request,
-          envs,
-          delay,
-        };
+    // Processing each request in collection
+    for (const request of collection.requests) {
+      const _request = preProcessRequest(
+        request as HoppRESTRequest,
+        collection
+      );
+      const requestPath = `${path}/${_request.name}`;
+      const processRequestParams: ProcessRequestParams = {
+        path: requestPath,
+        request: _request,
+        envs,
+        delay,
+      };
 
-        // Request processing initiated message.
-        log(WARN(`\nRunning: ${chalk.bold(requestPath)}`));
+      // Request processing initiated message.
+      log(WARN(`\nRunning: ${chalk.bold(requestPath)}`));
 
       // Processing current request.
       const result = await processRequest(processRequestParams)();
@@ -78,34 +82,39 @@ export const collectionsRunner = async (
       envs.global = global;
       envs.selected = selected;
 
-        // Storing current request's report.
-        const requestReport = result.report;
-        requestsReport.push(requestReport);
+      // Storing current request's report.
+      const requestReport = result.report;
+      requestsReport.push(requestReport);
+    }
+
+    // Pushing remaining folders realted collection to stack.
+    for (const folder of collection.folders) {
+      const updatedFolder: HoppCollection = { ...folder };
+
+      if (updatedFolder.auth?.authType === "inherit") {
+        updatedFolder.auth = collection.auth;
       }
 
-      // Pushing remaining folders realted collection to stack.
-      for (const folder of collection.folders) {
-        const updatedFolder: HoppCollection = { ...folder }
-
-        if (updatedFolder.auth?.authType === "inherit") {
-          updatedFolder.auth = collection.auth;
-        }
-
-        if (collection.headers?.length) {
-          // Filter out header entries present in the parent collection under the same name
-          // This ensures the folder headers take precedence over the collection headers
-          const filteredHeaders = collection.headers.filter((collectionHeaderEntries) => {
-            return !updatedFolder.headers.some((folderHeaderEntries) => folderHeaderEntries.key === collectionHeaderEntries.key)
-          })
-          updatedFolder.headers.push(...filteredHeaders);
-        }
-
-        collectionStack.push({
-          path: `${path}/${updatedFolder.name}`,
-          collection: updatedFolder,
-        });
+      if (collection.headers?.length) {
+        // Filter out header entries present in the parent collection under the same name
+        // This ensures the folder headers take precedence over the collection headers
+        const filteredHeaders = collection.headers.filter(
+          (collectionHeaderEntries) => {
+            return !updatedFolder.headers.some(
+              (folderHeaderEntries) =>
+                folderHeaderEntries.key === collectionHeaderEntries.key
+            );
+          }
+        );
+        updatedFolder.headers.push(...filteredHeaders);
       }
+
+      collectionStack.push({
+        path: `${path}/${updatedFolder.name}`,
+        collection: updatedFolder,
+      });
     }
+  }
 
   return requestsReport;
 };
@@ -134,7 +143,8 @@ const getCollectionStack = (collections: HoppCollection[]): CollectionStack[] =>
  * False, if errors occurred or test-cases failed.
  */
 export const collectionsRunnerResult = (
-  requestsReport: RequestReport[]
+  requestsReport: RequestReport[],
+  reporterJUnitExportPath?: string
 ): boolean => {
   const overallTestMetrics = <TestMetrics>{
     tests: { failed: 0, passed: 0 },
@@ -152,6 +162,9 @@ export const collectionsRunnerResult = (
   };
   let finalResult = true;
 
+  let totalErroredTestCases = 0;
+  let totalFailedTestCases = 0;
+
   // Printing requests-report details of failed-tests and errors
   for (const requestReport of requestsReport) {
     const { path, tests, errors, result, duration } = requestReport;
@@ -165,6 +178,19 @@ export const collectionsRunnerResult = (
 
     printErrorsReport(path, errors);
 
+    if (reporterJUnitExportPath) {
+      const { failedRequestTestCases, erroredRequestTestCases } =
+        buildJUnitReport({
+          path,
+          tests,
+          errors,
+          duration: duration.test,
+        });
+
+      totalFailedTestCases += failedRequestTestCases;
+      totalErroredTestCases += erroredRequestTestCases;
+    }
+
     /**
      * Extracting current request report's test-metrics and updating
      * overall test-metrics.
@@ -216,6 +242,19 @@ export const collectionsRunnerResult = (
   printRequestsMetrics(overallRequestMetrics);
   printPreRequestMetrics(overallPreRequestMetrics);
 
+  if (reporterJUnitExportPath) {
+    const totalTestCases =
+      overallTestMetrics.tests.failed + overallTestMetrics.tests.passed;
+
+    generateJUnitReportExport({
+      totalTestCases,
+      totalFailedTestCases,
+      totalErroredTestCases,
+      testDuration: overallTestMetrics.duration,
+      reporterJUnitExportPath,
+    });
+  }
+
   return finalResult;
 };
 

Some files were not shown because too many files changed in this diff