testdriverai 7.1.0 → 7.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/agent/index.js +18 -45
  4. package/agent/interface.js +13 -2
  5. package/agent/lib/commands.js +1 -1
  6. package/agent/lib/redraw.js +1 -1
  7. package/agent/lib/sandbox.js +30 -2
  8. package/agent/lib/valid-version.js +2 -2
  9. package/debugger/index.html +1 -1
  10. package/docs/docs.json +140 -131
  11. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  12. package/docs/v7/_drafts/agents.mdx +852 -0
  13. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  14. package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
  15. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  16. package/docs/v7/_drafts/error-handling.mdx +501 -0
  17. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  18. package/docs/v7/_drafts/init-command.mdx +95 -0
  19. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  20. package/docs/v7/_drafts/plugin-migration.mdx +222 -0
  21. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  22. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  23. package/docs/v7/_drafts/sdk-logging.mdx +222 -0
  24. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  25. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  26. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  27. package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
  28. package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
  29. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  30. package/docs/v7/api/client.mdx +1 -1
  31. package/docs/v7/api/dashcam.mdx +2 -2
  32. package/docs/v7/api/elements.mdx +143 -41
  33. package/docs/v7/api/find.mdx +258 -0
  34. package/docs/v7/api/type.mdx +51 -7
  35. package/docs/v7/features/ai-native.mdx +427 -0
  36. package/docs/v7/features/easy-to-write.mdx +351 -0
  37. package/docs/v7/features/enterprise.mdx +540 -0
  38. package/docs/v7/features/fast.mdx +424 -0
  39. package/docs/v7/features/observable.mdx +623 -0
  40. package/docs/v7/features/powerful.mdx +531 -0
  41. package/docs/v7/features/scalable.mdx +417 -0
  42. package/docs/v7/features/stable.mdx +514 -0
  43. package/docs/v7/getting-started/configuration.mdx +1 -1
  44. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  45. package/docs/v7/getting-started/installation.mdx +486 -0
  46. package/docs/v7/getting-started/quickstart.mdx +51 -5
  47. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  48. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  49. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  50. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  51. package/docs/v7/playwright.mdx +3 -3
  52. package/docs/v7/presets/chrome.mdx +16 -0
  53. package/docs/v7/presets/electron.mdx +18 -0
  54. package/docs/v7/presets/vscode.mdx +19 -0
  55. package/examples/run-tests-with-recording.sh +70 -0
  56. package/examples/screenshot-example.js +63 -0
  57. package/examples/sdk-awesome-logs-demo.js +177 -0
  58. package/examples/sdk-cache-thresholds.js +96 -0
  59. package/examples/sdk-element-properties.js +155 -0
  60. package/examples/sdk-simple-example.js +65 -0
  61. package/examples/test-recording-example.test.js +166 -0
  62. package/interfaces/cli/commands/init.js +358 -0
  63. package/interfaces/vitest-plugin.mjs +214 -10
  64. package/{src → lib}/core/Dashcam.js +41 -4
  65. package/{src → lib}/vitest/hooks.mjs +118 -100
  66. package/lib/vitest/setup.mjs +44 -0
  67. package/package.json +9 -10
  68. package/sdk.d.ts +15 -2
  69. package/sdk.js +72 -17
  70. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  71. package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
  72. package/test/manual/test-find-api.js +73 -0
  73. package/test/manual/test-init.sh +54 -0
  74. package/test/manual/test-prompt-cache.js +96 -0
  75. package/test/manual/test-provision-auth.mjs +22 -0
  76. package/test/manual/test-sandbox-render.js +28 -0
  77. package/test/manual/test-sdk-methods.js +15 -0
  78. package/test/manual/test-sdk-refactor.js +53 -0
  79. package/test/manual/test-stack-trace.mjs +57 -0
  80. package/test/testdriver/assert.test.mjs +41 -0
  81. package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
  82. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
  83. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
  84. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
  85. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
  86. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
  87. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
  88. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
  89. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
  90. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
  91. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
  92. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
  93. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
  94. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
  95. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
  96. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
  97. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
  98. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
  99. package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
  100. package/test/testdriver/setup/testHelpers.mjs +653 -0
  101. package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
  102. package/vitest.config.mjs +8 -59
  103. package/.github/dependabot.yml +0 -11
  104. package/.github/workflows/acceptance-linux.yml +0 -75
  105. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  106. package/.github/workflows/acceptance-tests.yml +0 -130
  107. package/.github/workflows/lint.yml +0 -27
  108. package/.github/workflows/publish-canary.yml +0 -40
  109. package/.github/workflows/publish-latest.yml +0 -61
  110. package/.github/workflows/test-install.yml +0 -29
  111. package/.vscode/extensions.json +0 -3
  112. package/.vscode/launch.json +0 -22
  113. package/.vscode/settings.json +0 -14
  114. package/AGENTS.md +0 -550
  115. package/CODEOWNERS +0 -2
  116. package/_testdriver/acceptance/assert.yaml +0 -7
  117. package/_testdriver/acceptance/dashcam.yaml +0 -9
  118. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  119. package/_testdriver/acceptance/embed.yaml +0 -9
  120. package/_testdriver/acceptance/exec-js.yaml +0 -29
  121. package/_testdriver/acceptance/exec-output.yaml +0 -43
  122. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  123. package/_testdriver/acceptance/focus-window.yaml +0 -16
  124. package/_testdriver/acceptance/hover-image.yaml +0 -18
  125. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  126. package/_testdriver/acceptance/hover-text.yaml +0 -14
  127. package/_testdriver/acceptance/if-else.yaml +0 -31
  128. package/_testdriver/acceptance/match-image.yaml +0 -15
  129. package/_testdriver/acceptance/press-keys.yaml +0 -35
  130. package/_testdriver/acceptance/prompt.yaml +0 -11
  131. package/_testdriver/acceptance/remember.yaml +0 -27
  132. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  133. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  134. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  135. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  136. package/_testdriver/acceptance/scroll.yaml +0 -33
  137. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  138. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  139. package/_testdriver/acceptance/type.yaml +0 -29
  140. package/_testdriver/behavior/failure.yaml +0 -7
  141. package/_testdriver/behavior/hover-text.yaml +0 -13
  142. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  143. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  144. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  145. package/_testdriver/behavior/secrets.yaml +0 -7
  146. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  147. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  148. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  149. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  150. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  151. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  152. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  153. package/_testdriver/edge-cases/success-test.yaml +0 -9
  154. package/_testdriver/examples/android/example.yaml +0 -12
  155. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  156. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  157. package/_testdriver/examples/android/readme.md +0 -7
  158. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  159. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  160. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  161. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  162. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  163. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  164. package/_testdriver/lifecycle/postrun.yaml +0 -8
  165. package/_testdriver/lifecycle/prerun.yaml +0 -15
  166. package/_testdriver/lifecycle/provision.yaml +0 -25
  167. package/docs/v7/guides/ci-cd/azure.mdx +0 -587
  168. package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
  169. package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
  170. package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
  171. package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
  172. package/docs/v7/guides/ci-cd/travis.mdx +0 -438
  173. package/scripts/view-test-results.mjs +0 -96
  174. package/src/vitest/extended.mjs +0 -108
  175. package/src/vitest/index.mjs +0 -64
  176. package/src/vitest/utils.mjs +0 -150
  177. package/styles/.vale-config/2-MDX.ini +0 -5
  178. package/styles/Microsoft/AMPM.yml +0 -9
  179. package/styles/Microsoft/Accessibility.yml +0 -30
  180. package/styles/Microsoft/Acronyms.yml +0 -64
  181. package/styles/Microsoft/Adverbs.yml +0 -272
  182. package/styles/Microsoft/Auto.yml +0 -11
  183. package/styles/Microsoft/Avoid.yml +0 -14
  184. package/styles/Microsoft/Contractions.yml +0 -50
  185. package/styles/Microsoft/Dashes.yml +0 -13
  186. package/styles/Microsoft/DateFormat.yml +0 -8
  187. package/styles/Microsoft/DateNumbers.yml +0 -40
  188. package/styles/Microsoft/DateOrder.yml +0 -8
  189. package/styles/Microsoft/Ellipses.yml +0 -9
  190. package/styles/Microsoft/FirstPerson.yml +0 -16
  191. package/styles/Microsoft/Foreign.yml +0 -13
  192. package/styles/Microsoft/Gender.yml +0 -8
  193. package/styles/Microsoft/GenderBias.yml +0 -42
  194. package/styles/Microsoft/GeneralURL.yml +0 -11
  195. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  196. package/styles/Microsoft/HeadingColons.yml +0 -8
  197. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  198. package/styles/Microsoft/Headings.yml +0 -28
  199. package/styles/Microsoft/Hyphens.yml +0 -14
  200. package/styles/Microsoft/Negative.yml +0 -13
  201. package/styles/Microsoft/Ordinal.yml +0 -13
  202. package/styles/Microsoft/OxfordComma.yml +0 -8
  203. package/styles/Microsoft/Passive.yml +0 -183
  204. package/styles/Microsoft/Percentages.yml +0 -7
  205. package/styles/Microsoft/Plurals.yml +0 -7
  206. package/styles/Microsoft/Quotes.yml +0 -7
  207. package/styles/Microsoft/RangeTime.yml +0 -13
  208. package/styles/Microsoft/Semicolon.yml +0 -8
  209. package/styles/Microsoft/SentenceLength.yml +0 -6
  210. package/styles/Microsoft/Spacing.yml +0 -8
  211. package/styles/Microsoft/Suspended.yml +0 -7
  212. package/styles/Microsoft/Terms.yml +0 -42
  213. package/styles/Microsoft/URLFormat.yml +0 -9
  214. package/styles/Microsoft/Units.yml +0 -16
  215. package/styles/Microsoft/Vocab.yml +0 -25
  216. package/styles/Microsoft/We.yml +0 -11
  217. package/styles/Microsoft/Wordiness.yml +0 -127
  218. package/styles/Microsoft/meta.json +0 -4
  219. package/styles/alex/Ablist.yml +0 -274
  220. package/styles/alex/Condescending.yml +0 -16
  221. package/styles/alex/Gendered.yml +0 -110
  222. package/styles/alex/LGBTQ.yml +0 -55
  223. package/styles/alex/OCD.yml +0 -10
  224. package/styles/alex/Press.yml +0 -12
  225. package/styles/alex/ProfanityLikely.yml +0 -1289
  226. package/styles/alex/ProfanityMaybe.yml +0 -282
  227. package/styles/alex/ProfanityUnlikely.yml +0 -251
  228. package/styles/alex/README.md +0 -27
  229. package/styles/alex/Race.yml +0 -85
  230. package/styles/alex/Suicide.yml +0 -26
  231. package/styles/alex/meta.json +0 -4
  232. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  233. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  234. package/styles/proselint/Airlinese.yml +0 -8
  235. package/styles/proselint/AnimalLabels.yml +0 -48
  236. package/styles/proselint/Annotations.yml +0 -9
  237. package/styles/proselint/Apologizing.yml +0 -8
  238. package/styles/proselint/Archaisms.yml +0 -52
  239. package/styles/proselint/But.yml +0 -8
  240. package/styles/proselint/Cliches.yml +0 -782
  241. package/styles/proselint/CorporateSpeak.yml +0 -30
  242. package/styles/proselint/Currency.yml +0 -5
  243. package/styles/proselint/Cursing.yml +0 -15
  244. package/styles/proselint/DateCase.yml +0 -7
  245. package/styles/proselint/DateMidnight.yml +0 -7
  246. package/styles/proselint/DateRedundancy.yml +0 -10
  247. package/styles/proselint/DateSpacing.yml +0 -7
  248. package/styles/proselint/DenizenLabels.yml +0 -52
  249. package/styles/proselint/Diacritical.yml +0 -95
  250. package/styles/proselint/GenderBias.yml +0 -45
  251. package/styles/proselint/GroupTerms.yml +0 -39
  252. package/styles/proselint/Hedging.yml +0 -8
  253. package/styles/proselint/Hyperbole.yml +0 -6
  254. package/styles/proselint/Jargon.yml +0 -11
  255. package/styles/proselint/LGBTOffensive.yml +0 -13
  256. package/styles/proselint/LGBTTerms.yml +0 -15
  257. package/styles/proselint/Malapropisms.yml +0 -8
  258. package/styles/proselint/Needless.yml +0 -358
  259. package/styles/proselint/Nonwords.yml +0 -38
  260. package/styles/proselint/Oxymorons.yml +0 -22
  261. package/styles/proselint/P-Value.yml +0 -6
  262. package/styles/proselint/RASSyndrome.yml +0 -30
  263. package/styles/proselint/README.md +0 -12
  264. package/styles/proselint/Skunked.yml +0 -13
  265. package/styles/proselint/Spelling.yml +0 -17
  266. package/styles/proselint/Typography.yml +0 -11
  267. package/styles/proselint/Uncomparables.yml +0 -50
  268. package/styles/proselint/Very.yml +0 -6
  269. package/styles/proselint/meta.json +0 -15
  270. package/styles/write-good/Cliches.yml +0 -702
  271. package/styles/write-good/E-Prime.yml +0 -32
  272. package/styles/write-good/Illusions.yml +0 -11
  273. package/styles/write-good/Passive.yml +0 -183
  274. package/styles/write-good/README.md +0 -27
  275. package/styles/write-good/So.yml +0 -5
  276. package/styles/write-good/ThereIs.yml +0 -6
  277. package/styles/write-good/TooWordy.yml +0 -221
  278. package/styles/write-good/Weasel.yml +0 -29
  279. package/styles/write-good/meta.json +0 -4
  280. package/test/dashcam.test.js +0 -137
  281. package/test/mcp-example-test.yaml +0 -27
  282. package/test/test_parser.js +0 -47
  283. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  284. package/testdriver/acceptance-sdk/README.md +0 -128
  285. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  286. package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
  287. package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
  288. package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
  289. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
  290. package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
  291. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  292. package/vale.ini +0 -18
  293. package/vitest.config.example.js +0 -19
  294. package/vitest.config.mjs.bak +0 -44
  295. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  296. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  297. /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
  298. /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
  299. /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
  300. /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
  301. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  302. /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
  303. /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
  304. /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
  305. /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
  306. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  307. /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
  308. /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
  309. /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
  310. /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
  311. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  312. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  313. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  314. /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
  315. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  316. /package/{src → lib}/core/index.d.ts +0 -0
  317. /package/{src → lib}/core/index.js +0 -0
  318. /package/{src → lib}/presets/index.mjs +0 -0
  319. /package/{src → lib}/vitest/hooks.d.ts +0 -0
  320. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  325. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -1,498 +0,0 @@
