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,403 +0,0 @@
1
- # WebSocket & Real-Time Testing
2
-
3
- ## Table of Contents
4
-
5
- 1. [WebSocket Basics](#websocket-basics)
6
- 2. [Mocking WebSocket Messages](#mocking-websocket-messages)
7
- 3. [Testing Real-Time Features](#testing-real-time-features)
8
- 4. [Server-Sent Events](#server-sent-events)
9
- 5. [Reconnection Testing](#reconnection-testing)
10
-
11
- ## WebSocket Basics
12
-
13
- ### Wait for WebSocket Connection
14
-
15
- ```typescript
16
- test("chat connects via websocket", async ({ page }) => {
17
- // Listen for WebSocket connection
18
- const wsPromise = page.waitForEvent("websocket");
19
-
20
- await page.goto("/chat");
21
-
22
- const ws = await wsPromise;
23
- expect(ws.url()).toContain("/ws/chat");
24
-
25
- // Wait for connection to be established
26
- await ws.waitForEvent("framesent");
27
- });
28
- ```
29
-
30
- ### Monitor WebSocket Messages
31
-
32
- ```typescript
33
- test("receives real-time updates", async ({ page }) => {
34
- const messages: string[] = [];
35
-
36
- // Set up listener before navigation
37
- page.on("websocket", (ws) => {
38
- ws.on("framereceived", (frame) => {
39
- messages.push(frame.payload as string);
40
- });
41
- });
42
-
43
- await page.goto("/dashboard");
44
-
45
- // Wait for some messages
46
- await expect.poll(() => messages.length).toBeGreaterThan(0);
47
-
48
- // Verify message format
49
- const data = JSON.parse(messages[0]);
50
- expect(data).toHaveProperty("type");
51
- });
52
- ```
53
-
54
- ### Capture Sent Messages
55
-
56
- ```typescript
57
- test("sends correct message format", async ({ page }) => {
58
- const sentMessages: string[] = [];
59
-
60
- page.on("websocket", (ws) => {
61
- ws.on("framesent", (frame) => {
62
- sentMessages.push(frame.payload as string);
63
- });
64
- });
65
-
66
- await page.goto("/chat");
67
- await page.getByLabel("Message").fill("Hello!");
68
- await page.getByRole("button", { name: "Send" }).click();
69
-
70
- // Verify sent message
71
- await expect.poll(() => sentMessages.length).toBeGreaterThan(0);
72
-
73
- const sent = JSON.parse(sentMessages[sentMessages.length - 1]);
74
- expect(sent).toEqual({
75
- type: "message",
76
- content: "Hello!",
77
- });
78
- });
79
- ```
80
-
81
- ## Mocking WebSocket Messages
82
-
83
- ### Inject Messages via Page Evaluate
84
-
85
- ```typescript
86
- test("displays incoming chat message", async ({ page }) => {
87
- await page.goto("/chat");
88
-
89
- // Wait for WebSocket to be ready
90
- await page.waitForFunction(
91
- () => (window as any).chatSocket?.readyState === 1,
92
- );
93
-
94
- // Simulate incoming message
95
- await page.evaluate(() => {
96
- const event = new MessageEvent("message", {
97
- data: JSON.stringify({
98
- type: "message",
99
- from: "Alice",
100
- content: "Hello there!",
101
- }),
102
- });
103
- (window as any).chatSocket.dispatchEvent(event);
104
- });
105
-
106
- await expect(page.getByText("Alice: Hello there!")).toBeVisible();
107
- });
108
- ```
109
-
110
- ### Mock WebSocket with Route Handler
111
-
112
- ```typescript
113
- test("mock websocket entirely", async ({ page, context }) => {
114
- // Intercept the WebSocket upgrade
115
- await context.route("**/ws/**", async (route) => {
116
- // For WebSocket routes, we can't fulfill directly
117
- // Instead, use page.evaluate to mock the client-side
118
- });
119
-
120
- // Alternative: Mock at application level
121
- await page.addInitScript(() => {
122
- const OriginalWebSocket = window.WebSocket;
123
- (window as any).WebSocket = function (url: string) {
124
- const ws = {
125
- readyState: 1,
126
- send: (data: string) => {
127
- console.log("WS Send:", data);
128
- },
129
- close: () => {},
130
- addEventListener: () => {},
131
- removeEventListener: () => {},
132
- };
133
- setTimeout(() => ws.onopen?.(), 100);
134
- return ws;
135
- };
136
- });
137
-
138
- await page.goto("/chat");
139
- });
140
- ```
141
-
142
- ### WebSocket Mock Fixture
143
-
144
- ```typescript
145
- // fixtures/websocket.fixture.ts
146
- import { test as base, Page } from "@playwright/test";
147
-
148
- type WsMessage = { type: string; [key: string]: any };
149
-
150
- type WebSocketFixtures = {
151
- mockWebSocket: {
152
- injectMessage: (message: WsMessage) => Promise<void>;
153
- getSentMessages: () => Promise<WsMessage[]>;
154
- };
155
- };
156
-
157
- export const test = base.extend<WebSocketFixtures>({
158
- mockWebSocket: async ({ page }, use) => {
159
- const sentMessages: WsMessage[] = [];
160
-
161
- // Capture sent messages
162
- await page.addInitScript(() => {
163
- (window as any).__wsSent = [];
164
- const OriginalWebSocket = window.WebSocket;
165
- window.WebSocket = function (url: string) {
166
- const ws = new OriginalWebSocket(url);
167
- const originalSend = ws.send.bind(ws);
168
- ws.send = (data: string) => {
169
- (window as any).__wsSent.push(JSON.parse(data));
170
- originalSend(data);
171
- };
172
- (window as any).__ws = ws;
173
- return ws;
174
- } as any;
175
- });
176
-
177
- await use({
178
- injectMessage: async (message) => {
179
- await page.evaluate((msg) => {
180
- const event = new MessageEvent("message", {
181
- data: JSON.stringify(msg),
182
- });
183
- (window as any).__ws?.dispatchEvent(event);
184
- }, message);
185
- },
186
- getSentMessages: async () => {
187
- return page.evaluate(() => (window as any).__wsSent || []);
188
- },
189
- });
190
- },
191
- });
192
-
193
- // Usage
194
- test("chat with mocked websocket", async ({ page, mockWebSocket }) => {
195
- await page.goto("/chat");
196
-
197
- // Inject incoming message
198
- await mockWebSocket.injectMessage({
199
- type: "message",
200
- from: "Bob",
201
- content: "Hi!",
202
- });
203
-
204
- await expect(page.getByText("Bob: Hi!")).toBeVisible();
205
-
206
- // Send a reply
207
- await page.getByLabel("Message").fill("Hello Bob!");
208
- await page.getByRole("button", { name: "Send" }).click();
209
-
210
- // Verify sent message
211
- const sent = await mockWebSocket.getSentMessages();
212
- expect(sent).toContainEqual(
213
- expect.objectContaining({ content: "Hello Bob!" }),
214
- );
215
- });
216
- ```
217
-
218
- ## Testing Real-Time Features
219
-
220
- ### Live Notifications
221
-
222
- ```typescript
223
- test("displays live notification", async ({ page }) => {
224
- await page.goto("/dashboard");
225
-
226
- // Simulate notification via WebSocket
227
- await page.evaluate(() => {
228
- const event = new MessageEvent("message", {
229
- data: JSON.stringify({
230
- type: "notification",
231
- title: "New Order",
232
- message: "Order #123 received",
233
- }),
234
- });
235
- (window as any).notificationSocket.dispatchEvent(event);
236
- });
237
-
238
- await expect(page.getByRole("alert")).toContainText("Order #123 received");
239
- });
240
- ```
241
-
242
- ### Live Data Updates
243
-
244
- ```typescript
245
- test("updates stock price in real-time", async ({ page }) => {
246
- await page.goto("/stocks/AAPL");
247
-
248
- const priceElement = page.getByTestId("stock-price");
249
- const initialPrice = await priceElement.textContent();
250
-
251
- // Simulate price update
252
- await page.evaluate(() => {
253
- const event = new MessageEvent("message", {
254
- data: JSON.stringify({
255
- type: "price_update",
256
- symbol: "AAPL",
257
- price: 150.25,
258
- }),
259
- });
260
- (window as any).stockSocket.dispatchEvent(event);
261
- });
262
-
263
- await expect(priceElement).not.toHaveText(initialPrice!);
264
- await expect(priceElement).toContainText("150.25");
265
- });
266
- ```
267
-
268
- ### Collaborative Editing
269
-
270
- ```typescript
271
- test("shows collaborator cursor", async ({ page }) => {
272
- await page.goto("/document/123");
273
-
274
- // Simulate another user's cursor position
275
- await page.evaluate(() => {
276
- const event = new MessageEvent("message", {
277
- data: JSON.stringify({
278
- type: "cursor",
279
- userId: "user-456",
280
- userName: "Alice",
281
- position: { x: 100, y: 200 },
282
- }),
283
- });
284
- (window as any).docSocket.dispatchEvent(event);
285
- });
286
-
287
- await expect(page.getByTestId("cursor-user-456")).toBeVisible();
288
- await expect(page.getByText("Alice")).toBeVisible();
289
- });
290
- ```
291
-
292
- ## Server-Sent Events
293
-
294
- ### Test SSE Updates
295
-
296
- ```typescript
297
- test("receives SSE updates", async ({ page }) => {
298
- // Mock SSE endpoint
299
- await page.route("**/api/events", (route) => {
300
- route.fulfill({
301
- status: 200,
302
- headers: {
303
- "Content-Type": "text/event-stream",
304
- "Cache-Control": "no-cache",
305
- Connection: "keep-alive",
306
- },
307
- body: `data: {"type":"update","value":42}\n\n`,
308
- });
309
- });
310
-
311
- await page.goto("/live-data");
312
-
313
- await expect(page.getByTestId("value")).toHaveText("42");
314
- });
315
- ```
316
-
317
- ### Simulate Multiple SSE Events
318
-
319
- ```typescript
320
- test("handles multiple SSE events", async ({ page }) => {
321
- await page.route("**/api/events", async (route) => {
322
- const encoder = new TextEncoder();
323
- const events = [
324
- `data: {"count":1}\n\n`,
325
- `data: {"count":2}\n\n`,
326
- `data: {"count":3}\n\n`,
327
- ];
328
-
329
- route.fulfill({
330
- status: 200,
331
- headers: { "Content-Type": "text/event-stream" },
332
- body: events.join(""),
333
- });
334
- });
335
-
336
- await page.goto("/counter");
337
-
338
- // Should receive all events
339
- await expect(page.getByTestId("count")).toHaveText("3");
340
- });
341
- ```
342
-
343
- ## Reconnection Testing
344
-
345
- ### Test Connection Loss
346
-
347
- ```typescript
348
- test("handles connection loss gracefully", async ({ page }) => {
349
- await page.goto("/chat");
350
-
351
- // Simulate connection close
352
- await page.evaluate(() => {
353
- (window as any).chatSocket.close();
354
- });
355
-
356
- // Should show disconnected state
357
- await expect(page.getByText("Reconnecting...")).toBeVisible();
358
- });
359
- ```
360
-
361
- ### Test Reconnection
362
-
363
- ```typescript
364
- test("reconnects after connection loss", async ({ page }) => {
365
- await page.goto("/chat");
366
-
367
- // Simulate disconnect
368
- await page.evaluate(() => {
369
- (window as any).chatSocket.close();
370
- });
371
-
372
- await expect(page.getByText("Reconnecting...")).toBeVisible();
373
-
374
- // Simulate reconnection
375
- await page.evaluate(() => {
376
- const event = new Event("open");
377
- (window as any).chatSocket = { readyState: 1 };
378
- (window as any).chatSocket.dispatchEvent?.(event);
379
- });
380
-
381
- // Force component to re-check connection
382
- await page.evaluate(() => {
383
- window.dispatchEvent(new Event("online"));
384
- });
385
-
386
- await expect(page.getByText("Connected")).toBeVisible();
387
- });
388
- ```
389
-
390
- ## Anti-Patterns to Avoid
391
-
392
- | Anti-Pattern | Problem | Solution |
393
- | ------------------------------------- | ----------------------------- | ---------------------------------- |
394
- | Not waiting for WebSocket ready | Messages sent too early | Wait for `readyState === 1` |
395
- | Testing against real WebSocket server | Flaky, timing-dependent | Mock WebSocket messages |
396
- | Ignoring connection state | Tests pass but feature broken | Test connected/disconnected states |
397
- | No cleanup of listeners | Memory leaks in tests | Clean up event listeners |
398
-
399
- ## Related References
400
-
401
- - **Network**: See [network-advanced.md](../advanced/network-advanced.md) for HTTP mocking patterns
402
- - **Assertions**: See [assertions-waiting.md](../core/assertions-waiting.md) for polling patterns
403
- - **Multi-User**: See [multi-user.md](../advanced/multi-user.md) for real-time collaboration testing with multiple users