testdriverai 7.0.0 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +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}/setup/globalTeardown.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -1,128 +0,0 @@
1
- # TestDriver SDK Acceptance Tests
2
-
3
- This directory contains acceptance tests for the TestDriver SDK using Vitest.
4
-
5
- ## Running Tests
6
-
7
- ### Run All Tests (Cross-Platform)
8
-
9
- ```bash
10
- npm run test:sdk
11
- ```
12
-
13
- ### Run Platform-Specific Tests
14
-
15
- Use the `TEST_PLATFORM` environment variable to run tests for a specific platform:
16
-
17
- ```bash
18
- # Run Windows-only tests
19
- npm run test:sdk:windows
20
-
21
- # Run macOS-only tests
22
- npm run test:sdk:mac
23
-
24
- # Run Linux-only tests
25
- npm run test:sdk:linux
26
- ```
27
-
28
- Or set the environment variable directly:
29
-
30
- ```bash
31
- TEST_PLATFORM=windows npm run test:sdk
32
- TEST_PLATFORM=mac npm run test:sdk
33
- ```
34
-
35
- ## Test Organization
36
-
37
- ### Cross-Platform Tests
38
-
39
- Tests without a platform suffix run on all platforms:
40
-
41
- - `hover-text.test.mjs` - Runs everywhere
42
- - `scroll.test.mjs` - Runs everywhere
43
- - `screenshot.test.mjs` - Runs everywhere
44
-
45
- ### Platform-Specific Tests
46
-
47
- Platform-specific tests use naming conventions:
48
-
49
- - `*.windows.test.mjs` - Windows-only tests (e.g., `exec-pwsh.windows.test.mjs`)
50
- - `*.mac.test.mjs` - macOS-only tests
51
- - `*.linux.test.mjs` - Linux-only tests
52
-
53
- ### Conditional Test Skipping
54
-
55
- Some tests use `skipIf` to conditionally skip based on the platform:
56
-
57
- ```javascript
58
- it.skipIf(() => testdriver.os === "linux")(
59
- "should run on Windows/Mac",
60
- async () => {
61
- // This test will be skipped on Linux
62
- },
63
- );
64
- ```
65
-
66
- ## Environment Variables
67
-
68
- - `TEST_PLATFORM` - Filter tests by platform (`windows`, `mac`, `linux`)
69
- - `TD_OS` - Override the sandbox OS (defaults to `linux`)
70
- - `TD_API_KEY` - Your TestDriver API key (required)
71
- - `TD_API_ROOT` - API endpoint (optional)
72
- - `DEBUG_ENV` - Show environment variable loading (optional)
73
- - `DEBUG_EVENTS` - Enable detailed event logging (optional)
74
-
75
- ## Examples
76
-
77
- ```bash
78
- # Run only Windows tests on a Windows sandbox
79
- TEST_PLATFORM=windows npm run test:sdk
80
-
81
- # Run all tests but use a Windows sandbox
82
- TD_OS=windows npm run test:sdk
83
-
84
- # Run with debugging enabled
85
- DEBUG_ENV=true DEBUG_EVENTS=true npm run test:sdk
86
-
87
- # Watch mode for development
88
- npm run test:sdk:watch
89
-
90
- # Generate coverage report
91
- npm run test:sdk:coverage
92
- ```
93
-
94
- ## Test Structure
95
-
96
- Each test follows this pattern:
97
-
98
- ```javascript
99
- import { afterEach, beforeEach, describe, it } from "vitest";
100
- import {
101
- createTestClient,
102
- setupTest,
103
- teardownTest,
104
- } from "./setup/testHelpers.mjs";
105
-
106
- describe("My Test", () => {
107
- let testdriver;
108
-
109
- beforeEach(async () => {
110
- testdriver = createTestClient();
111
- await setupTest(testdriver);
112
- });
113
-
114
- afterEach(async () => {
115
- await teardownTest(testdriver);
116
- });
117
-
118
- it("should do something", async () => {
119
- // Your test logic
120
- });
121
- });
122
- ```
123
-
124
- ## See Also
125
-
126
- - [SDK README](../../SDK_README.md) - Full SDK documentation
127
- - [Quick Reference](./QUICK_REFERENCE.md) - SDK method quick reference
128
- - [Test Reporting](./TEST_REPORTING.md) - Test recording and reporting docs
@@ -1,245 +0,0 @@
1
- # TestDriver SDK Test Reporting
2
-
3
- This guide explains the enhanced test reporting system for the TestDriver SDK acceptance tests.
4
-
5
- ## Overview
6
-
7
- The SDK tests use **Vitest** with multiple reporters to provide comprehensive test feedback:
8
-
9
- 1. **Console Output** - Verbose, detailed logs during test execution
10
- 2. **JUnit XML** - For CI/CD integration and third-party tools
11
- 3. **JSON Results** - Machine-readable format for custom reporting
12
- 4. **HTML Report** - Interactive browser-based test results viewer
13
- 5. **GitHub Summary** - Markdown tables in GitHub Actions workflow summaries
14
-
15
- ## Running Tests Locally
16
-
17
- ### Basic Test Run
18
-
19
- ```bash
20
- npm run test:sdk
21
- ```
22
-
23
- This runs all SDK acceptance tests with verbose output.
24
-
25
- ### Watch Mode (for development)
26
-
27
- ```bash
28
- npm run test:sdk:watch
29
- ```
30
-
31
- Re-runs tests automatically when files change.
32
-
33
- ### Interactive UI
34
-
35
- ```bash
36
- npm run test:sdk:ui
37
- ```
38
-
39
- Opens Vitest's web UI for interactive test exploration.
40
-
41
- ### View Results After Running Tests
42
-
43
- After running tests, you have several options to view results:
44
-
45
- #### Terminal Summary
46
-
47
- ```bash
48
- npm run test:sdk:results
49
- ```
50
-
51
- Displays a formatted summary in your terminal with:
52
-
53
- - ✅ Passed test count
54
- - ❌ Failed test count and error details
55
- - ⏱️ Test duration
56
- - 📁 File-by-file breakdown
57
-
58
- #### HTML Report (Best for detailed analysis)
59
-
60
- ```bash
61
- npm run test:sdk:report
62
- ```
63
-
64
- Opens the interactive HTML report in your browser showing:
65
-
66
- - Detailed test execution timeline
67
- - File-by-file results
68
- - Error stack traces with code context
69
- - Test duration metrics
70
-
71
- Or manually open: `test-results/index.html`
72
-
73
- ## GitHub Actions Reporting
74
-
75
- When tests run in GitHub Actions, you get enhanced reporting automatically:
76
-
77
- ### 📊 GitHub Step Summary
78
-
79
- The workflow generates a comprehensive summary visible in the Actions run:
80
-
81
- - **Overview Table**: Pass/fail counts, duration, and totals
82
- - **Failed Tests Section**: Each failure with error messages and stack traces
83
- - **Passed Tests Section**: List of all passing tests organized by file
84
-
85
- To view: Go to the Actions tab → Select your workflow run → Check the "Summary" section
86
-
87
- ### 🧪 Test Summary Action
88
-
89
- The `test-summary/action` provides:
90
-
91
- - Test count badges
92
- - Duration metrics
93
- - Failure annotations in the Files Changed tab
94
-
95
- ### 📦 Test Artifacts
96
-
97
- All test results are uploaded as artifacts (retained for 7 days):
98
-
99
- - `junit.xml` - JUnit format for third-party tools
100
- - `results.json` - Machine-readable JSON
101
- - `index.html` - Interactive HTML report (download and open locally)
102
-
103
- To download artifacts:
104
-
105
- 1. Go to the workflow run
106
- 2. Scroll to "Artifacts" section at the bottom
107
- 3. Download `test-results.zip`
108
-
109
- ## Test Output Files
110
-
111
- All test results are saved to the `test-results/` directory:
112
-
113
- ```
114
- test-results/
115
- ├── junit.xml # JUnit XML format
116
- ├── results.json # Detailed JSON results
117
- └── index.html # Interactive HTML report
118
- ```
119
-
120
- Add this to your `.gitignore`:
121
-
122
- ```
123
- test-results/
124
- ```
125
-
126
- ## Reporters Explained
127
-
128
- ### 1. Verbose Reporter (Console)
129
-
130
- - Shows full test logs in real-time
131
- - Includes console.log output from tests
132
- - Color-coded pass/fail indicators
133
- - Stack traces for failures
134
-
135
- ### 2. JUnit Reporter
136
-
137
- - Industry-standard XML format
138
- - Compatible with Jenkins, Azure DevOps, etc.
139
- - Used by `test-summary/action`
140
-
141
- ### 3. JSON Reporter
142
-
143
- - Complete test results in JSON format
144
- - Programmatically parseable
145
- - Used by the custom results viewer script
146
-
147
- ### 4. HTML Reporter
148
-
149
- - Interactive web-based viewer
150
- - Visual timeline of test execution
151
- - Filterable and searchable results
152
- - Best for debugging failures locally
153
-
154
- ## Customizing Test Output
155
-
156
- ### Run a Single Test File
157
-
158
- ```bash
159
- npx vitest run testdriver/acceptance-sdk/assert.test.mjs
160
- ```
161
-
162
- ### Enable Even More Verbose Logging
163
-
164
- ```bash
165
- VERBOSE=true LOGGING=true npm run test:sdk
166
- ```
167
-
168
- ### Change Parallelism
169
-
170
- Edit `vitest.config.mjs`:
171
-
172
- ```javascript
173
- maxForks: 5, // Run 5 tests in parallel instead of 10
174
- ```
175
-
176
- ## Troubleshooting
177
-
178
- ### "No test results found" error
179
-
180
- Make sure you've run the tests first:
181
-
182
- ```bash
183
- npm run test:sdk
184
- ```
185
-
186
- ### HTML report won't open
187
-
188
- Manually navigate to and open `test-results/index.html` in your browser.
189
-
190
- ### Tests timeout
191
-
192
- Increase timeout in `vitest.config.mjs`:
193
-
194
- ```javascript
195
- testTimeout: 900000, // 15 minutes
196
- ```
197
-
198
- ## Best Practices
199
-
200
- 1. **Use `test:sdk:results`** for quick terminal summaries
201
- 2. **Use `test:sdk:report`** for deep debugging of failures
202
- 3. **Check GitHub Summary** in PR reviews for test status
203
- 4. **Download artifacts** from GitHub Actions for historical analysis
204
- 5. **Run `test:sdk:watch`** during development for fast feedback
205
-
206
- ## Example GitHub Summary Output
207
-
208
- ```markdown
209
- # 🧪 TestDriver SDK Test Results
210
-
211
- ## 📊 Overview
212
-
213
- | Metric | Count |
214
- | ----------- | ------- |
215
- | ✅ Passed | 18 |
216
- | ❌ Failed | 2 |
217
- | ⏭️ Skipped | 0 |
218
- | 📝 Total | 20 |
219
- | ⏱️ Duration | 145.23s |
220
-
221
- ## ❌ Failed Tests
222
-
223
- ### Assert Test > should assert the testdriver login page shows
224
-
225
- **File:** `testdriver/acceptance-sdk/assert.test.mjs`
226
-
227
- **Error:**
228
- ```
229
-
230
- AssertionError: expected false to be truthy
231
-
232
- ```
233
-
234
- ## ✅ Passed Tests
235
-
236
- ### type.test.mjs
237
- - ✅ should type text into input field
238
- - ✅ should clear and retype text
239
-
240
- ### scroll.test.mjs
241
- - ✅ should scroll down the page
242
- - ✅ should scroll to specific element
243
- ```
244
-
245
- This summary appears automatically in every GitHub Actions workflow run!
@@ -1,44 +0,0 @@
1
- /**
2
- * TestDriver SDK - Assert Test (Vitest)
3
- * Converted from: testdriver/acceptance/assert.yaml
4
- */
5
-
6
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
- import {
8
- createTestClient,
9
- setupTest,
10
- teardownTest,
11
- } from "./setup/testHelpers.mjs";
12
-
13
- describe("Assert Test", () => {
14
- let testdriver;
15
-
16
- beforeEach(async (context) => {
17
- // Create a new client for each test
18
- testdriver = createTestClient({
19
- task: context.task,
20
- });
21
-
22
- await setupTest(testdriver);
23
- }, 600000);
24
-
25
- afterEach(async (context) => {
26
- // Teardown after each test, passing the individual test context
27
- const sessionInfo = await teardownTest(testdriver, {
28
- task: context.task,
29
- });
30
- console.log(
31
- `[Test] Teardown complete, dashcam URL: ${sessionInfo.dashcamUrl}`,
32
- );
33
- });
34
-
35
- it("should assert the testdriver login page shows", async () => {
36
- // Assert the TestDriver.ai Sandbox login page is displayed
37
- // const result = await testdriver.assert(
38
- // "the TestDriver.ai Sandbox login page is displayed",
39
- // );
40
-
41
- // expect(result).toBeTruthy();
42
- return true;
43
- });
44
- });
@@ -1,42 +0,0 @@
1
- /**
2
- * TestDriver SDK - Scroll Until Text Test (Vitest)
3
- * Converted from: testdriver/acceptance/scroll-until-text.yaml
4
- */
5
-
6
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
- import {
8
- createTestClient,
9
- performLogin,
10
- setupTest,
11
- teardownTest,
12
- } from "./setup/testHelpers.mjs";
13
-
14
- describe("Scroll Until Text Test", () => {
15
- let testdriver;
16
-
17
- beforeEach(async (context) => {
18
- testdriver = createTestClient({ task: context.task });
19
-
20
- await setupTest(testdriver);
21
- });
22
-
23
- afterEach(async (context) => {
24
- await teardownTest(testdriver, { task: context.task });
25
- });
26
-
27
- it('should scroll until "testdriver socks" appears', async () => {
28
- // Perform login first
29
- await performLogin(testdriver);
30
-
31
- // Scroll until text appears
32
- await testdriver.focusApplication("Google Chrome");
33
- await testdriver.scrollUntilText("testdriver socks", "down");
34
-
35
- // Assert testdriver socks appears on screen
36
- await testdriver.focusApplication("Google Chrome");
37
- const result = await testdriver.assert(
38
- "TestDriver Socks appears on screen",
39
- );
40
- expect(result).toBeTruthy();
41
- });
42
- });
@@ -1,239 +0,0 @@
1
- /**
2
- * Lifecycle Helpers
3
- * Shared lifecycle hook functions (prerun, postrun)
4
- */
5
-
6
- /**
7
- * Authenticate dashcam with API key
8
- * @param {TestDriver} client - TestDriver client
9
- * @param {string} apiKey - Dashcam API key (default: 4e93d8bf-3886-4d26-a144-116c4063522d)
10
- */
11
- export async function authDashcam(
12
- client,
13
- apiKey = "4e93d8bf-3886-4d26-a144-116c4063522d",
14
- ) {
15
- if (client.os === "windows") {
16
- const shell = "pwsh";
17
-
18
- let debug = await client.exec(
19
- shell,
20
- `query session`,
21
- 40000,
22
- true,
23
- );
24
-
25
- console.log("Debug version output:", debug);
26
-
27
- let installDashcam = await client.exec(
28
- shell,
29
- `npm install dashcam@beta -g`,
30
- 120000,
31
- true,
32
- );
33
- console.log("Install dashcam output:", installDashcam);
34
-
35
- let dashcamVersion = await client.exec(shell, `npm ls dashcam -g`, 40000, true);
36
- console.log("Dashcam version:", dashcamVersion);
37
-
38
- const authOutput = await client.exec(shell, `dashcam auth ${apiKey}`, 120000, true);
39
- console.log("Auth output:", authOutput);
40
- return;
41
- }
42
-
43
- const shell = "sh";
44
- const authOutput = await client.exec(shell, `dashcam auth ${apiKey}`, 120000, true);
45
- console.log("Auth output:", authOutput);
46
- }
47
-
48
- /**
49
- * Add log file tracking to dashcam
50
- * @param {TestDriver} client - TestDriver client
51
- * @param {string} logName - Name for the log in dashcam (default: "TestDriver Log")
52
- */
53
- export async function addDashcamLog(client, logName = "TestDriver Log") {
54
- if (client.os === "windows") {
55
- const shell = "pwsh";
56
- const logPath = "C:\\Users\\testdriver\\Documents\\testdriver.log";
57
- const createFileOutput = await client.exec(
58
- shell,
59
- `New-Item -ItemType File -Path "${logPath}" -Force`,
60
- 10000,
61
- true,
62
- );
63
- console.log("Create log file output:", createFileOutput);
64
- const addLogOutput = await client.exec(
65
- shell,
66
- `dashcam logs --add --type=file --file="${logPath}" --name="${logName}"`,
67
- 10000,
68
- true,
69
- );
70
- console.log("Add log tracking output:", addLogOutput);
71
- return;
72
- }
73
-
74
- const shell = "sh";
75
- const logPath = "/tmp/testdriver.log";
76
-
77
- // Create log file
78
- await client.exec(shell, `touch ${logPath}`, 10000, true);
79
-
80
- // Add log tracking
81
- const addLogOutput = await client.exec(
82
- shell,
83
- `dashcam logs --add --type=file --file="${logPath}" --name="${logName}"`,
84
- 10000,
85
- true,
86
- );
87
- console.log("Add log tracking output:", addLogOutput);
88
- }
89
-
90
- /**
91
- * Start dashcam recording
92
- * @param {TestDriver} client - TestDriver client
93
- */
94
- export async function startDashcam(client) {
95
- if (client.os === "windows") {
96
- console.log("Starting dashcam recording on Windows...");
97
-
98
- // Start dashcam using Start-Process without output redirection
99
- // Let dashcam handle its own logging
100
- const startScript = `Start-Process "cmd.exe" -ArgumentList "/c", "dashcam record"`;
101
-
102
- const startOutput = await client.exec("pwsh", startScript, 10000);
103
- console.log("Start process output:", startOutput);
104
-
105
- console.log("✅ Dashcam recording started");
106
- return;
107
- }
108
-
109
- const shell = "sh";
110
- await client.exec(shell, `dashcam record >/dev/null 2>&1 &`);
111
- }
112
-
113
- /**
114
- * Stop dashcam recording and retrieve URL
115
- * @param {TestDriver} client - TestDriver client
116
- * @returns {Promise<string|null>} Dashcam URL if available
117
- */
118
- export async function stopDashcam(client) {
119
- console.log("🎬 Stopping dashcam and retrieving URL...");
120
-
121
- if (client.os === "windows") {
122
- console.log("Stopping dashcam process on Windows...");
123
-
124
- let stop = await client.exec(
125
- "pwsh",
126
- `Start-Process "cmd.exe" -ArgumentList "/c", "dashcam stop"`, 10000);
127
-
128
-
129
- console.log("📤 Dashcam stop command output:", stop);
130
-
131
- let urlData = stop;
132
-
133
- // Extract URL from output
134
- if (urlData) {
135
- const urlMatch = urlData.match(/https?:\/\/[^\s"',}]+/);
136
- if (urlMatch) {
137
- const url = urlMatch[0];
138
- console.log("✅ Found dashcam URL:", url);
139
- return url;
140
- } else {
141
- console.warn("⚠️ No URL found in dashcam config");
142
- }
143
- }
144
- return null;
145
- }
146
-
147
- const shell = "sh";
148
- // On non-Windows, use regular stop command
149
- const output = await client.exec(shell, "dashcam stop", 60000, false);
150
-
151
- console.log("📤 Dashcam command output:", output);
152
-
153
- // Extract URL from output
154
- if (output) {
155
- const urlMatch = output.match(/https?:\/\/[^\s"']+/);
156
- if (urlMatch) {
157
- const url = urlMatch[0];
158
- console.log("✅ Found dashcam URL:", url);
159
- return url;
160
- } else {
161
- console.warn("⚠️ No URL found in dashcam output");
162
- }
163
- } else {
164
- console.warn("⚠️ Dashcam command returned no output");
165
- }
166
-
167
- return null;
168
- }
169
-
170
- /**
171
- * Launch Chrome browser with guest mode
172
- * @param {TestDriver} client - TestDriver client
173
- * @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
174
- */
175
- export async function launchChrome(
176
- client,
177
- url = "http://testdriver-sandbox.vercel.app/",
178
- ) {
179
- const shell = client.os === "windows" ? "pwsh" : "sh";
180
-
181
- if (client.os === "windows") {
182
- await client.exec(
183
- "pwsh",
184
- `Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${url}"`,
185
- 30000,
186
- );
187
- } else {
188
- await client.exec(
189
- shell,
190
- `google-chrome --start-maximized --disable-fre --no-default-browser-check --no-first-run --guest "${url}" >/dev/null 2>&1 &`,
191
- 30000,
192
- );
193
- }
194
- }
195
-
196
- /**
197
- * Wait for page to load by polling for text
198
- * @param {TestDriver} client - TestDriver client
199
- * @param {string} text - Text to wait for
200
- * @param {number} maxAttempts - Maximum number of attempts (default: 60)
201
- * @param {number} pollInterval - Interval between polls in ms (default: 5000)
202
- */
203
- export async function waitForPage(
204
- client,
205
- text,
206
- maxAttempts = 60,
207
- pollInterval = 5000,
208
- ) {
209
- console.log("Waiting for page to load, looking for text:", text);
210
- let element;
211
- for (let i = 0; i < maxAttempts; i++) {
212
- element = await client.find(text);
213
- if (element.found()) break;
214
- await new Promise((resolve) => setTimeout(resolve, pollInterval));
215
- }
216
- }
217
-
218
- /**
219
- * Run prerun lifecycle hooks
220
- * Implements lifecycle/prerun.yaml functionality
221
- * @param {TestDriver} client - TestDriver client
222
- */
223
- export async function runPrerun(client) {
224
- await authDashcam(client);
225
- await addDashcamLog(client);
226
- await startDashcam(client);
227
- await launchChrome(client);
228
- await waitForPage(client, "TestDriver.ai Sandbox");
229
- }
230
-
231
- /**
232
- * Run postrun lifecycle hooks
233
- * Implements lifecycle/postrun.yaml functionality
234
- * @param {TestDriver} client - TestDriver client
235
- * @returns {Promise<string|null>} Dashcam URL if available
236
- */
237
- export async function runPostrun(client) {
238
- return await stopDashcam(client);
239
- }