testeiya 0.10.0 → 0.10.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 (241) hide show
  1. package/PIPELINES.md +3 -0
  2. package/README.md +10 -20
  3. package/dist/prompt/clis.d.ts +7 -0
  4. package/dist/prompt/pipeline-report.d.ts +1 -0
  5. package/dist/prompt/report.d.ts +10 -0
  6. package/dist/prompt/system-prompt.d.ts +22 -0
  7. package/dist/prompt/system-prompt.js +1 -1
  8. package/dist/prompt/system-prompt.js.map +1 -1
  9. package/dist/prompt/testomat.io.d.ts +19 -0
  10. package/dist/prompt/thread.d.ts +73 -0
  11. package/dist/src/args.d.ts +39 -0
  12. package/dist/src/attribution-extension.d.ts +3 -0
  13. package/dist/src/checkpoint.d.ts +30 -0
  14. package/dist/src/cli.d.ts +2 -0
  15. package/dist/src/cli.js +27 -32
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/doctor.d.ts +11 -0
  18. package/dist/src/env.d.ts +30 -0
  19. package/dist/src/exec.d.ts +11 -0
  20. package/dist/src/git.d.ts +41 -0
  21. package/dist/src/git.js +10 -0
  22. package/dist/src/git.js.map +1 -1
  23. package/dist/src/langfuse-extension.d.ts +7 -0
  24. package/dist/src/langfuse.d.ts +67 -0
  25. package/dist/src/mcp.d.ts +19 -0
  26. package/dist/src/model.d.ts +20 -0
  27. package/dist/src/model.js +2 -0
  28. package/dist/src/model.js.map +1 -1
  29. package/dist/src/models.d.ts +1 -0
  30. package/dist/src/output.d.ts +84 -0
  31. package/dist/src/pipeline/command-stage.d.ts +12 -0
  32. package/dist/src/pipeline/crash-guard.d.ts +12 -0
  33. package/dist/src/pipeline/crash-guard.js +21 -0
  34. package/dist/src/pipeline/crash-guard.js.map +1 -0
  35. package/dist/src/pipeline/diagram.d.ts +24 -0
  36. package/dist/src/pipeline/gate.d.ts +21 -0
  37. package/dist/src/pipeline/launcher.d.ts +33 -0
  38. package/dist/src/pipeline/launcher.js +16 -3
  39. package/dist/src/pipeline/launcher.js.map +1 -1
  40. package/dist/src/pipeline/log.d.ts +29 -0
  41. package/dist/src/pipeline/log.js +9 -0
  42. package/dist/src/pipeline/log.js.map +1 -1
  43. package/dist/src/pipeline/overlay.d.ts +29 -0
  44. package/dist/src/pipeline/pipeline-file.d.ts +44 -0
  45. package/dist/src/pipeline/pipeline-file.js +16 -8
  46. package/dist/src/pipeline/pipeline-file.js.map +1 -1
  47. package/dist/src/pipeline/pipeline.d.ts +78 -0
  48. package/dist/src/pipeline/pipeline.js +33 -7
  49. package/dist/src/pipeline/pipeline.js.map +1 -1
  50. package/dist/src/pipeline/report.d.ts +26 -0
  51. package/dist/src/pipeline/report.js +13 -0
  52. package/dist/src/pipeline/report.js.map +1 -1
  53. package/dist/src/pipeline/spec.d.ts +63 -0
  54. package/dist/src/pipeline/stage-env.d.ts +13 -0
  55. package/dist/src/pipeline/stage-env.js +31 -0
  56. package/dist/src/pipeline/stage-env.js.map +1 -0
  57. package/dist/src/pipeline/stage.d.ts +71 -0
  58. package/dist/src/pipeline/stage.js.map +1 -1
  59. package/dist/src/pipeline/state.d.ts +63 -0
  60. package/dist/src/pipeline/summary-stage.d.ts +24 -0
  61. package/dist/src/pipeline/task-stage.d.ts +24 -0
  62. package/dist/src/pipeline/task-stage.js +86 -2
  63. package/dist/src/pipeline/task-stage.js.map +1 -1
  64. package/dist/src/pipeline/variables.d.ts +20 -0
  65. package/dist/src/result.d.ts +6 -0
  66. package/dist/src/run.d.ts +69 -0
  67. package/dist/src/run.js +116 -60
  68. package/dist/src/run.js.map +1 -1
  69. package/dist/src/session.d.ts +43 -0
  70. package/dist/src/session.js +3 -1
  71. package/dist/src/session.js.map +1 -1
  72. package/dist/src/sessions.d.ts +23 -0
  73. package/dist/src/skills.d.ts +29 -0
  74. package/package.json +11 -2
  75. package/pipelines/api-testing.yml +16 -5
  76. package/pipelines/issue-test-cases.yml +3 -4
  77. package/pipelines/pr-review.yml +14 -5
  78. package/pipelines/regression.yml +1 -0
  79. package/pipelines/web-testing.yml +1 -0
  80. package/prompt/system-prompt.ts +1 -1
  81. package/scripts/vendor-skills.js +62 -0
  82. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -119
  83. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -141
  84. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -100
  85. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -196
  86. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -83
  87. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -126
  88. package/skills/codeceptjs/lint-codeceptjs-tests/SKILL.md +0 -104
  89. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -109
  90. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -295
  91. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -339
  92. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -459
  93. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -338
  94. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -78
  95. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -102
  96. package/skills/playwright/playwright-best-practices/SKILL.md +0 -303
  97. package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +0 -360
  98. package/skills/playwright/playwright-best-practices/advanced/authentication.md +0 -871
  99. package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +0 -364
  100. package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +0 -409
  101. package/skills/playwright/playwright-best-practices/advanced/multi-context.md +0 -288
  102. package/skills/playwright/playwright-best-practices/advanced/multi-user.md +0 -393
  103. package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +0 -452
  104. package/skills/playwright/playwright-best-practices/advanced/third-party.md +0 -464
  105. package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  106. package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +0 -369
  107. package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +0 -383
  108. package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  109. package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +0 -403
  110. package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +0 -504
  111. package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +0 -403
  112. package/skills/playwright/playwright-best-practices/core/annotations.md +0 -424
  113. package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +0 -361
  114. package/skills/playwright/playwright-best-practices/core/configuration.md +0 -452
  115. package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +0 -417
  116. package/skills/playwright/playwright-best-practices/core/global-setup.md +0 -434
  117. package/skills/playwright/playwright-best-practices/core/locators.md +0 -242
  118. package/skills/playwright/playwright-best-practices/core/page-object-model.md +0 -315
  119. package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +0 -453
  120. package/skills/playwright/playwright-best-practices/core/test-data.md +0 -492
  121. package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +0 -361
  122. package/skills/playwright/playwright-best-practices/core/test-tags.md +0 -298
  123. package/skills/playwright/playwright-best-practices/debugging/console-errors.md +0 -420
  124. package/skills/playwright/playwright-best-practices/debugging/debugging.md +0 -504
  125. package/skills/playwright/playwright-best-practices/debugging/error-testing.md +0 -360
  126. package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +0 -496
  127. package/skills/playwright/playwright-best-practices/frameworks/angular.md +0 -530
  128. package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +0 -469
  129. package/skills/playwright/playwright-best-practices/frameworks/react.md +0 -531
  130. package/skills/playwright/playwright-best-practices/frameworks/vue.md +0 -574
  131. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  132. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  133. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  134. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  135. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  136. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  137. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  138. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  139. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  140. package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  141. package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  142. package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  143. package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  144. package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  145. package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  146. package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +0 -509
  147. package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  148. package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  149. package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  150. package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  151. package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +0 -508
  152. package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  153. package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  154. package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  155. package/skills/playwright/playwright-cli/SKILL.md +0 -489
  156. package/skills/playwright/playwright-cli/references/element-attributes.md +0 -23
  157. package/skills/playwright/playwright-cli/references/playwright-tests.md +0 -39
  158. package/skills/playwright/playwright-cli/references/pr-attachments.md +0 -60
  159. package/skills/playwright/playwright-cli/references/request-mocking.md +0 -87
  160. package/skills/playwright/playwright-cli/references/running-code.md +0 -245
  161. package/skills/playwright/playwright-cli/references/session-management.md +0 -227
  162. package/skills/playwright/playwright-cli/references/storage-state.md +0 -275
  163. package/skills/playwright/playwright-cli/references/test-generation.md +0 -433
  164. package/skills/playwright/playwright-cli/references/tracing.md +0 -139
  165. package/skills/playwright/playwright-cli/references/video-recording.md +0 -216
  166. package/skills/skills.lock.json +0 -89
  167. package/skills/skills.yaml +0 -35
  168. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/SKILL.md +0 -0
  169. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/references/no-install.md +0 -0
  170. /package/skills/{testomatio/explorbot → explorbot}/explorbot-plan/SKILL.md +0 -0
  171. /package/skills/{testomatio/explorbot → explorbot}/explorbot-setup/SKILL.md +0 -0
  172. /package/skills/{testomatio/explorbot → explorbot}/prima/SKILL.md +0 -0
  173. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/SKILL.md +0 -0
  174. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/references/output-format.md +0 -0
  175. /package/skills/{testomatio/qa-process → qa-process}/qa-review-pr/SKILL.md +0 -0
  176. /package/skills/{testomatio/qa-process → qa-process}/testing-workflow/SKILL.md +0 -0
  177. /package/skills/{testomatio/requirements → requirements}/catalog-features/SKILL.md +0 -0
  178. /package/skills/{testomatio/requirements → requirements}/catalog-features/references/layout.md +0 -0
  179. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/SKILL.md +0 -0
  180. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/features.md +0 -0
  181. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/layout.md +0 -0
  182. /package/skills/{testomatio/requirements → requirements}/pull-request-diff-analyzer/SKILL.md +0 -0
  183. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/SKILL.md +0 -0
  184. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/answer-shapes.md +0 -0
  185. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/examples.md +0 -0
  186. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/SKILL.md +0 -0
  187. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/references/summary-example.md +0 -0
  188. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/SKILL.md +0 -0
  189. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -0
  190. /package/skills/{testomatio/requirements → requirements}/qa-thinking/SKILL.md +0 -0
  191. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/SKILL.md +0 -0
  192. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/behaviors.md +0 -0
  193. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/layout.md +0 -0
  194. /package/skills/{testomatio/requirements → requirements}/write-user-story/SKILL.md +0 -0
  195. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/CLAUDE.md +0 -0
  196. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/SKILL.md +0 -0
  197. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -0
  198. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -0
  199. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -0
  200. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -0
  201. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -0
  202. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/SKILL.md +0 -0
  203. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -0
  204. /package/skills/{testomatio/test-automation → test-automation}/epic-requirements-specification/SKILL.md +0 -0
  205. /package/skills/{testomatio/test-automation → test-automation}/qa-automation-test-consolidation/SKILL.md +0 -0
  206. /package/skills/{testomatio/test-automation → test-automation}/qa-data-seeder/SKILL.md +0 -0
  207. /package/skills/{testomatio/test-automation → test-automation}/run-tests-with-testomatio-reporter/SKILL.md +0 -0
  208. /package/skills/{testomatio/test-automation → test-automation}/setup-change-aware-pr-testing/SKILL.md +0 -0
  209. /package/skills/{testomatio/test-automation → test-automation}/setup-ci-automation/SKILL.md +0 -0
  210. /package/skills/{testomatio/test-automation → test-automation}/testomat-allure-adapter/SKILL.md +0 -0
  211. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/SKILL.md +0 -0
  212. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -0
  213. /package/skills/{testomatio/test-management → test-management}/detect-useless-tests/SKILL.md +0 -0
  214. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/SKILL.md +0 -0
  215. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -0
  216. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/SKILL.md +0 -0
  217. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CSV_MIGRATION.md +0 -0
  218. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +0 -0
  219. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTMO_MIGRATION.md +0 -0
  220. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +0 -0
  221. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/XRAY_MIGRATION.md +0 -0
  222. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/SKILL.md +0 -0
  223. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -0
  224. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -0
  225. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -0
  226. /package/skills/{testomatio/test-management → test-management}/qa-split-testing-levels-pyramid/SKILL.md +0 -0
  227. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/SKILL.md +0 -0
  228. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +0 -0
  229. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/SKILL.md +0 -0
  230. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -0
  231. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -0
  232. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/scripts/check-coverage.mjs +0 -0
  233. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/SKILL.md +0 -0
  234. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/test-case-format.md +0 -0
  235. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/testomat-tms-guide.md +0 -0
  236. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/writing-rule.md +0 -0
  237. /package/skills/{testomatio/test-management → test-management}/scan-automation-project/SKILL.md +0 -0
  238. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/SKILL.md +0 -0
  239. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -0
  240. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/SKILL.md +0 -0
  241. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/references/MCP_SETUP.md +0 -0
