testeiya 0.10.1 → 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 (225) hide show
  1. package/README.md +7 -19
  2. package/dist/prompt/clis.d.ts +7 -0
  3. package/dist/prompt/pipeline-report.d.ts +1 -0
  4. package/dist/prompt/report.d.ts +10 -0
  5. package/dist/prompt/system-prompt.d.ts +22 -0
  6. package/dist/prompt/testomat.io.d.ts +19 -0
  7. package/dist/prompt/thread.d.ts +73 -0
  8. package/dist/src/args.d.ts +39 -0
  9. package/dist/src/attribution-extension.d.ts +3 -0
  10. package/dist/src/checkpoint.d.ts +30 -0
  11. package/dist/src/cli.d.ts +2 -0
  12. package/dist/src/cli.js +27 -32
  13. package/dist/src/cli.js.map +1 -1
  14. package/dist/src/doctor.d.ts +11 -0
  15. package/dist/src/env.d.ts +30 -0
  16. package/dist/src/exec.d.ts +11 -0
  17. package/dist/src/git.d.ts +41 -0
  18. package/dist/src/langfuse-extension.d.ts +7 -0
  19. package/dist/src/langfuse.d.ts +67 -0
  20. package/dist/src/mcp.d.ts +19 -0
  21. package/dist/src/model.d.ts +20 -0
  22. package/dist/src/models.d.ts +1 -0
  23. package/dist/src/output.d.ts +84 -0
  24. package/dist/src/pipeline/command-stage.d.ts +12 -0
  25. package/dist/src/pipeline/crash-guard.d.ts +12 -0
  26. package/dist/src/pipeline/crash-guard.js +21 -0
  27. package/dist/src/pipeline/crash-guard.js.map +1 -0
  28. package/dist/src/pipeline/diagram.d.ts +24 -0
  29. package/dist/src/pipeline/gate.d.ts +21 -0
  30. package/dist/src/pipeline/launcher.d.ts +33 -0
  31. package/dist/src/pipeline/launcher.js +16 -3
  32. package/dist/src/pipeline/launcher.js.map +1 -1
  33. package/dist/src/pipeline/log.d.ts +29 -0
  34. package/dist/src/pipeline/log.js +9 -0
  35. package/dist/src/pipeline/log.js.map +1 -1
  36. package/dist/src/pipeline/overlay.d.ts +29 -0
  37. package/dist/src/pipeline/pipeline-file.d.ts +44 -0
  38. package/dist/src/pipeline/pipeline.d.ts +78 -0
  39. package/dist/src/pipeline/pipeline.js +22 -0
  40. package/dist/src/pipeline/pipeline.js.map +1 -1
  41. package/dist/src/pipeline/report.d.ts +26 -0
  42. package/dist/src/pipeline/report.js +13 -0
  43. package/dist/src/pipeline/report.js.map +1 -1
  44. package/dist/src/pipeline/spec.d.ts +63 -0
  45. package/dist/src/pipeline/stage-env.d.ts +13 -0
  46. package/dist/src/pipeline/stage-env.js +31 -0
  47. package/dist/src/pipeline/stage-env.js.map +1 -0
  48. package/dist/src/pipeline/stage.d.ts +71 -0
  49. package/dist/src/pipeline/stage.js.map +1 -1
  50. package/dist/src/pipeline/state.d.ts +63 -0
  51. package/dist/src/pipeline/summary-stage.d.ts +24 -0
  52. package/dist/src/pipeline/task-stage.d.ts +24 -0
  53. package/dist/src/pipeline/task-stage.js +86 -2
  54. package/dist/src/pipeline/task-stage.js.map +1 -1
  55. package/dist/src/pipeline/variables.d.ts +20 -0
  56. package/dist/src/result.d.ts +6 -0
  57. package/dist/src/run.d.ts +69 -0
  58. package/dist/src/run.js +116 -60
  59. package/dist/src/run.js.map +1 -1
  60. package/dist/src/session.d.ts +43 -0
  61. package/dist/src/sessions.d.ts +23 -0
  62. package/dist/src/skills.d.ts +29 -0
  63. package/package.json +11 -2
  64. package/pipelines/api-testing.yml +1 -1
  65. package/scripts/vendor-skills.js +62 -0
  66. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -119
  67. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -141
  68. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -100
  69. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -196
  70. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -83
  71. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -126
  72. package/skills/codeceptjs/lint-codeceptjs-tests/SKILL.md +0 -104
  73. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -109
  74. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -295
  75. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -339
  76. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -459
  77. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -338
  78. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -78
  79. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -102
  80. package/skills/playwright/playwright-best-practices/SKILL.md +0 -303
  81. package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +0 -360
  82. package/skills/playwright/playwright-best-practices/advanced/authentication.md +0 -871
  83. package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +0 -364
  84. package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +0 -409
  85. package/skills/playwright/playwright-best-practices/advanced/multi-context.md +0 -288
  86. package/skills/playwright/playwright-best-practices/advanced/multi-user.md +0 -393
  87. package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +0 -452
  88. package/skills/playwright/playwright-best-practices/advanced/third-party.md +0 -464
  89. package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  90. package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +0 -369
  91. package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +0 -383
  92. package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  93. package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +0 -403
  94. package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +0 -504
  95. package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +0 -403
  96. package/skills/playwright/playwright-best-practices/core/annotations.md +0 -424
  97. package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +0 -361
  98. package/skills/playwright/playwright-best-practices/core/configuration.md +0 -452
  99. package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +0 -417
  100. package/skills/playwright/playwright-best-practices/core/global-setup.md +0 -434
  101. package/skills/playwright/playwright-best-practices/core/locators.md +0 -242
  102. package/skills/playwright/playwright-best-practices/core/page-object-model.md +0 -315
  103. package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +0 -453
  104. package/skills/playwright/playwright-best-practices/core/test-data.md +0 -492
  105. package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +0 -361
  106. package/skills/playwright/playwright-best-practices/core/test-tags.md +0 -298
  107. package/skills/playwright/playwright-best-practices/debugging/console-errors.md +0 -420
  108. package/skills/playwright/playwright-best-practices/debugging/debugging.md +0 -504
  109. package/skills/playwright/playwright-best-practices/debugging/error-testing.md +0 -360
  110. package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +0 -496
  111. package/skills/playwright/playwright-best-practices/frameworks/angular.md +0 -530
  112. package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +0 -469
  113. package/skills/playwright/playwright-best-practices/frameworks/react.md +0 -531
  114. package/skills/playwright/playwright-best-practices/frameworks/vue.md +0 -574
  115. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  116. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  117. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  118. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  119. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  120. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  121. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  122. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  123. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  124. package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  125. package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  126. package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  127. package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  128. package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  129. package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  130. package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +0 -509
  131. package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  132. package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  133. package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  134. package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  135. package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +0 -508
  136. package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  137. package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  138. package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  139. package/skills/playwright/playwright-cli/SKILL.md +0 -489
  140. package/skills/playwright/playwright-cli/references/element-attributes.md +0 -23
  141. package/skills/playwright/playwright-cli/references/playwright-tests.md +0 -39
  142. package/skills/playwright/playwright-cli/references/pr-attachments.md +0 -60
  143. package/skills/playwright/playwright-cli/references/request-mocking.md +0 -87
  144. package/skills/playwright/playwright-cli/references/running-code.md +0 -245
  145. package/skills/playwright/playwright-cli/references/session-management.md +0 -227
  146. package/skills/playwright/playwright-cli/references/storage-state.md +0 -275
  147. package/skills/playwright/playwright-cli/references/test-generation.md +0 -433
  148. package/skills/playwright/playwright-cli/references/tracing.md +0 -139
  149. package/skills/playwright/playwright-cli/references/video-recording.md +0 -216
  150. package/skills/skills.lock.json +0 -89
  151. package/skills/skills.yaml +0 -35
  152. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/SKILL.md +0 -0
  153. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/references/no-install.md +0 -0
  154. /package/skills/{testomatio/explorbot → explorbot}/explorbot-plan/SKILL.md +0 -0
  155. /package/skills/{testomatio/explorbot → explorbot}/explorbot-setup/SKILL.md +0 -0
  156. /package/skills/{testomatio/explorbot → explorbot}/prima/SKILL.md +0 -0
  157. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/SKILL.md +0 -0
  158. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/references/output-format.md +0 -0
  159. /package/skills/{testomatio/qa-process → qa-process}/qa-review-pr/SKILL.md +0 -0
  160. /package/skills/{testomatio/qa-process → qa-process}/testing-workflow/SKILL.md +0 -0
  161. /package/skills/{testomatio/requirements → requirements}/catalog-features/SKILL.md +0 -0
  162. /package/skills/{testomatio/requirements → requirements}/catalog-features/references/layout.md +0 -0
  163. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/SKILL.md +0 -0
  164. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/features.md +0 -0
  165. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/layout.md +0 -0
  166. /package/skills/{testomatio/requirements → requirements}/pull-request-diff-analyzer/SKILL.md +0 -0
  167. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/SKILL.md +0 -0
  168. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/answer-shapes.md +0 -0
  169. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/examples.md +0 -0
  170. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/SKILL.md +0 -0
  171. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/references/summary-example.md +0 -0
  172. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/SKILL.md +0 -0
  173. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -0
  174. /package/skills/{testomatio/requirements → requirements}/qa-thinking/SKILL.md +0 -0
  175. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/SKILL.md +0 -0
  176. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/behaviors.md +0 -0
  177. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/layout.md +0 -0
  178. /package/skills/{testomatio/requirements → requirements}/write-user-story/SKILL.md +0 -0
  179. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/CLAUDE.md +0 -0
  180. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/SKILL.md +0 -0
  181. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -0
  182. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -0
  183. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -0
  184. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -0
  185. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -0
  186. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/SKILL.md +0 -0
  187. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -0
  188. /package/skills/{testomatio/test-automation → test-automation}/epic-requirements-specification/SKILL.md +0 -0
  189. /package/skills/{testomatio/test-automation → test-automation}/qa-automation-test-consolidation/SKILL.md +0 -0
  190. /package/skills/{testomatio/test-automation → test-automation}/qa-data-seeder/SKILL.md +0 -0
  191. /package/skills/{testomatio/test-automation → test-automation}/run-tests-with-testomatio-reporter/SKILL.md +0 -0
  192. /package/skills/{testomatio/test-automation → test-automation}/setup-change-aware-pr-testing/SKILL.md +0 -0
  193. /package/skills/{testomatio/test-automation → test-automation}/setup-ci-automation/SKILL.md +0 -0
  194. /package/skills/{testomatio/test-automation → test-automation}/testomat-allure-adapter/SKILL.md +0 -0
  195. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/SKILL.md +0 -0
  196. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -0
  197. /package/skills/{testomatio/test-management → test-management}/detect-useless-tests/SKILL.md +0 -0
  198. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/SKILL.md +0 -0
  199. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -0
  200. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/SKILL.md +0 -0
  201. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CSV_MIGRATION.md +0 -0
  202. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +0 -0
  203. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTMO_MIGRATION.md +0 -0
  204. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +0 -0
  205. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/XRAY_MIGRATION.md +0 -0
  206. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/SKILL.md +0 -0
  207. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -0
  208. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -0
  209. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -0
  210. /package/skills/{testomatio/test-management → test-management}/qa-split-testing-levels-pyramid/SKILL.md +0 -0
  211. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/SKILL.md +0 -0
  212. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +0 -0
  213. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/SKILL.md +0 -0
  214. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -0
  215. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -0
  216. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/scripts/check-coverage.mjs +0 -0
  217. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/SKILL.md +0 -0
  218. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/test-case-format.md +0 -0
  219. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/testomat-tms-guide.md +0 -0
  220. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/writing-rule.md +0 -0
  221. /package/skills/{testomatio/test-management → test-management}/scan-automation-project/SKILL.md +0 -0
  222. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/SKILL.md +0 -0
  223. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -0
  224. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/SKILL.md +0 -0
  225. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/references/MCP_SETUP.md +0 -0