1
- ---
2
- title: "GitLab CI"
3
- description: "Run TestDriver tests in GitLab CI/CD"
4
- icon: "gitlab"
5
- ---
6
-
7
- ## Basic Setup
8
-
9
- Create `.gitlab-ci.yml`:
10
-
11
- ```yaml
12
- stages:
13
- - test
14
-
15
- test:
16
- stage: test
17
- image: node:18
18
-
19
- before_script:
20
- - npm ci
21
-
22
- script:
23
- - npx vitest
24
-
25
- variables:
26
- TD_API_KEY: $TD_API_KEY
27
-
28
- artifacts:
29
- when: always
30
- paths:
31
- - test-results/
32
- reports:
33
- junit: test-results/junit.xml
34
- ```
35
-
36
- ## Add API Key
37
-
38
- 1. Go to **Settings** → **CI/CD** → **Variables**
39
- 2. Click **Add variable**
40
- 3. Key: `TD_API_KEY`
41
- 4. Value: Your API key from [dashboard.testdriver.ai](https://dashboard.testdriver.ai)
42
- 5. Check **Protect variable** (recommended)
43
- 6. Check **Mask variable** (recommended)
44
- 7. Click **Add variable**
45
-
46
- ## Parallel Jobs
47
-
48
- Run tests in parallel:
49
-
50
- ```yaml
51
- test:
52
- stage: test
53
- image: node:18
54
- parallel: 4
55
-
56
- before_script:
57
- - npm ci
58
-
59
- script:
60
- - npx vitest --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL
61
-
62
- variables:
63
- TD_API_KEY: $TD_API_KEY
64
- ```
65
-
66
- GitLab automatically sets `CI_NODE_INDEX` (1-4) and `CI_NODE_TOTAL` (4).
67
-
68
- ## Cache Dependencies
69
-
70
- Speed up builds with caching:
71
-
72
- ```yaml
73
- test:
74
- stage: test
75
- image: node:18
76
-
77
- cache:
78
- paths:
79
- - node_modules/
80
- key:
81
- files:
82
- - package-lock.json
83
-
84
- before_script:
85
- - npm ci
86
-
87
- script:
88
- - npx vitest
89
-
90
- variables:
91
- TD_API_KEY: $TD_API_KEY
92
- ```
93
-
94
- ## Save Dashcam URLs
95
-
96
- Extract replay URLs from test output:
97
-
98
- ```yaml
99
- test:
100
- stage: test
101
- image: node:18
102
-
103
- script:
104
- - npx vitest 2>&1 | tee test-output.log
105
- - grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
106
-
107
- variables:
108
- TD_API_KEY: $TD_API_KEY
109
-
110
- artifacts:
111
- when: always
112
- paths:
113
- - test-results/
114
- - test-output.log
115
- - dashcam-urls.txt
116
- reports:
117
- junit: test-results/junit.xml
118
- ```
119
-
120
- ## Scheduled Pipelines
121
-
122
- Run tests on schedule:
123
-
124
- 1. Go to **CI/CD** → **Schedules**
125
- 2. Click **New schedule**
126
- 3. Description: "Nightly tests"
127
- 4. Interval pattern: `0 2 * * *` (2 AM daily)
128
- 5. Target branch: `main`
129
- 6. Click **Save pipeline schedule**
130
-
131
- Or use `only` in `.gitlab-ci.yml`:
132
-
133
- ```yaml
134
- test:
135
- script:
136
- - npx vitest
137
-
138
- only:
139
- - schedules
140
- - merge_requests
141
- - main
142
- ```
143
-
144
- ## Retry Failed Tests
145
-
146
- Automatically retry on failure:
147
-
148
- ```yaml
149
- test:
150
- stage: test
151
- image: node:18
152
-
153
- retry:
154
- max: 2
155
- when:
156
- - runner_system_failure
157
- - stuck_or_timeout_failure
158
-
159
- script:
160
- - npx vitest
161
-
162
- variables:
163
- TD_API_KEY: $TD_API_KEY
164
- ```
165
-
166
- ## Multiple Node Versions
167
-
168
- Test across Node.js versions:
169
-
170
- ```yaml
171
- .test_template:
172
- stage: test
173
-
174
- before_script:
175
- - npm ci
176
-
177
- script:
178
- - npx vitest
179
-
180
- variables:
181
- TD_API_KEY: $TD_API_KEY
182
-
183
- test:node16:
184
- extends: .test_template
185
- image: node:16
186
-
187
- test:node18:
188
- extends: .test_template
189
- image: node:18
190
-
191
- test:node20:
192
- extends: .test_template
193
- image: node:20
194
- ```
195
-
196
- ## Environment-Specific Tests
197
-
198
- Test against different environments:
199
-
200
- ```yaml
201
- test:staging:
202
- stage: test
203
- image: node:18
204
-
205
- script:
206
- - npx vitest
207
-
208
- variables:
209
- TD_API_KEY: $TD_API_KEY
210
- TEST_URL: https://staging.example.com
211
-
212
- only:
213
- - merge_requests
214
-
215
- test:production:
216
- stage: test
217
- image: node:18
218
-
219
- script:
220
- - npx vitest
221
-
222
- variables:
223
- TD_API_KEY: $TD_API_KEY
224
- TEST_URL: https://example.com
225
-
226
- only:
227
- - main
228
- ```
229
-
230
- ## Conditional Execution
231
-
232
- Skip tests on documentation changes:
233
-
234
- ```yaml
235
- test:
236
- stage: test
237
- image: node:18
238
-
239
- script:
240
- - npx vitest
241
-
242
- variables:
243
- TD_API_KEY: $TD_API_KEY
244
-
245
- except:
246
- changes:
247
- - "*.md"
248
- - "docs/**/*"
249
- ```
250
-
251
- Or run only on specific changes:
252
-
253
- ```yaml
254
- test:
255
- only:
256
- changes:
257
- - "src/**/*"
258
- - "test/**/*"
259
- - "package.json"
260
- ```
261
-
262
- ## Docker-in-Docker
263
-
264
- If you need Docker for your tests:
265
-
266
- ```yaml
267
- test:
268
- stage: test
269
- image: docker:latest
270
-
271
- services:
272
- - docker:dind
273
-
274
- variables:
275
- DOCKER_DRIVER: overlay2
276
- TD_API_KEY: $TD_API_KEY
277
-
278
- before_script:
279
- - apk add --no-cache nodejs npm
280
- - npm ci
281
-
282
- script:
283
- - npx vitest
284
- ```
285
-
286
- ## Matrix Jobs
287
-
288
- Test multiple configurations:
289
-
290
- ```yaml
291
- test:
292
- stage: test
293
- parallel:
294
- matrix:
295
- - NODE_VERSION: ['16', '18', '20']
296
- OS: ['debian', 'alpine']
297
-
298
- image: node:${NODE_VERSION}-${OS}
299
-
300
- script:
301
- - npm ci
302
- - npx vitest
303
-
304
- variables:
305
- TD_API_KEY: $TD_API_KEY
306
- ```
307
-
308
- ## Code Coverage
309
-
310
- Generate and publish coverage reports:
311
-
312
- ```yaml
313
- test:
314
- stage: test
315
- image: node:18
316
-
317
- script:
318
- - npx vitest --coverage
319
-
320
- coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'
321
-
322
- artifacts:
323
- reports:
324
- coverage_report:
325
- coverage_format: cobertura
326
- path: coverage/cobertura-coverage.xml
327
- ```
328
-
329
- ## Fail Fast
330
-
331
- Stop pipeline on first failure:
332
-
333
- ```yaml
334
- workflow:
335
- rules:
336
- - when: always
337
-
338
- test:
339
- stage: test
340
- parallel: 4
341
-
342
- script:
343
- - npx vitest --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL --bail
344
- ```
345
-
346
- ## Manual Triggers
347
-
348
- Add manual approval step:
349
-
350
- ```yaml
351
- test:
352
- stage: test
353
- when: manual
354
- allow_failure: false
355
-
356
- script:
357
- - npx vitest
358
-
359
- variables:
360
- TD_API_KEY: $TD_API_KEY
361
- ```
362
-
363
- ## Troubleshooting
364
-
365
- ### Tests timeout
366
-
367
- Increase timeout:
368
-
369
- ```yaml
370
- test:
371
- timeout: 30m # Default is 1 hour
372
-
373
- script:
374
- - npx vitest
375
- ```
376
-
377
- ### API key not found
378
-
379
- Debug variables:
380
-
381
- ```yaml
382
- test:
383
- script:
384
- - echo "Has TD_API_KEY ${TD_API_KEY:+yes}"
385
- - npx vitest
386
- ```
387
-
388
- ### Cache not working
389
-
390
- Clear cache and retry:
391
-
392
- ```yaml
393
- test:
394
- cache:
395
- paths:
396
- - node_modules/
397
- key:
398
- files:
399
- - package-lock.json
400
- policy: pull-push # Always update cache
401
- ```
402
-
403
- Or clear manually: **CI/CD** → **Pipelines** → **Clear runner caches**
404
-
405
- ## Complete Example
406
-
407
- Full-featured pipeline:
408
-
409
- ```yaml
410
- stages:
411
- - test
412
- - report
413
-
414
- variables:
415
- NODE_VERSION: '18'
416
-
417
- .test_template:
418
- image: node:${NODE_VERSION}
419
-
420
- cache:
421
- paths:
422
- - node_modules/
423
- key:
424
- files:
425
- - package-lock.json
426
-
427
- before_script:
428
- - npm ci
429
-
430
- variables:
431
- TD_API_KEY: $TD_API_KEY
432
-
433
- test:
434
- extends: .test_template
435
- stage: test
436
- parallel: 4
437
-
438
- retry:
439
- max: 2
440
- when:
441
- - runner_system_failure
442
-
443
- script:
444
- - npx vitest --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL 2>&1 | tee test-output.log
445
- - grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
446
-
447
- artifacts:
448
- when: always
449
- expire_in: 1 week
450
- paths:
451
- - test-results/
452
- - test-output.log
453
- - dashcam-urls.txt
454
- reports:
455
- junit: test-results/junit.xml
456
-
457
- only:
458
- - merge_requests
459
- - main
460
- - schedules
461
-
462
- report:
463
- stage: report
464
- image: alpine:latest
465
-
466
- dependencies:
467
- - test
468
-
469
- script:
470
- - echo "Tests completed"
471
- - cat dashcam-urls.txt || true
472
-
473
- when: on_failure
474
-
475
- only:
476
- - merge_requests
477
- - main
478
- ```
479
-
480
- ## See Also
481
-
482
- <CardGroup cols={2}>
483
- <Card title="CI/CD Overview" icon="arrows-spin" href="/v7/guides/ci-cd/overview">
484
- CI/CD concepts
485
- </Card>
486
-
487
- <Card title="Performance" icon="gauge" href="/v7/guides/performance">
488
- Optimize tests
489
- </Card>
490
-
491
- <Card title="Troubleshooting" icon="circle-question" href="/v7/guides/troubleshooting">
492
- Common issues
493
- </Card>
494
-
495
- <Card title="GitLab CI Docs" icon="book" href="https://docs.gitlab.com/ee/ci/">
496
- Official docs
497
- </Card>
498
- </CardGroup>