@@ -1,383 +0,0 @@
1
- # Mocking Strategy: Real vs Mock Services
2
-
3
- ## Table of Contents
4
-
5
- 1. [Core Principle](#core-principle)
6
- 2. [Decision Matrix](#decision-matrix)
7
- 3. [Decision Flowchart](#decision-flowchart)
8
- 4. [Mocking Techniques](#mocking-techniques)
9
- 5. [Real Service Strategies](#real-service-strategies)
10
- 6. [Hybrid Approach: Fixture-Based Mock Control](#hybrid-approach-fixture-based-mock-control)
11
- 7. [Validating Mock Accuracy](#validating-mock-accuracy)
12
- 8. [Anti-Patterns](#anti-patterns)
13
-
14
- > **When to use**: Deciding whether to mock API calls, intercept network requests, or hit real services in Playwright tests.
15
-
16
- ## Core Principle
17
-
18
- **Mock at the boundary, test your stack end-to-end.** Mock third-party services you don't own (payment gateways, email providers, OAuth). Never mock your own frontend-to-backend communication. Tests should prove YOUR code works, not that third-party APIs are available.
19
-
20
- ## Decision Matrix
21
-
22
- | Scenario | Mock? | Strategy |
23
- | --- | --- | --- |
24
- | Your own REST/GraphQL API | Never | Hit real API against staging or local dev |
25
- | Your database (through your API) | Never | Seed via API or fixtures |
26
- | Authentication (your auth system) | Mostly no | Use `storageState` to skip login in most tests |
27
- | Stripe / payment gateway | Always | `route.fulfill()` with expected responses |
28
- | SendGrid / email service | Always | Mock the API call, verify request payload |
29
- | OAuth providers (Google, GitHub) | Always | Mock token exchange, test your callback handler |
30
- | Analytics (Segment, Mixpanel) | Always | `route.abort()` or `route.fulfill()` |
31
- | Maps / geocoding APIs | Always | Mock with static responses |
32
- | Feature flags (LaunchDarkly) | Usually | Mock to force specific flag states |
33
- | CDN / static assets | Never | Let them load normally |
34
- | Flaky external dependency | CI: mock, local: real | Conditional mocking based on environment |
35
- | Slow external dependency | Dev: mock, nightly: real | Separate test projects in config |
36
-
37
- ## Decision Flowchart
38
-
39
- ```text
40
- Is this service part of YOUR codebase?
41
- ├── YES → Do NOT mock. Test the real integration.
42
- │ ├── Is it slow? → Optimize the service, not the test.
43
- │ └── Is it flaky? → Fix the service. Flaky infra is a bug.
44
- └── NO → It's a third-party service.
45
- ├── Is it paid per call? → ALWAYS mock.
46
- ├── Is it rate-limited? → ALWAYS mock.
47
- ├── Is it slow or unreliable? → ALWAYS mock.
48
- └── Is it a complex multi-step flow? → Mock with HAR recording.
49
- ```
50
-
51
- ## Mocking Techniques
52
-
53
- ### Blocking Unwanted Requests
54
-
55
- Block third-party scripts that slow tests and add no coverage:
56
-
57
- ```typescript
58
- test.beforeEach(async ({ page }) => {
59
- await page.route('**/{analytics,tracking,segment,hotjar}.{com,io}/**', (route) => {
60
- route.abort();
61
- });
62
- });
63
-
64
- test('dashboard renders without tracking scripts', async ({ page }) => {
65
- await page.goto('/dashboard');
66
- await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
67
- });
68
- ```
69
-
70
- ### Full Mock (route.fulfill)
71
-
72
- Completely replace a third-party API response:
73
-
74
- ```typescript
75
- test('order flow with mocked payment service', async ({ page }) => {
76
- await page.route('**/api/charge', (route) => {
77
- route.fulfill({
78
- status: 200,
79
- contentType: 'application/json',
80
- body: JSON.stringify({
81
- transactionId: 'txn_mock_abc',
82
- status: 'completed',
83
- }),
84
- });
85
- });
86
-
87
- await page.goto('/order/confirm');
88
- await page.getByRole('button', { name: 'Complete Purchase' }).click();
89
- await expect(page.getByText('Order confirmed')).toBeVisible();
90
- });
91
-
92
- test('display error on payment decline', async ({ page }) => {
93
- await page.route('**/api/charge', (route) => {
94
- route.fulfill({
95
- status: 402,
96
- contentType: 'application/json',
97
- body: JSON.stringify({
98
- error: { code: 'insufficient_funds', message: 'Card declined.' },
99
- }),
100
- });
101
- });
102
-
103
- await page.goto('/order/confirm');
104
- await page.getByRole('button', { name: 'Complete Purchase' }).click();
105
- await expect(page.getByRole('alert')).toContainText('Card declined');
106
- });
107
- ```
108
-
109
- ### Partial Mock (Modify Responses)
110
-
111
- Let the real API call happen but tweak the response:
112
-
113
- ```typescript
114
- test('display low inventory warning', async ({ page }) => {
115
- await page.route('**/api/inventory/*', async (route) => {
116
- const response = await route.fetch();
117
- const data = await response.json();
118
-
119
- data.quantity = 1;
120
- data.lowStock = true;
121
-
122
- await route.fulfill({
123
- response,
124
- body: JSON.stringify(data),
125
- });
126
- });
127
-
128
- await page.goto('/products/widget-pro');
129
- await expect(page.getByText('Only 1 remaining')).toBeVisible();
130
- });
131
-
132
- test('inject test notification into real response', async ({ page }) => {
133
- await page.route('**/api/alerts', async (route) => {
134
- const response = await route.fetch();
135
- const data = await response.json();
136
-
137
- data.items.push({
138
- id: 'test-alert',
139
- text: 'Report generated',
140
- category: 'info',
141
- });
142
-
143
- await route.fulfill({
144
- response,
145
- body: JSON.stringify(data),
146
- });
147
- });
148
-
149
- await page.goto('/home');
150
- await expect(page.getByText('Report generated')).toBeVisible();
151
- });
152
- ```
153
-
154
- ### Record and Replay (HAR Files)
155
-
156
- For complex API sequences (OAuth flows, multi-step wizards):
157
-
158
- **Recording:**
159
-
160
- ```typescript
161
- test('capture API traffic for admin panel', async ({ page }) => {
162
- await page.routeFromHAR('tests/fixtures/admin-panel.har', {
163
- url: '**/api/**',
164
- update: true,
165
- });
166
-
167
- await page.goto('/admin');
168
- await page.getByRole('tab', { name: 'Reports' }).click();
169
- await page.getByRole('tab', { name: 'Settings' }).click();
170
- });
171
- ```
172
-
173
- **Replaying:**
174
-
175
- ```typescript
176
- test('admin panel loads with recorded data', async ({ page }) => {
177
- await page.routeFromHAR('tests/fixtures/admin-panel.har', {
178
- url: '**/api/**',
179
- update: false,
180
- });
181
-
182
- await page.goto('/admin');
183
- await expect(page.getByRole('heading', { name: 'Reports' })).toBeVisible();
184
- });
185
- ```
186
-
187
- **HAR maintenance:**
188
-
189
- - Record against a known-good staging environment
190
- - Commit `.har` files to version control
191
- - Re-record when APIs change
192
- - Scope HAR to specific URL patterns
193
-
194
- ## Real Service Strategies
195
-
196
- ### Local Dev Server
197
-
198
- ```typescript
199
- // playwright.config.ts
200
- export default defineConfig({
201
- webServer: {
202
- command: 'npm run dev',
203
- url: 'http://localhost:3000',
204
- reuseExistingServer: !process.env.CI,
205
- timeout: 30_000,
206
- },
207
- use: {
208
- baseURL: 'http://localhost:3000',
209
- },
210
- });
211
- ```
212
-
213
- ### Staging Environment
214
-
215
- ```typescript
216
- // playwright.config.ts
217
- export default defineConfig({
218
- use: {
219
- baseURL: process.env.CI
220
- ? 'https://staging.example.com'
221
- : 'http://localhost:3000',
222
- },
223
- });
224
- ```
225
-
226
- ### Test Containers
227
-
228
- ```typescript
229
- // playwright.config.ts
230
- export default defineConfig({
231
- webServer: {
232
- command: 'docker compose -f docker-compose.test.yml up --wait',
233
- url: 'http://localhost:3000/health',
234
- reuseExistingServer: !process.env.CI,
235
- timeout: 120_000,
236
- },
237
- globalTeardown: './tests/global-teardown.ts',
238
- });
239
- ```
240
-
241
- ```typescript
242
- // tests/global-teardown.ts
243
- import { execSync } from 'child_process';
244
-
245
- export default function globalTeardown() {
246
- if (process.env.CI) {
247
- execSync('docker compose -f docker-compose.test.yml down -v');
248
- }
249
- }
250
- ```
251
-
252
- ## Hybrid Approach: Fixture-Based Mock Control
253
-
254
- Create fixtures that let individual tests opt into mocking specific services:
255
-
256
- ```typescript
257
- // tests/fixtures/service-mocks.ts
258
- import { test as base } from '@playwright/test';
259
-
260
- type MockConfig = {
261
- mockPayments: boolean;
262
- mockNotifications: boolean;
263
- mockAnalytics: boolean;
264
- };
265
-
266
- export const test = base.extend<MockConfig>({
267
- mockPayments: [true, { option: true }],
268
- mockNotifications: [true, { option: true }],
269
- mockAnalytics: [true, { option: true }],
270
-
271
- page: async ({ page, mockPayments, mockNotifications, mockAnalytics }, use) => {
272
- if (mockPayments) {
273
- await page.route('**/api/billing/**', (route) => {
274
- route.fulfill({
275
- status: 200,
276
- contentType: 'application/json',
277
- body: JSON.stringify({ status: 'paid', id: 'inv_mock_789' }),
278
- });
279
- });
280
- }
281
-
282
- if (mockNotifications) {
283
- await page.route('**/api/notify', (route) => {
284
- route.fulfill({
285
- status: 200,
286
- contentType: 'application/json',
287
- body: JSON.stringify({ delivered: true }),
288
- });
289
- });
290
- }
291
-
292
- if (mockAnalytics) {
293
- await page.route('**/{segment,mixpanel,amplitude}.**/**', (route) => {
294
- route.abort();
295
- });
296
- }
297
-
298
- await use(page);
299
- },
300
- });
301
-
302
- export { expect } from '@playwright/test';
303
- ```
304
-
305
- ```typescript
306
- // tests/billing.spec.ts
307
- import { test, expect } from './fixtures/service-mocks';
308
-
309
- test('subscription renewal sends notification', async ({ page }) => {
310
- await page.goto('/account/billing');
311
- await page.getByRole('button', { name: 'Renew Now' }).click();
312
- await expect(page.getByText('Subscription renewed')).toBeVisible();
313
- });
314
-
315
- test.describe('integration suite', () => {
316
- test.use({ mockPayments: false });
317
-
318
- test('real billing flow against test gateway', async ({ page }) => {
319
- await page.goto('/account/billing');
320
- await page.getByRole('button', { name: 'Renew Now' }).click();
321
- await expect(page.getByText('Subscription renewed')).toBeVisible();
322
- });
323
- });
324
- ```
325
-
326
- ### Environment-Based Test Projects
327
-
328
- ```typescript
329
- // playwright.config.ts
330
- export default defineConfig({
331
- projects: [
332
- {
333
- name: 'ci-fast',
334
- testMatch: '**/*.spec.ts',
335
- use: { baseURL: 'http://localhost:3000' },
336
- },
337
- {
338
- name: 'nightly-full',
339
- testMatch: '**/*.integration.spec.ts',
340
- use: { baseURL: 'https://staging.example.com' },
341
- timeout: 120_000,
342
- },
343
- ],
344
- });
345
- ```
346
-
347
- ## Validating Mock Accuracy
348
-
349
- Guard against mock drift from real APIs:
350
-
351
- ```typescript
352
- test.describe('contract validation', () => {
353
- test('billing mock matches real API shape', async ({ request }) => {
354
- const realResponse = await request.post('/api/billing/charge', {
355
- data: { amount: 5000, currency: 'usd' },
356
- });
357
- const realBody = await realResponse.json();
358
-
359
- const mockBody = {
360
- status: 'paid',
361
- id: 'inv_mock_789',
362
- };
363
-
364
- expect(Object.keys(mockBody).sort()).toEqual(Object.keys(realBody).sort());
365
-
366
- for (const key of Object.keys(mockBody)) {
367
- expect(typeof mockBody[key]).toBe(typeof realBody[key]);
368
- }
369
- });
370
- });
371
- ```
372
-
373
- ## Anti-Patterns
374
-
375
- | Don't Do This | Problem | Do This Instead |
376
- | --- | --- | --- |
377
- | Mock your own API | Tests pass, app breaks. Zero integration coverage. | Hit your real API. Mock only third-party services. |
378
- | Mock everything for speed | You test a fiction. Frontend and backend may be incompatible. | Mock only external boundaries. |
379
- | Never mock anything | Tests are slow, flaky, fail when third parties have outages. | Mock third-party services. |
380
- | Use outdated mocks | Mock returns different shape than real API. | Run contract validation tests. Re-record HAR files regularly. |
381
- | Mock with `page.evaluate()` to stub fetch | Fragile, doesn't survive navigation. | Use `page.route()` which intercepts at network layer. |
382
- | Copy-paste mocks across files | One API change requires updating many files. | Centralize mocks in fixtures. |
383
- | Block all network and whitelist | Extremely brittle. Every new endpoint requires update. | Allow all by default. Selectively mock third-party services. |