testdriverai 6.2.2 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/acceptance-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/AGENTS.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +300 -85
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +910 -296
- package/agent/lib/redraw.js +129 -41
- package/agent/lib/sandbox.js +29 -6
- package/agent/lib/sdk.js +22 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +286 -152
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +332 -0
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +342 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/eslint.config.js +19 -1
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +830 -0
- package/package.json +29 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +1028 -0
- package/sdk.js +2567 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/test/mcp-example-test.yaml +27 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +45 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +66 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/.vscode/mcp.json +0 -9
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
# TestDriver Test Recording Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This system provides comprehensive test execution tracking, linking test runs with dashcam screen recordings and CI/CD pipelines in the TestDriver dashboard.
|
|
6
|
+
|
|
7
|
+
## Architecture Diagram
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
11
|
+
│ Developer's Machine / CI │
|
|
12
|
+
├─────────────────────────────────────────────────────────────┤
|
|
13
|
+
│ │
|
|
14
|
+
│ ┌──────────────┐ ┌──────────────┐ │
|
|
15
|
+
│ │ Vitest │────────▶│ TD Vitest │ │
|
|
16
|
+
│ │ Test Runner │ │ Plugin │ │
|
|
17
|
+
│ └──────────────┘ └──────┬───────┘ │
|
|
18
|
+
│ │ │
|
|
19
|
+
│ ┌──────────────┐ │ │
|
|
20
|
+
│ │ Dashcam │ │ │
|
|
21
|
+
│ │ Recording │ │ │
|
|
22
|
+
│ └──────┬───────┘ │ │
|
|
23
|
+
│ │ │ │
|
|
24
|
+
│ │ (records screen) │ (reports results) │
|
|
25
|
+
│ │ │ │
|
|
26
|
+
└─────────┼─────────────────────────┼───────────────────────────┘
|
|
27
|
+
│ │
|
|
28
|
+
│ │
|
|
29
|
+
▼ ▼
|
|
30
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
31
|
+
│ TestDriver API Server │
|
|
32
|
+
├─────────────────────────────────────────────────────────────┤
|
|
33
|
+
│ │
|
|
34
|
+
│ ┌──────────────┐ ┌──────────────┐ │
|
|
35
|
+
│ │ Replay API │ │ Test Run API │ │
|
|
36
|
+
│ │ (dashcam) │ │ (new) │ │
|
|
37
|
+
│ └──────┬───────┘ └──────┬───────┘ │
|
|
38
|
+
│ │ │ │
|
|
39
|
+
│ └────────┬───────────────┘ │
|
|
40
|
+
│ │ │
|
|
41
|
+
│ ▼ │
|
|
42
|
+
│ ┌────────────────┐ │
|
|
43
|
+
│ │ MongoDB │ │
|
|
44
|
+
│ │ │ │
|
|
45
|
+
│ │ • TdTestRun │ │
|
|
46
|
+
│ │ • TdTestCase │ │
|
|
47
|
+
│ │ • TdSandbox │ │
|
|
48
|
+
│ │ • Replay │ │
|
|
49
|
+
│ └────────────────┘ │
|
|
50
|
+
│ │
|
|
51
|
+
└───────────────────────────┬───────────────────────────────────┘
|
|
52
|
+
│
|
|
53
|
+
│
|
|
54
|
+
▼
|
|
55
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
56
|
+
│ TestDriver Web Dashboard │
|
|
57
|
+
├─────────────────────────────────────────────────────────────┤
|
|
58
|
+
│ │
|
|
59
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
60
|
+
│ │ Test Runs View (NEW) │ │
|
|
61
|
+
│ │ │ │
|
|
62
|
+
│ │ • List all test runs │ │
|
|
63
|
+
│ │ • Filter by status, date, CI │ │
|
|
64
|
+
│ │ • Show pass/fail statistics │ │
|
|
65
|
+
│ │ • Link to CI/CD runs │ │
|
|
66
|
+
│ └─────────────────────────────────────────┘ │
|
|
67
|
+
│ │
|
|
68
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
69
|
+
│ │ Test Run Detail View (NEW) │ │
|
|
70
|
+
│ │ │ │
|
|
71
|
+
│ │ • Test case list with status │ │
|
|
72
|
+
│ │ • Dashcam replay player (embedded) │ │
|
|
73
|
+
│ │ • Error messages and stack traces │ │
|
|
74
|
+
│ │ • Sandbox details │ │
|
|
75
|
+
│ │ • Git commit info │ │
|
|
76
|
+
│ └─────────────────────────────────────────┘ │
|
|
77
|
+
│ │
|
|
78
|
+
└───────────────────────────────────────────────────────────────┘
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Data Models
|
|
82
|
+
|
|
83
|
+
### TdTestRun
|
|
84
|
+
Represents a complete test suite execution (e.g., `npx vitest run`).
|
|
85
|
+
|
|
86
|
+
**Key Fields:**
|
|
87
|
+
- `runId`: Unique identifier
|
|
88
|
+
- `suiteName`: Name of the test suite
|
|
89
|
+
- `status`: running | passed | failed | cancelled
|
|
90
|
+
- `totalTests`, `passedTests`, `failedTests`: Statistics
|
|
91
|
+
- `platform`: windows | mac | linux
|
|
92
|
+
- CI/CD metadata (provider, runId, url)
|
|
93
|
+
- Git metadata (repo, branch, commit)
|
|
94
|
+
- `dashcamSessionId`: Links to dashcam recordings
|
|
95
|
+
|
|
96
|
+
**Relationships:**
|
|
97
|
+
- `team`: Owner team
|
|
98
|
+
- `sandbox`: TdSandbox where tests ran
|
|
99
|
+
- `testCases`: Collection of TdTestCase
|
|
100
|
+
- `replays`: Associated Replay records
|
|
101
|
+
|
|
102
|
+
### TdTestCase
|
|
103
|
+
Represents an individual test within a test run.
|
|
104
|
+
|
|
105
|
+
**Key Fields:**
|
|
106
|
+
- `testName`: Test name from `test('...')`
|
|
107
|
+
- `testFile`: Path to test file
|
|
108
|
+
- `suiteName`: Describe block name
|
|
109
|
+
- `status`: passed | failed | skipped | pending
|
|
110
|
+
- `duration`: Test duration in ms
|
|
111
|
+
- `errorMessage`, `errorStack`: Failure details
|
|
112
|
+
- `replayUrl`: Direct link to dashcam replay
|
|
113
|
+
- `replayStartTime`, `replayEndTime`: Timestamps within replay
|
|
114
|
+
|
|
115
|
+
**Relationships:**
|
|
116
|
+
- `testRun`: Parent TdTestRun
|
|
117
|
+
- `replay`: Associated Replay record
|
|
118
|
+
|
|
119
|
+
### TdSandbox
|
|
120
|
+
Represents a spawned VM/sandbox instance.
|
|
121
|
+
|
|
122
|
+
**Key Fields:**
|
|
123
|
+
- `sandboxId`: Unique identifier
|
|
124
|
+
- `platform`: windows | mac | linux
|
|
125
|
+
- `status`: provisioning | ready | running | stopped | terminated
|
|
126
|
+
- `instanceId`, `instanceType`: AWS EC2 details
|
|
127
|
+
- `ipAddress`, `vncUrl`, `wsUrl`: Connection details
|
|
128
|
+
- `spawnTime`, `readyTime`, `terminateTime`: Lifecycle timestamps
|
|
129
|
+
- `dashcamAuth`: Whether dashcam was authenticated
|
|
130
|
+
- `dashcamProjectId`: Dashcam project for replays
|
|
131
|
+
|
|
132
|
+
**Relationships:**
|
|
133
|
+
- `team`: Owner team
|
|
134
|
+
- `user`: User who spawned it
|
|
135
|
+
- `testRuns`: Tests that ran on this sandbox
|
|
136
|
+
- `replays`: Dashcam recordings from this sandbox
|
|
137
|
+
|
|
138
|
+
**Note:** Sandbox creation/updates happen via WebSocket (not REST API) as part of the sandbox provisioning flow.
|
|
139
|
+
|
|
140
|
+
### Replay (Extended)
|
|
141
|
+
Existing model extended with test run associations.
|
|
142
|
+
|
|
143
|
+
**New Fields:**
|
|
144
|
+
- `tdTestRun`: Associated test run
|
|
145
|
+
- `tdTestCase`: Associated test case
|
|
146
|
+
- `tdSandbox`: Sandbox where recorded
|
|
147
|
+
|
|
148
|
+
## API Endpoints
|
|
149
|
+
|
|
150
|
+
### POST /api/v1/testdriver/test-run-create
|
|
151
|
+
Create a new test run.
|
|
152
|
+
|
|
153
|
+
**Auth:** Required (Bearer token)
|
|
154
|
+
|
|
155
|
+
**Request:**
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"runId": "vitest-1234567890-abc123",
|
|
159
|
+
"suiteName": "Integration Tests",
|
|
160
|
+
"platform": "windows",
|
|
161
|
+
"sandboxId": "sandbox-xyz",
|
|
162
|
+
"ciProvider": "GitHub Actions",
|
|
163
|
+
"ciRunId": "12345",
|
|
164
|
+
"repo": "myorg/myrepo",
|
|
165
|
+
"branch": "main",
|
|
166
|
+
"commit": "abc123def456"
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Response:**
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"data": {
|
|
174
|
+
"id": "...",
|
|
175
|
+
"runId": "vitest-1234567890-abc123",
|
|
176
|
+
"status": "running",
|
|
177
|
+
"startTime": 1700000000000
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### POST /api/v1/testdriver/test-run-complete
|
|
183
|
+
Mark a test run as complete.
|
|
184
|
+
|
|
185
|
+
**Auth:** Required
|
|
186
|
+
|
|
187
|
+
**Request:**
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"runId": "vitest-1234567890-abc123",
|
|
191
|
+
"status": "passed",
|
|
192
|
+
"totalTests": 25,
|
|
193
|
+
"passedTests": 24,
|
|
194
|
+
"failedTests": 1,
|
|
195
|
+
"skippedTests": 0
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### POST /api/v1/testdriver/test-case-create
|
|
200
|
+
Record a test case result (create or update).
|
|
201
|
+
|
|
202
|
+
**Auth:** Required
|
|
203
|
+
|
|
204
|
+
**Request:**
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"runId": "vitest-1234567890-abc123",
|
|
208
|
+
"testName": "should login successfully",
|
|
209
|
+
"testFile": "tests/auth/login.test.js",
|
|
210
|
+
"suiteName": "Authentication Tests",
|
|
211
|
+
"status": "passed",
|
|
212
|
+
"startTime": 1700000001000,
|
|
213
|
+
"endTime": 1700000002500,
|
|
214
|
+
"duration": 1500,
|
|
215
|
+
"replayUrl": "https://app.dashcam.io/replay/abc123"
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Components
|
|
220
|
+
|
|
221
|
+
### Vitest Plugin (`interfaces/vitest-plugin.mjs`)
|
|
222
|
+
Automatically integrates with Vitest test runs.
|
|
223
|
+
|
|
224
|
+
**Features:**
|
|
225
|
+
- Auto-detects CI/CD environment (GitHub Actions, GitLab, etc.)
|
|
226
|
+
- Extracts Git metadata from environment or git commands
|
|
227
|
+
- Creates test run at start
|
|
228
|
+
- Records each test case result
|
|
229
|
+
- Associates with dashcam session if `DASHCAM_SESSION_ID` is set
|
|
230
|
+
- Completes test run with statistics
|
|
231
|
+
- Uses plugin architecture for better global state management
|
|
232
|
+
|
|
233
|
+
**Usage:**
|
|
234
|
+
```javascript
|
|
235
|
+
// vitest.config.mjs
|
|
236
|
+
import testDriverPlugin from './interfaces/vitest-plugin.mjs';
|
|
237
|
+
|
|
238
|
+
export default {
|
|
239
|
+
plugins: [
|
|
240
|
+
testDriverPlugin({
|
|
241
|
+
apiKey: process.env.TD_API_KEY,
|
|
242
|
+
apiRoot: process.env.TD_API_ROOT || 'https://testdriver-api.onrender.com',
|
|
243
|
+
}),
|
|
244
|
+
],
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### SDK Methods (`sdk.js`)
|
|
249
|
+
|
|
250
|
+
#### `client.createTestRun(options)`
|
|
251
|
+
Create a test run programmatically.
|
|
252
|
+
|
|
253
|
+
#### `client.recordTestCase(options)`
|
|
254
|
+
Record a test case result.
|
|
255
|
+
|
|
256
|
+
#### `client.completeTestRun(options)`
|
|
257
|
+
Mark test run as complete.
|
|
258
|
+
|
|
259
|
+
## Integration Flows
|
|
260
|
+
|
|
261
|
+
### Flow 1: Automated with Vitest Reporter
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
1. Developer runs: npx vitest run
|
|
265
|
+
2. Vitest starts, reporter initializes
|
|
266
|
+
3. Reporter creates TdTestRun
|
|
267
|
+
4. For each test:
|
|
268
|
+
- Vitest runs test
|
|
269
|
+
- Reporter records TdTestCase (passed/failed)
|
|
270
|
+
5. All tests complete
|
|
271
|
+
6. Reporter calls completeTestRun()
|
|
272
|
+
7. Results visible in dashboard
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Flow 2: With Dashcam Recording
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
1. Start dashcam: dashcam start
|
|
279
|
+
2. Set session ID: export DASHCAM_SESSION_ID=$(dashcam session-id)
|
|
280
|
+
3. Run tests: npx vitest run
|
|
281
|
+
4. Reporter creates test run with dashcamSessionId
|
|
282
|
+
5. Tests execute, dashcam records
|
|
283
|
+
6. Stop dashcam: dashcam stop
|
|
284
|
+
7. Publish: dashcam publish -p PROJECT_ID
|
|
285
|
+
8. Replay URL returned
|
|
286
|
+
9. Dashboard shows test results + replay link
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Flow 3: CI/CD Pipeline (GitHub Actions)
|
|
290
|
+
|
|
291
|
+
```yaml
|
|
292
|
+
jobs:
|
|
293
|
+
test:
|
|
294
|
+
runs-on: windows-latest
|
|
295
|
+
steps:
|
|
296
|
+
- uses: actions/checkout@v3
|
|
297
|
+
- run: npm install
|
|
298
|
+
- name: Start Dashcam
|
|
299
|
+
run: |
|
|
300
|
+
dashcam start
|
|
301
|
+
echo "DASHCAM_SESSION_ID=$(dashcam session-id)" >> $GITHUB_ENV
|
|
302
|
+
- name: Run Tests
|
|
303
|
+
env:
|
|
304
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
305
|
+
run: npx vitest run
|
|
306
|
+
- name: Publish Recording
|
|
307
|
+
if: always()
|
|
308
|
+
run: |
|
|
309
|
+
dashcam stop
|
|
310
|
+
dashcam publish -p ${{ secrets.DASHCAM_PROJECT_ID }}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Reporter auto-detects:
|
|
314
|
+
- GitHub repo, branch, commit
|
|
315
|
+
- Workflow run ID and URL
|
|
316
|
+
- Job ID
|
|
317
|
+
- Actor (who triggered)
|
|
318
|
+
|
|
319
|
+
## Dashcam Association Strategies
|
|
320
|
+
|
|
321
|
+
### Strategy 1: Session ID (Implemented)
|
|
322
|
+
- Set `DASHCAM_SESSION_ID` environment variable
|
|
323
|
+
- Reporter includes in test run creation
|
|
324
|
+
- Dashboard queries replays by session ID
|
|
325
|
+
- Shows all replays from that session
|
|
326
|
+
|
|
327
|
+
### Strategy 2: Explicit URL (Implemented)
|
|
328
|
+
- Dashcam publishes, returns URL
|
|
329
|
+
- Pass URL to `recordTestCase()`
|
|
330
|
+
- Direct 1:1 link between test and replay
|
|
331
|
+
|
|
332
|
+
### Strategy 3: Timestamp Matching (Future)
|
|
333
|
+
- Parse dashcam logs for replay timestamps
|
|
334
|
+
- Match test start/end times with replay markers
|
|
335
|
+
- Automatically associate without manual linking
|
|
336
|
+
- Allows seeking to exact test within long replay
|
|
337
|
+
|
|
338
|
+
### Strategy 4: Log Parsing (Future)
|
|
339
|
+
- Dashcam logs test names/files during recording
|
|
340
|
+
- Parse logs to extract test-to-timestamp mapping
|
|
341
|
+
- Generate replay URLs with timestamp seek parameters
|
|
342
|
+
- Example: `https://app.dashcam.io/replay/abc123?t=45000` (seek to 45s)
|
|
343
|
+
|
|
344
|
+
## Dashboard Views (To Be Built)
|
|
345
|
+
|
|
346
|
+
### Test Runs List
|
|
347
|
+
- Table of all test runs
|
|
348
|
+
- Columns: Suite Name, Status, Tests (passed/failed), Duration, Date, CI Link
|
|
349
|
+
- Filters: Status, Date range, CI provider, Platform
|
|
350
|
+
- Search: By suite name, repo, branch
|
|
351
|
+
|
|
352
|
+
### Test Run Detail
|
|
353
|
+
- Header: Suite name, status, duration, platform
|
|
354
|
+
- Statistics card: Total/passed/failed/skipped
|
|
355
|
+
- Test cases table: Name, Status, Duration, Replay link
|
|
356
|
+
- Sidebar: Git info, CI info, Sandbox details
|
|
357
|
+
- Dashcam replay player (embedded iframe)
|
|
358
|
+
- Click test case → seek replay to that test's time range
|
|
359
|
+
|
|
360
|
+
### Sandbox Management
|
|
361
|
+
- List of active/terminated sandboxes
|
|
362
|
+
- Lifecycle timeline visualization
|
|
363
|
+
- Cost tracking (duration × instance type)
|
|
364
|
+
- Associated test runs
|
|
365
|
+
|
|
366
|
+
## Environment Variables
|
|
367
|
+
|
|
368
|
+
| Variable | Required | Description |
|
|
369
|
+
|----------|----------|-------------|
|
|
370
|
+
| `TD_API_KEY` | Yes | TestDriver API key for authentication |
|
|
371
|
+
| `DASHCAM_SESSION_ID` | No | Links test run to dashcam session |
|
|
372
|
+
| `TD_SANDBOX_ID` | No | Sandbox ID if running in TestDriver sandbox |
|
|
373
|
+
| `GITHUB_ACTIONS` | Auto | Detected for GitHub Actions integration |
|
|
374
|
+
| `GITLAB_CI` | Auto | Detected for GitLab CI integration |
|
|
375
|
+
| `CIRCLECI` | Auto | Detected for CircleCI integration |
|
|
376
|
+
|
|
377
|
+
## Future Enhancements
|
|
378
|
+
|
|
379
|
+
1. **Real-time Test Streaming**
|
|
380
|
+
- WebSocket connection from reporter
|
|
381
|
+
- Live test progress in dashboard
|
|
382
|
+
- See tests pass/fail as they run
|
|
383
|
+
|
|
384
|
+
2. **Flaky Test Detection**
|
|
385
|
+
- Track test history across runs
|
|
386
|
+
- Identify tests that intermittently fail
|
|
387
|
+
- Suggest fixes based on error patterns
|
|
388
|
+
|
|
389
|
+
3. **Performance Regression Detection**
|
|
390
|
+
- Compare test durations across runs
|
|
391
|
+
- Alert on significant slowdowns
|
|
392
|
+
- Visualize performance trends
|
|
393
|
+
|
|
394
|
+
4. **Advanced Dashcam Integration**
|
|
395
|
+
- Automatic timestamp extraction from logs
|
|
396
|
+
- AI-powered test failure analysis from replays
|
|
397
|
+
- Highlight exact moment of failure in replay
|
|
398
|
+
|
|
399
|
+
5. **Multi-Framework Support**
|
|
400
|
+
- Jest reporter
|
|
401
|
+
- Mocha reporter
|
|
402
|
+
- Playwright reporter
|
|
403
|
+
- Cypress plugin
|
|
404
|
+
|
|
405
|
+
6. **Cost Analytics**
|
|
406
|
+
- Track sandbox costs per test run
|
|
407
|
+
- Optimize instance types
|
|
408
|
+
- Budget alerts
|
|
409
|
+
|
|
410
|
+
## Security Considerations
|
|
411
|
+
|
|
412
|
+
- API keys stored securely (environment variables)
|
|
413
|
+
- Bearer token authentication for all API calls
|
|
414
|
+
- Team-based access control (tests only visible to team members)
|
|
415
|
+
- Replay access control (dashcam's existing permissions)
|
|
416
|
+
- No sensitive data in test metadata (sanitize error messages)
|
|
417
|
+
|
|
418
|
+
## Performance Considerations
|
|
419
|
+
|
|
420
|
+
- Async test case recording (doesn't slow tests)
|
|
421
|
+
- Batch updates for large test suites
|
|
422
|
+
- Efficient database indexing (runId, testFile, status)
|
|
423
|
+
- Replay association is lazy (doesn't block test recording)
|
|
424
|
+
- Optional reporter (disable in local development)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# AWESOME Logs - Quick Reference 🎨
|
|
2
|
+
|
|
3
|
+
## At a Glance
|
|
4
|
+
|
|
5
|
+
Your TestDriver SDK now has **beautiful, emoji-rich logs** with great DX!
|
|
6
|
+
|
|
7
|
+
### What You'll See
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
[2.34s] 🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
|
|
11
|
+
[2.51s] 👆 Click "submit button"
|
|
12
|
+
[2.67s] 👉 Hover "menu item"
|
|
13
|
+
[2.89s] ⌨️ Type → hello world
|
|
14
|
+
[3.12s] ✅ Assert "page title correct" · ✓ PASSED · ⏱️ 45ms
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Emoji Guide
|
|
18
|
+
|
|
19
|
+
| Emoji | Meaning |
|
|
20
|
+
|-------|---------|
|
|
21
|
+
| 🔍 | Finding element |
|
|
22
|
+
| 👆 | Click |
|
|
23
|
+
| 👉 | Hover |
|
|
24
|
+
| ⌨️ | Type |
|
|
25
|
+
| 📜 | Scroll |
|
|
26
|
+
| ✅ | Success/Passed |
|
|
27
|
+
| ❌ | Error/Failed |
|
|
28
|
+
| ⚡ | Cache hit |
|
|
29
|
+
| 💤 | Cache miss |
|
|
30
|
+
| 📍 | Coordinates |
|
|
31
|
+
| ⏱️ | Duration |
|
|
32
|
+
| 🔌 | Connect/Disconnect |
|
|
33
|
+
| 📸 | Screenshot |
|
|
34
|
+
|
|
35
|
+
## Performance Colors
|
|
36
|
+
|
|
37
|
+
Duration times are color-coded:
|
|
38
|
+
|
|
39
|
+
- **🟢 < 100ms** - Fast
|
|
40
|
+
- **🟡 100-500ms** - Acceptable
|
|
41
|
+
- **🔴 > 500ms** - Slow
|
|
42
|
+
|
|
43
|
+
## Enable/Disable
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
// Enabled by default
|
|
47
|
+
const client = new TestDriver(apiKey, {
|
|
48
|
+
logging: true
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Disable if needed
|
|
52
|
+
client.setLogging(false);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Debug Mode
|
|
56
|
+
|
|
57
|
+
For detailed cache information:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
VERBOSE=true node your-test.js
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
You'll see:
|
|
64
|
+
- Cache strategy (image/text)
|
|
65
|
+
- Similarity scores
|
|
66
|
+
- Pixel diff percentages
|
|
67
|
+
- Cache age
|
|
68
|
+
|
|
69
|
+
## Examples
|
|
70
|
+
|
|
71
|
+
Try these:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Simple example
|
|
75
|
+
TD_API_KEY=your_key node examples/sdk-simple-example.js
|
|
76
|
+
|
|
77
|
+
# Full demo
|
|
78
|
+
TD_API_KEY=your_key node examples/sdk-awesome-logs-demo.js
|
|
79
|
+
|
|
80
|
+
# Cache demo with debug info
|
|
81
|
+
TD_API_KEY=your_key VERBOSE=true node examples/sdk-cache-thresholds.js
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Custom Formatting
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
const { formatter } = require('testdriverai/sdk-log-formatter');
|
|
88
|
+
|
|
89
|
+
console.log(formatter.formatHeader('My Test', '🧪'));
|
|
90
|
+
console.log(formatter.formatAction('click', 'button'));
|
|
91
|
+
console.log(formatter.formatProgress(3, 10, 'Processing'));
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Full Documentation
|
|
95
|
+
|
|
96
|
+
See [SDK_AWESOME_LOGS.md](./SDK_AWESOME_LOGS.md) for complete documentation.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
**Enjoy your AWESOME logs! 🎨✨**
|