@@ -1,364 +0,0 @@
1
- # Date, Time & Clock Mocking
2
-
3
- ## Table of Contents
4
-
5
- 1. [Clock API Basics](#clock-api-basics)
6
- 2. [Fixed Time Testing](#fixed-time-testing)
7
- 3. [Time Advancement](#time-advancement)
8
- 4. [Timezone Testing](#timezone-testing)
9
- 5. [Timer Mocking](#timer-mocking)
10
-
11
- ## Clock API Basics
12
-
13
- ### Install Clock
14
-
15
- ```typescript
16
- test("mock current time", async ({ page }) => {
17
- // Install clock before navigating
18
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
19
-
20
- await page.goto("/dashboard");
21
-
22
- // Page sees January 15, 2025 as current date
23
- await expect(page.getByText("January 15, 2025")).toBeVisible();
24
- });
25
- ```
26
-
27
- ### Clock with Fixture
28
-
29
- ```typescript
30
- // fixtures/clock.fixture.ts
31
- import { test as base } from "@playwright/test";
32
-
33
- type ClockFixtures = {
34
- mockTime: (date: Date | string) => Promise<void>;
35
- };
36
-
37
- export const test = base.extend<ClockFixtures>({
38
- mockTime: async ({ page }, use) => {
39
- await use(async (date) => {
40
- const time = typeof date === "string" ? new Date(date) : date;
41
- await page.clock.install({ time });
42
- });
43
- },
44
- });
45
-
46
- // Usage
47
- test("subscription expiry", async ({ page, mockTime }) => {
48
- await mockTime("2025-12-31T23:59:00");
49
- await page.goto("/subscription");
50
-
51
- await expect(page.getByText("Expires today")).toBeVisible();
52
- });
53
- ```
54
-
55
- ## Fixed Time Testing
56
-
57
- ### Test Date-Dependent Features
58
-
59
- ```typescript
60
- test("show holiday banner in December", async ({ page }) => {
61
- await page.clock.install({ time: new Date("2025-12-20T10:00:00") });
62
-
63
- await page.goto("/");
64
-
65
- await expect(page.getByRole("banner", { name: /holiday/i })).toBeVisible();
66
- });
67
-
68
- test("no holiday banner in January", async ({ page }) => {
69
- await page.clock.install({ time: new Date("2025-01-15T10:00:00") });
70
-
71
- await page.goto("/");
72
-
73
- await expect(page.getByRole("banner", { name: /holiday/i })).toBeHidden();
74
- });
75
- ```
76
-
77
- ### Test Relative Time Display
78
-
79
- ```typescript
80
- test("shows relative time correctly", async ({ page }) => {
81
- // Fix time to control "posted 2 hours ago" text
82
- await page.clock.install({ time: new Date("2025-06-15T14:00:00") });
83
-
84
- // Mock API to return post with known timestamp
85
- await page.route("**/api/posts/1", (route) =>
86
- route.fulfill({
87
- json: {
88
- id: 1,
89
- title: "Test Post",
90
- createdAt: "2025-06-15T12:00:00Z", // 2 hours before mock time
91
- },
92
- }),
93
- );
94
-
95
- await page.goto("/posts/1");
96
-
97
- await expect(page.getByText("2 hours ago")).toBeVisible();
98
- });
99
- ```
100
-
101
- ### Test Date Boundaries
102
-
103
- ```typescript
104
- test.describe("end of month billing", () => {
105
- test("shows billing on last day of month", async ({ page }) => {
106
- await page.clock.install({ time: new Date("2025-01-31T10:00:00") });
107
- await page.goto("/billing");
108
-
109
- await expect(page.getByText("Payment due today")).toBeVisible();
110
- });
111
-
112
- test("shows days remaining mid-month", async ({ page }) => {
113
- await page.clock.install({ time: new Date("2025-01-15T10:00:00") });
114
- await page.goto("/billing");
115
-
116
- await expect(page.getByText("16 days until payment")).toBeVisible();
117
- });
118
- });
119
- ```
120
-
121
- ## Time Advancement
122
-
123
- ### Advance Time Manually
124
-
125
- ```typescript
126
- test("session timeout warning", async ({ page }) => {
127
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
128
- await page.goto("/dashboard");
129
-
130
- // Advance 25 minutes (session timeout at 30 min)
131
- await page.clock.fastForward("25:00");
132
-
133
- await expect(page.getByText("Session expires in 5 minutes")).toBeVisible();
134
-
135
- // Advance 5 more minutes
136
- await page.clock.fastForward("05:00");
137
-
138
- await expect(page.getByText("Session expired")).toBeVisible();
139
- });
140
- ```
141
-
142
- ### Pause and Resume Time
143
-
144
- ```typescript
145
- test("countdown timer", async ({ page }) => {
146
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
147
- await page.goto("/sale");
148
-
149
- // Initial state
150
- await expect(page.getByText("Sale ends in 2:00:00")).toBeVisible();
151
-
152
- // Advance 1 hour
153
- await page.clock.fastForward("01:00:00");
154
-
155
- await expect(page.getByText("Sale ends in 1:00:00")).toBeVisible();
156
-
157
- // Advance past end
158
- await page.clock.fastForward("01:00:01");
159
-
160
- await expect(page.getByText("Sale ended")).toBeVisible();
161
- });
162
- ```
163
-
164
- ### Run Pending Timers
165
-
166
- ```typescript
167
- test("debounced search", async ({ page }) => {
168
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
169
- await page.goto("/search");
170
-
171
- await page.getByLabel("Search").fill("playwright");
172
-
173
- // Search is debounced by 300ms, won't fire yet
174
- await expect(page.getByTestId("search-results")).toBeHidden();
175
-
176
- // Fast forward past debounce
177
- await page.clock.fastForward(300);
178
-
179
- // Now search should execute
180
- await expect(page.getByTestId("search-results")).toBeVisible();
181
- });
182
- ```
183
-
184
- ## Timezone Testing
185
-
186
- ### Test Different Timezones
187
-
188
- ```typescript
189
- test.describe("timezone display", () => {
190
- test("shows correct time in PST", async ({ browser }) => {
191
- const context = await browser.newContext({
192
- timezoneId: "America/Los_Angeles",
193
- });
194
- const page = await context.newPage();
195
-
196
- await page.clock.install({ time: new Date("2025-01-15T17:00:00Z") }); // 5 PM UTC
197
-
198
- await page.goto("/schedule");
199
-
200
- // Should show 9 AM PST
201
- await expect(page.getByText("9:00 AM")).toBeVisible();
202
-
203
- await context.close();
204
- });
205
-
206
- test("shows correct time in JST", async ({ browser }) => {
207
- const context = await browser.newContext({
208
- timezoneId: "Asia/Tokyo",
209
- });
210
- const page = await context.newPage();
211
-
212
- await page.clock.install({ time: new Date("2025-01-15T17:00:00Z") }); // 5 PM UTC
213
-
214
- await page.goto("/schedule");
215
-
216
- // Should show 2 AM next day JST
217
- await expect(page.getByText("2:00 AM")).toBeVisible();
218
-
219
- await context.close();
220
- });
221
- });
222
- ```
223
-
224
- ### Timezone Fixture
225
-
226
- ```typescript
227
- // fixtures/timezone.fixture.ts
228
- import { test as base } from "@playwright/test";
229
-
230
- type TimezoneFixtures = {
231
- pageInTimezone: (timezone: string) => Promise<Page>;
232
- };
233
-
234
- export const test = base.extend<TimezoneFixtures>({
235
- pageInTimezone: async ({ browser }, use) => {
236
- const pages: Page[] = [];
237
-
238
- await use(async (timezone) => {
239
- const context = await browser.newContext({ timezoneId: timezone });
240
- const page = await context.newPage();
241
- pages.push(page);
242
- return page;
243
- });
244
-
245
- // Cleanup
246
- for (const page of pages) {
247
- await page.context().close();
248
- }
249
- },
250
- });
251
- ```
252
-
253
- ## Timer Mocking
254
-
255
- ### Mock setInterval
256
-
257
- ```typescript
258
- test("auto-refresh data", async ({ page }) => {
259
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
260
-
261
- let apiCalls = 0;
262
- await page.route("**/api/data", (route) => {
263
- apiCalls++;
264
- route.fulfill({ json: { value: apiCalls } });
265
- });
266
-
267
- await page.goto("/live-data"); // Sets up 30s refresh interval
268
-
269
- expect(apiCalls).toBe(1); // Initial load
270
-
271
- // Advance 30 seconds
272
- await page.clock.fastForward("00:30");
273
- expect(apiCalls).toBe(2); // First refresh
274
-
275
- // Advance another 30 seconds
276
- await page.clock.fastForward("00:30");
277
- expect(apiCalls).toBe(3); // Second refresh
278
- });
279
- ```
280
-
281
- ### Mock setTimeout Chains
282
-
283
- ```typescript
284
- test("notification queue", async ({ page }) => {
285
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
286
- await page.goto("/notifications");
287
-
288
- // Trigger 3 notifications that show sequentially
289
- await page.getByRole("button", { name: "Show All" }).click();
290
-
291
- // First notification appears immediately
292
- await expect(page.getByText("Notification 1")).toBeVisible();
293
-
294
- // Second appears after 2 seconds
295
- await page.clock.fastForward("00:02");
296
- await expect(page.getByText("Notification 2")).toBeVisible();
297
-
298
- // Third appears after 2 more seconds
299
- await page.clock.fastForward("00:02");
300
- await expect(page.getByText("Notification 3")).toBeVisible();
301
- });
302
- ```
303
-
304
- ### Test Animation Frames
305
-
306
- ```typescript
307
- test("animation completes", async ({ page }) => {
308
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
309
- await page.goto("/animation-demo");
310
-
311
- await page.getByRole("button", { name: "Animate" }).click();
312
-
313
- // Animation runs for 500ms
314
- const element = page.getByTestId("animated-box");
315
- await expect(element).toHaveCSS("opacity", "0");
316
-
317
- // Fast forward through animation
318
- await page.clock.fastForward(500);
319
-
320
- await expect(element).toHaveCSS("opacity", "1");
321
- });
322
- ```
323
-
324
- ## Best Practices
325
-
326
- ### Always Install Clock Before Navigation
327
-
328
- ```typescript
329
- // Good
330
- test("date test", async ({ page }) => {
331
- await page.clock.install({ time: new Date("2025-01-15") });
332
- await page.goto("/"); // Page loads with mocked time
333
- });
334
-
335
- // Bad - time already captured by page
336
- test("date test", async ({ page }) => {
337
- await page.goto("/");
338
- await page.clock.install({ time: new Date("2025-01-15") }); // Too late!
339
- });
340
- ```
341
-
342
- ### Use ISO Strings for Clarity
343
-
344
- ```typescript
345
- // Good - explicit timezone
346
- await page.clock.install({ time: new Date("2025-01-15T09:00:00Z") });
347
-
348
- // Ambiguous - uses local timezone
349
- await page.clock.install({ time: new Date("2025-01-15T09:00:00") });
350
- ```
351
-
352
- ## Anti-Patterns to Avoid
353
-
354
- | Anti-Pattern | Problem | Solution |
355
- | ---------------------------------------- | ------------------------------- | -------------------------------------- |
356
- | Installing clock after navigation | Page already captured real time | Install clock before `goto()` |
357
- | Hardcoded relative dates | Tests break over time | Use fixed dates with clock mock |
358
- | Not accounting for timezone | Tests fail in different regions | Use explicit UTC times or set timezone |
359
- | Using `waitForTimeout` with mocked clock | Conflicts with mocked timers | Use `fastForward` instead |
360
-
361
- ## Related References
362
-
363
- - **Assertions**: See [assertions-waiting.md](../core/assertions-waiting.md) for time-based assertions
364
- - **Fixtures**: See [fixtures-hooks.md](../core/fixtures-hooks.md) for clock fixtures