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,523 +0,0 @@
1
- ---
2
- title: "CircleCI"
3
- description: "Run TestDriver tests in CircleCI"
4
- icon: "circle"
5
- ---
6
-
7
- ## Basic Setup
8
-
9
- Create `.circleci/config.yml`:
10
-
11
- ```yaml
12
- version: 2.1
13
-
14
- jobs:
15
- test:
16
- docker:
17
- - image: cimg/node:18.0
18
-
19
- steps:
20
- - checkout
21
-
22
- - restore_cache:
23
- keys:
24
- - v1-deps-{{ checksum "package-lock.json" }}
25
- - v1-deps-
26
-
27
- - run:
28
- name: Install dependencies
29
- command: npm ci
30
-
31
- - save_cache:
32
- key: v1-deps-{{ checksum "package-lock.json" }}
33
- paths:
34
- - node_modules
35
-
36
- - run:
37
- name: Run tests
38
- command: npx vitest
39
- environment:
40
- TD_API_KEY: $TD_API_KEY
41
-
42
- - store_artifacts:
43
- path: test-results
44
-
45
- - store_test_results:
46
- path: test-results
47
-
48
- workflows:
49
- test:
50
- jobs:
51
- - test
52
- ```
53
-
54
- ## Add API Key
55
-
56
- 1. Go to **Project Settings** → **Environment Variables**
57
- 2. Click **Add Environment Variable**
58
- 3. Name: `TD_API_KEY`
59
- 4. Value: Your API key from [dashboard.testdriver.ai](https://dashboard.testdriver.ai)
60
- 5. Click **Add Variable**
61
-
62
- ## Parallel Tests
63
-
64
- Use CircleCI's parallelism feature:
65
-
66
- ```yaml
67
- version: 2.1
68
-
69
- jobs:
70
- test:
71
- docker:
72
- - image: cimg/node:18.0
73
- parallelism: 4
74
-
75
- steps:
76
- - checkout
77
-
78
- - restore_cache:
79
- keys:
80
- - v1-deps-{{ checksum "package-lock.json" }}
81
-
82
- - run: npm ci
83
-
84
- - save_cache:
85
- key: v1-deps-{{ checksum "package-lock.json" }}
86
- paths:
87
- - node_modules
88
-
89
- - run:
90
- name: Run tests (shard $CIRCLE_NODE_INDEX/$CIRCLE_NODE_TOTAL)
91
- command: npx vitest --shard=$CIRCLE_NODE_INDEX/$CIRCLE_NODE_TOTAL
92
-
93
- - store_test_results:
94
- path: test-results
95
-
96
- workflows:
97
- test:
98
- jobs:
99
- - test
100
- ```
101
-
102
- This runs 4 test shards in parallel.
103
-
104
- ## Save Dashcam URLs
105
-
106
- Extract replay URLs:
107
-
108
- ```yaml
109
- - run:
110
- name: Run tests
111
- command: npx vitest 2>&1 | tee test-output.log
112
-
113
- - run:
114
- name: Extract Dashcam URLs
115
- when: always
116
- command: |
117
- grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
118
-
119
- - store_artifacts:
120
- path: test-output.log
121
-
122
- - store_artifacts:
123
- path: dashcam-urls.txt
124
- ```
125
-
126
- ## Scheduled Tests
127
-
128
- Run tests on schedule:
129
-
130
- ```yaml
131
- workflows:
132
- version: 2
133
-
134
- # Run on every commit
135
- test:
136
- jobs:
137
- - test
138
-
139
- # Run nightly at 2 AM
140
- nightly:
141
- triggers:
142
- - schedule:
143
- cron: "0 2 * * *"
144
- filters:
145
- branches:
146
- only:
147
- - main
148
- jobs:
149
- - test
150
- ```
151
-
152
- ## Multiple Node Versions
153
-
154
- Test across Node.js versions:
155
-
156
- ```yaml
157
- version: 2.1
158
-
159
- jobs:
160
- test:
161
- parameters:
162
- node-version:
163
- type: string
164
-
165
- docker:
166
- - image: cimg/node:<< parameters.node-version >>
167
-
168
- steps:
169
- - checkout
170
- - run: npm ci
171
- - run: npx vitest
172
-
173
- workflows:
174
- test-all:
175
- jobs:
176
- - test:
177
- matrix:
178
- parameters:
179
- node-version: ["16.0", "18.0", "20.0"]
180
- ```
181
-
182
- ## Orbs
183
-
184
- Use CircleCI orbs for common tasks:
185
-
186
- ```yaml
187
- version: 2.1
188
-
189
- orbs:
190
- node: circleci/node@5.1.0
191
-
192
- jobs:
193
- test:
194
- docker:
195
- - image: cimg/node:18.0
196
-
197
- steps:
198
- - checkout
199
-
200
- - node/install-packages:
201
- pkg-manager: npm
202
-
203
- - run:
204
- name: Run tests
205
- command: npx vitest
206
- environment:
207
- TD_API_KEY: $TD_API_KEY
208
-
209
- - store_test_results:
210
- path: test-results
211
-
212
- workflows:
213
- test:
214
- jobs:
215
- - test
216
- ```
217
-
218
- ## Conditional Execution
219
-
220
- Skip tests on documentation changes:
221
-
222
- ```yaml
223
- workflows:
224
- test:
225
- jobs:
226
- - test:
227
- filters:
228
- branches:
229
- ignore:
230
- - /docs\/.*/
231
- ```
232
-
233
- Or use CircleCI API to detect changes:
234
-
235
- ```yaml
236
- - run:
237
- name: Check for code changes
238
- command: |
239
- if git diff --name-only HEAD~1 | grep -qE '^(src|test)/'; then
240
- echo "Code changed, running tests"
241
- else
242
- echo "Only docs changed, skipping tests"
243
- circleci step halt
244
- fi
245
- ```
246
-
247
- ## Resource Classes
248
-
249
- Use larger machines for faster tests:
250
-
251
- ```yaml
252
- jobs:
253
- test:
254
- docker:
255
- - image: cimg/node:18.0
256
- resource_class: large # 4 vCPUs, 8GB RAM
257
-
258
- steps:
259
- - checkout
260
- - run: npm ci
261
- - run: npx vitest
262
- ```
263
-
264
- Available classes:
265
- - `small` - 1 vCPU, 2GB RAM
266
- - `medium` (default) - 2 vCPUs, 4GB RAM
267
- - `medium+` - 3 vCPUs, 6GB RAM
268
- - `large` - 4 vCPUs, 8GB RAM
269
- - `xlarge` - 8 vCPUs, 16GB RAM
270
-
271
- ## Retry Failed Tests
272
-
273
- Automatically retry on failure:
274
-
275
- ```yaml
276
- - run:
277
- name: Run tests
278
- command: npx vitest
279
- no_output_timeout: 30m
280
- when: always
281
-
282
- - run:
283
- name: Retry failed tests
284
- command: npx vitest --retry=2
285
- when: on_fail
286
- ```
287
-
288
- ## Save Test Results
289
-
290
- Store JUnit XML for CircleCI dashboard:
291
-
292
- ```yaml
293
- - run:
294
- name: Run tests
295
- command: npx vitest
296
-
297
- - store_test_results:
298
- path: test-results
299
-
300
- - store_artifacts:
301
- path: test-results
302
- destination: test-results
303
- ```
304
-
305
- Requires JUnit reporter in `vitest.config.mjs`:
306
-
307
- ```javascript
308
- export default defineConfig({
309
- test: {
310
- reporters: ['default', 'junit'],
311
- outputFile: {
312
- junit: './test-results/junit.xml'
313
- }
314
- }
315
- });
316
- ```
317
-
318
- ## Workspaces
319
-
320
- Share data between jobs:
321
-
322
- ```yaml
323
- version: 2.1
324
-
325
- jobs:
326
- build:
327
- docker:
328
- - image: cimg/node:18.0
329
- steps:
330
- - checkout
331
- - run: npm ci
332
- - persist_to_workspace:
333
- root: .
334
- paths:
335
- - node_modules
336
-
337
- test:
338
- docker:
339
- - image: cimg/node:18.0
340
- steps:
341
- - checkout
342
- - attach_workspace:
343
- at: .
344
- - run: npx vitest
345
-
346
- workflows:
347
- build-and-test:
348
- jobs:
349
- - build
350
- - test:
351
- requires:
352
- - build
353
- ```
354
-
355
- ## Approval Jobs
356
-
357
- Add manual approval step:
358
-
359
- ```yaml
360
- workflows:
361
- test:
362
- jobs:
363
- - test
364
- - hold:
365
- type: approval
366
- requires:
367
- - test
368
- - deploy:
369
- requires:
370
- - hold
371
- ```
372
-
373
- ## Troubleshooting
374
-
375
- ### Tests timeout
376
-
377
- Increase timeout:
378
-
379
- ```yaml
380
- - run:
381
- name: Run tests
382
- command: npx vitest
383
- no_output_timeout: 30m
384
- ```
385
-
386
- ### Out of memory
387
-
388
- Use larger resource class:
389
-
390
- ```yaml
391
- jobs:
392
- test:
393
- resource_class: large
394
- ```
395
-
396
- Or reduce parallelism in tests:
397
-
398
- ```javascript
399
- // vitest.config.mjs
400
- export default defineConfig({
401
- test: {
402
- maxConcurrency: 3
403
- }
404
- });
405
- ```
406
-
407
- ### API key not found
408
-
409
- Debug environment:
410
-
411
- ```yaml
412
- - run:
413
- name: Debug
414
- command: |
415
- echo "Has TD_API_KEY: ${TD_API_KEY:+yes}"
416
- node --version
417
- npm --version
418
- ```
419
-
420
- ## Complete Example
421
-
422
- Full-featured configuration:
423
-
424
- ```yaml
425
- version: 2.1
426
-
427
- orbs:
428
- node: circleci/node@5.1.0
429
-
430
- jobs:
431
- test:
432
- docker:
433
- - image: cimg/node:18.0
434
-
435
- resource_class: large
436
- parallelism: 4
437
-
438
- steps:
439
- - checkout
440
-
441
- - restore_cache:
442
- keys:
443
- - v1-deps-{{ checksum "package-lock.json" }}
444
- - v1-deps-
445
-
446
- - run:
447
- name: Install dependencies
448
- command: npm ci
449
-
450
- - save_cache:
451
- key: v1-deps-{{ checksum "package-lock.json" }}
452
- paths:
453
- - node_modules
454
-
455
- - run:
456
- name: Run tests (shard $CIRCLE_NODE_INDEX/$CIRCLE_NODE_TOTAL)
457
- command: npx vitest --shard=$CIRCLE_NODE_INDEX/$CIRCLE_NODE_TOTAL 2>&1 | tee test-output.log
458
- environment:
459
- TD_API_KEY: $TD_API_KEY
460
- no_output_timeout: 30m
461
-
462
- - run:
463
- name: Extract Dashcam URLs
464
- when: always
465
- command: |
466
- grep -o 'https://dashcam.testdriver.ai/[a-zA-Z0-9-]*' test-output.log > dashcam-urls.txt || true
467
-
468
- - store_test_results:
469
- path: test-results
470
-
471
- - store_artifacts:
472
- path: test-results
473
- destination: test-results
474
-
475
- - store_artifacts:
476
- path: test-output.log
477
- destination: logs
478
-
479
- - store_artifacts:
480
- path: dashcam-urls.txt
481
- destination: dashcam-urls
482
-
483
- workflows:
484
- version: 2
485
-
486
- test:
487
- jobs:
488
- - test:
489
- filters:
490
- branches:
491
- ignore:
492
- - /docs\/.*/
493
-
494
- nightly:
495
- triggers:
496
- - schedule:
497
- cron: "0 2 * * *"
498
- filters:
499
- branches:
500
- only: main
501
- jobs:
502
- - test
503
- ```
504
-
505
- ## See Also
506
-
507
- <CardGroup cols={2}>
508
- <Card title="CI/CD Overview" icon="arrows-spin" href="/v7/guides/ci-cd/overview">
509
- CI/CD concepts
510
- </Card>
511
-
512
- <Card title="Performance" icon="gauge" href="/v7/guides/performance">
513
- Optimize tests
514
- </Card>
515
-
516
- <Card title="Troubleshooting" icon="circle-question" href="/v7/guides/troubleshooting">
517
- Common issues
518
- </Card>
519
-
520
- <Card title="CircleCI Docs" icon="book" href="https://circleci.com/docs/">
521
- Official docs
522
- </Card>
523
- </CardGroup>