@sylix/coworker 2.0.10 → 2.0.12

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 (178) hide show
  1. package/dist/commands/slash/config.d.ts.map +1 -1
  2. package/dist/commands/slash/config.js +23 -5
  3. package/dist/commands/slash/config.js.map +1 -1
  4. package/dist/commands/slash/todo.js +1 -1
  5. package/dist/commands/slash/todo.js.map +1 -1
  6. package/dist/core/CoWorkerAgent.d.ts.map +1 -1
  7. package/dist/core/CoWorkerAgent.js +6 -3
  8. package/dist/core/CoWorkerAgent.js.map +1 -1
  9. package/dist/permissions/PermissionInterceptor.js +1 -1
  10. package/dist/permissions/PermissionInterceptor.js.map +1 -1
  11. package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
  12. package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
  13. package/dist/skills/defaults/ai-ml/rag.md +276 -0
  14. package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
  15. package/dist/skills/defaults/backend-development/api-design.md +285 -0
  16. package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
  17. package/dist/skills/defaults/backend-development/async-python.md +237 -0
  18. package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
  19. package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
  20. package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
  21. package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
  22. package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
  23. package/dist/skills/defaults/backend-development/database-design.md +305 -0
  24. package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
  25. package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
  26. package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
  27. package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
  28. package/dist/skills/defaults/backend-development/fastapi.md +309 -0
  29. package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
  30. package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
  31. package/dist/skills/defaults/backend-development/microservices.md +284 -0
  32. package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
  33. package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
  34. package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
  35. package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
  36. package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
  37. package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
  38. package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
  39. package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
  40. package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
  41. package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
  42. package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
  43. package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
  44. package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
  45. package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
  46. package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
  47. package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
  48. package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
  49. package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
  50. package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
  51. package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
  52. package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
  53. package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
  54. package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
  55. package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
  56. package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
  57. package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
  58. package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
  59. package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
  60. package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
  61. package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
  62. package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
  63. package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
  64. package/dist/skills/defaults/data-engineering/airflow.md +519 -0
  65. package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
  66. package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
  67. package/dist/skills/defaults/data-engineering/dbt.md +556 -0
  68. package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
  69. package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
  70. package/dist/skills/defaults/data-engineering/spark.md +411 -0
  71. package/dist/skills/defaults/database/postgresql.md +202 -0
  72. package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
  73. package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
  74. package/dist/skills/defaults/devops/changelog-automation.md +580 -0
  75. package/dist/skills/defaults/devops/cicd.md +314 -0
  76. package/dist/skills/defaults/devops/cloud.md +263 -0
  77. package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
  78. package/dist/skills/defaults/devops/cost-optimization.md +295 -0
  79. package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
  80. package/dist/skills/defaults/devops/docker.md +281 -0
  81. package/dist/skills/defaults/devops/git-workflows.md +205 -0
  82. package/dist/skills/defaults/devops/github-actions.md +311 -0
  83. package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
  84. package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
  85. package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
  86. package/dist/skills/defaults/devops/kubernetes.md +339 -0
  87. package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
  88. package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
  89. package/dist/skills/defaults/devops/observability.md +243 -0
  90. package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
  91. package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
  92. package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
  93. package/dist/skills/defaults/devops/secrets-management.md +341 -0
  94. package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
  95. package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
  96. package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
  97. package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
  98. package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
  99. package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
  100. package/dist/skills/defaults/frontend/interaction-design.md +327 -0
  101. package/dist/skills/defaults/frontend/javascript.md +311 -0
  102. package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
  103. package/dist/skills/defaults/frontend/react-native-design.md +440 -0
  104. package/dist/skills/defaults/frontend/react.md +345 -0
  105. package/dist/skills/defaults/frontend/responsive-design.md +472 -0
  106. package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
  107. package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
  108. package/dist/skills/defaults/frontend/typescript.md +334 -0
  109. package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
  110. package/dist/skills/defaults/frontend/web-component-design.md +279 -0
  111. package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
  112. package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
  113. package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
  114. package/dist/skills/defaults/kubernetes/gitops.md +280 -0
  115. package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
  116. package/dist/skills/defaults/kubernetes/helm.md +343 -0
  117. package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
  118. package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
  119. package/dist/skills/defaults/kubernetes/manifests.md +330 -0
  120. package/dist/skills/defaults/kubernetes/security.md +337 -0
  121. package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
  122. package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
  123. package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
  124. package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
  125. package/dist/skills/defaults/llm-application/langchain.md +259 -0
  126. package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
  127. package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
  128. package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
  129. package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
  130. package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
  131. package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
  132. package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
  133. package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
  134. package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
  135. package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
  136. package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
  137. package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
  138. package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
  139. package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
  140. package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
  141. package/dist/skills/defaults/security/auditor.md +168 -0
  142. package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
  143. package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
  144. package/dist/skills/defaults/security/mtls-configuration.md +349 -0
  145. package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
  146. package/dist/skills/defaults/security/sast-configuration.md +182 -0
  147. package/dist/skills/defaults/security/security.md +313 -0
  148. package/dist/skills/defaults/security/stride-analysis.md +273 -0
  149. package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
  150. package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
  151. package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
  152. package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
  153. package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
  154. package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
  155. package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
  156. package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
  157. package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
  158. package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
  159. package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
  160. package/dist/skills/defaults/testing/testing.md +332 -0
  161. package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
  162. package/dist/skills/defaults/workflows/track-management.md +592 -0
  163. package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
  164. package/dist/skills/index.d.ts +11 -0
  165. package/dist/skills/index.d.ts.map +1 -0
  166. package/dist/skills/index.js +129 -0
  167. package/dist/skills/index.js.map +1 -0
  168. package/dist/utils/character.js +6 -9
  169. package/dist/utils/character.js.map +1 -1
  170. package/dist/utils/contextManager.js +3 -7
  171. package/dist/utils/contextManager.js.map +1 -1
  172. package/dist/utils/inputbar.d.ts.map +1 -1
  173. package/dist/utils/inputbar.js +8 -1
  174. package/dist/utils/inputbar.js.map +1 -1
  175. package/dist/utils/output.d.ts.map +1 -1
  176. package/dist/utils/output.js +3 -35
  177. package/dist/utils/output.js.map +1 -1
  178. package/package.json +1 -1
@@ -0,0 +1,544 @@
1
+ ---
2
+ name: e2e-testing-patterns
3
+ description: Master end-to-end testing with Playwright and Cypress to build reliable test suites that catch bugs, improve confidence, and enable fast deployment. Use when implementing E2E tests, debugging flaky tests, or establishing testing standards.
4
+ ---
5
+
6
+ # E2E Testing Patterns
7
+
8
+ Build reliable, fast, and maintainable end-to-end test suites that provide confidence to ship code quickly and catch regressions before users do.
9
+
10
+ ## When to Use This Skill
11
+
12
+ - Implementing end-to-end test automation
13
+ - Debugging flaky or unreliable tests
14
+ - Testing critical user workflows
15
+ - Setting up CI/CD test pipelines
16
+ - Testing across multiple browsers
17
+ - Validating accessibility requirements
18
+ - Testing responsive designs
19
+ - Establishing E2E testing standards
20
+
21
+ ## Core Concepts
22
+
23
+ ### 1. E2E Testing Fundamentals
24
+
25
+ **What to Test with E2E:**
26
+
27
+ - Critical user journeys (login, checkout, signup)
28
+ - Complex interactions (drag-and-drop, multi-step forms)
29
+ - Cross-browser compatibility
30
+ - Real API integration
31
+ - Authentication flows
32
+
33
+ **What NOT to Test with E2E:**
34
+
35
+ - Unit-level logic (use unit tests)
36
+ - API contracts (use integration tests)
37
+ - Edge cases (too slow)
38
+ - Internal implementation details
39
+
40
+ ### 2. Test Philosophy
41
+
42
+ **The Testing Pyramid:**
43
+
44
+ ```
45
+ /\
46
+ /E2E\ ← Few, focused on critical paths
47
+ /─────\
48
+ /Integr\ ← More, test component interactions
49
+ /────────\
50
+ /Unit Tests\ ← Many, fast, isolated
51
+ /────────────\
52
+ ```
53
+
54
+ **Best Practices:**
55
+
56
+ - Test user behavior, not implementation
57
+ - Keep tests independent
58
+ - Make tests deterministic
59
+ - Optimize for speed
60
+ - Use data-testid, not CSS selectors
61
+
62
+ ## Playwright Patterns
63
+
64
+ ### Setup and Configuration
65
+
66
+ ```typescript
67
+ // playwright.config.ts
68
+ import { defineConfig, devices } from "@playwright/test";
69
+
70
+ export default defineConfig({
71
+ testDir: "./e2e",
72
+ timeout: 30000,
73
+ expect: {
74
+ timeout: 5000,
75
+ },
76
+ fullyParallel: true,
77
+ forbidOnly: !!process.env.CI,
78
+ retries: process.env.CI ? 2 : 0,
79
+ workers: process.env.CI ? 1 : undefined,
80
+ reporter: [["html"], ["junit", { outputFile: "results.xml" }]],
81
+ use: {
82
+ baseURL: "http://localhost:3000",
83
+ trace: "on-first-retry",
84
+ screenshot: "only-on-failure",
85
+ video: "retain-on-failure",
86
+ },
87
+ projects: [
88
+ { name: "chromium", use: { ...devices["Desktop Chrome"] } },
89
+ { name: "firefox", use: { ...devices["Desktop Firefox"] } },
90
+ { name: "webkit", use: { ...devices["Desktop Safari"] } },
91
+ { name: "mobile", use: { ...devices["iPhone 13"] } },
92
+ ],
93
+ });
94
+ ```
95
+
96
+ ### Pattern 1: Page Object Model
97
+
98
+ ```typescript
99
+ // pages/LoginPage.ts
100
+ import { Page, Locator } from "@playwright/test";
101
+
102
+ export class LoginPage {
103
+ readonly page: Page;
104
+ readonly emailInput: Locator;
105
+ readonly passwordInput: Locator;
106
+ readonly loginButton: Locator;
107
+ readonly errorMessage: Locator;
108
+
109
+ constructor(page: Page) {
110
+ this.page = page;
111
+ this.emailInput = page.getByLabel("Email");
112
+ this.passwordInput = page.getByLabel("Password");
113
+ this.loginButton = page.getByRole("button", { name: "Login" });
114
+ this.errorMessage = page.getByRole("alert");
115
+ }
116
+
117
+ async goto() {
118
+ await this.page.goto("/login");
119
+ }
120
+
121
+ async login(email: string, password: string) {
122
+ await this.emailInput.fill(email);
123
+ await this.passwordInput.fill(password);
124
+ await this.loginButton.click();
125
+ }
126
+
127
+ async getErrorMessage(): Promise<string> {
128
+ return (await this.errorMessage.textContent()) ?? "";
129
+ }
130
+ }
131
+
132
+ // Test using Page Object
133
+ import { test, expect } from "@playwright/test";
134
+ import { LoginPage } from "./pages/LoginPage";
135
+
136
+ test("successful login", async ({ page }) => {
137
+ const loginPage = new LoginPage(page);
138
+ await loginPage.goto();
139
+ await loginPage.login("user@example.com", "password123");
140
+
141
+ await expect(page).toHaveURL("/dashboard");
142
+ await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible();
143
+ });
144
+
145
+ test("failed login shows error", async ({ page }) => {
146
+ const loginPage = new LoginPage(page);
147
+ await loginPage.goto();
148
+ await loginPage.login("invalid@example.com", "wrong");
149
+
150
+ const error = await loginPage.getErrorMessage();
151
+ expect(error).toContain("Invalid credentials");
152
+ });
153
+ ```
154
+
155
+ ### Pattern 2: Fixtures for Test Data
156
+
157
+ ```typescript
158
+ // fixtures/test-data.ts
159
+ import { test as base } from "@playwright/test";
160
+
161
+ type TestData = {
162
+ testUser: {
163
+ email: string;
164
+ password: string;
165
+ name: string;
166
+ };
167
+ adminUser: {
168
+ email: string;
169
+ password: string;
170
+ };
171
+ };
172
+
173
+ export const test = base.extend<TestData>({
174
+ testUser: async ({}, use) => {
175
+ const user = {
176
+ email: `test-${Date.now()}@example.com`,
177
+ password: "Test123!@#",
178
+ name: "Test User",
179
+ };
180
+ // Setup: Create user in database
181
+ await createTestUser(user);
182
+ await use(user);
183
+ // Teardown: Clean up user
184
+ await deleteTestUser(user.email);
185
+ },
186
+
187
+ adminUser: async ({}, use) => {
188
+ await use({
189
+ email: "admin@example.com",
190
+ password: process.env.ADMIN_PASSWORD!,
191
+ });
192
+ },
193
+ });
194
+
195
+ // Usage in tests
196
+ import { test } from "./fixtures/test-data";
197
+
198
+ test("user can update profile", async ({ page, testUser }) => {
199
+ await page.goto("/login");
200
+ await page.getByLabel("Email").fill(testUser.email);
201
+ await page.getByLabel("Password").fill(testUser.password);
202
+ await page.getByRole("button", { name: "Login" }).click();
203
+
204
+ await page.goto("/profile");
205
+ await page.getByLabel("Name").fill("Updated Name");
206
+ await page.getByRole("button", { name: "Save" }).click();
207
+
208
+ await expect(page.getByText("Profile updated")).toBeVisible();
209
+ });
210
+ ```
211
+
212
+ ### Pattern 3: Waiting Strategies
213
+
214
+ ```typescript
215
+ // ❌ Bad: Fixed timeouts
216
+ await page.waitForTimeout(3000); // Flaky!
217
+
218
+ // ✅ Good: Wait for specific conditions
219
+ await page.waitForLoadState("networkidle");
220
+ await page.waitForURL("/dashboard");
221
+ await page.waitForSelector('[data-testid="user-profile"]');
222
+
223
+ // ✅ Better: Auto-waiting with assertions
224
+ await expect(page.getByText("Welcome")).toBeVisible();
225
+ await expect(page.getByRole("button", { name: "Submit" })).toBeEnabled();
226
+
227
+ // Wait for API response
228
+ const responsePromise = page.waitForResponse(
229
+ (response) =>
230
+ response.url().includes("/api/users") && response.status() === 200,
231
+ );
232
+ await page.getByRole("button", { name: "Load Users" }).click();
233
+ const response = await responsePromise;
234
+ const data = await response.json();
235
+ expect(data.users).toHaveLength(10);
236
+
237
+ // Wait for multiple conditions
238
+ await Promise.all([
239
+ page.waitForURL("/success"),
240
+ page.waitForLoadState("networkidle"),
241
+ expect(page.getByText("Payment successful")).toBeVisible(),
242
+ ]);
243
+ ```
244
+
245
+ ### Pattern 4: Network Mocking and Interception
246
+
247
+ ```typescript
248
+ // Mock API responses
249
+ test("displays error when API fails", async ({ page }) => {
250
+ await page.route("**/api/users", (route) => {
251
+ route.fulfill({
252
+ status: 500,
253
+ contentType: "application/json",
254
+ body: JSON.stringify({ error: "Internal Server Error" }),
255
+ });
256
+ });
257
+
258
+ await page.goto("/users");
259
+ await expect(page.getByText("Failed to load users")).toBeVisible();
260
+ });
261
+
262
+ // Intercept and modify requests
263
+ test("can modify API request", async ({ page }) => {
264
+ await page.route("**/api/users", async (route) => {
265
+ const request = route.request();
266
+ const postData = JSON.parse(request.postData() || "{}");
267
+
268
+ // Modify request
269
+ postData.role = "admin";
270
+
271
+ await route.continue({
272
+ postData: JSON.stringify(postData),
273
+ });
274
+ });
275
+
276
+ // Test continues...
277
+ });
278
+
279
+ // Mock third-party services
280
+ test("payment flow with mocked Stripe", async ({ page }) => {
281
+ await page.route("**/api/stripe/**", (route) => {
282
+ route.fulfill({
283
+ status: 200,
284
+ body: JSON.stringify({
285
+ id: "mock_payment_id",
286
+ status: "succeeded",
287
+ }),
288
+ });
289
+ });
290
+
291
+ // Test payment flow with mocked response
292
+ });
293
+ ```
294
+
295
+ ## Cypress Patterns
296
+
297
+ ### Setup and Configuration
298
+
299
+ ```typescript
300
+ // cypress.config.ts
301
+ import { defineConfig } from "cypress";
302
+
303
+ export default defineConfig({
304
+ e2e: {
305
+ baseUrl: "http://localhost:3000",
306
+ viewportWidth: 1280,
307
+ viewportHeight: 720,
308
+ video: false,
309
+ screenshotOnRunFailure: true,
310
+ defaultCommandTimeout: 10000,
311
+ requestTimeout: 10000,
312
+ setupNodeEvents(on, config) {
313
+ // Implement node event listeners
314
+ },
315
+ },
316
+ });
317
+ ```
318
+
319
+ ### Pattern 1: Custom Commands
320
+
321
+ ```typescript
322
+ // cypress/support/commands.ts
323
+ declare global {
324
+ namespace Cypress {
325
+ interface Chainable {
326
+ login(email: string, password: string): Chainable<void>;
327
+ createUser(userData: UserData): Chainable<User>;
328
+ dataCy(value: string): Chainable<JQuery<HTMLElement>>;
329
+ }
330
+ }
331
+ }
332
+
333
+ Cypress.Commands.add("login", (email: string, password: string) => {
334
+ cy.visit("/login");
335
+ cy.get('[data-testid="email"]').type(email);
336
+ cy.get('[data-testid="password"]').type(password);
337
+ cy.get('[data-testid="login-button"]').click();
338
+ cy.url().should("include", "/dashboard");
339
+ });
340
+
341
+ Cypress.Commands.add("createUser", (userData: UserData) => {
342
+ return cy.request("POST", "/api/users", userData).its("body");
343
+ });
344
+
345
+ Cypress.Commands.add("dataCy", (value: string) => {
346
+ return cy.get(`[data-cy="${value}"]`);
347
+ });
348
+
349
+ // Usage
350
+ cy.login("user@example.com", "password");
351
+ cy.dataCy("submit-button").click();
352
+ ```
353
+
354
+ ### Pattern 2: Cypress Intercept
355
+
356
+ ```typescript
357
+ // Mock API calls
358
+ cy.intercept("GET", "/api/users", {
359
+ statusCode: 200,
360
+ body: [
361
+ { id: 1, name: "John" },
362
+ { id: 2, name: "Jane" },
363
+ ],
364
+ }).as("getUsers");
365
+
366
+ cy.visit("/users");
367
+ cy.wait("@getUsers");
368
+ cy.get('[data-testid="user-list"]').children().should("have.length", 2);
369
+
370
+ // Modify responses
371
+ cy.intercept("GET", "/api/users", (req) => {
372
+ req.reply((res) => {
373
+ // Modify response
374
+ res.body.users = res.body.users.slice(0, 5);
375
+ res.send();
376
+ });
377
+ });
378
+
379
+ // Simulate slow network
380
+ cy.intercept("GET", "/api/data", (req) => {
381
+ req.reply((res) => {
382
+ res.delay(3000); // 3 second delay
383
+ res.send();
384
+ });
385
+ });
386
+ ```
387
+
388
+ ## Advanced Patterns
389
+
390
+ ### Pattern 1: Visual Regression Testing
391
+
392
+ ```typescript
393
+ // With Playwright
394
+ import { test, expect } from "@playwright/test";
395
+
396
+ test("homepage looks correct", async ({ page }) => {
397
+ await page.goto("/");
398
+ await expect(page).toHaveScreenshot("homepage.png", {
399
+ fullPage: true,
400
+ maxDiffPixels: 100,
401
+ });
402
+ });
403
+
404
+ test("button in all states", async ({ page }) => {
405
+ await page.goto("/components");
406
+
407
+ const button = page.getByRole("button", { name: "Submit" });
408
+
409
+ // Default state
410
+ await expect(button).toHaveScreenshot("button-default.png");
411
+
412
+ // Hover state
413
+ await button.hover();
414
+ await expect(button).toHaveScreenshot("button-hover.png");
415
+
416
+ // Disabled state
417
+ await button.evaluate((el) => el.setAttribute("disabled", "true"));
418
+ await expect(button).toHaveScreenshot("button-disabled.png");
419
+ });
420
+ ```
421
+
422
+ ### Pattern 2: Parallel Testing with Sharding
423
+
424
+ ```typescript
425
+ // playwright.config.ts
426
+ export default defineConfig({
427
+ projects: [
428
+ {
429
+ name: "shard-1",
430
+ use: { ...devices["Desktop Chrome"] },
431
+ grepInvert: /@slow/,
432
+ shard: { current: 1, total: 4 },
433
+ },
434
+ {
435
+ name: "shard-2",
436
+ use: { ...devices["Desktop Chrome"] },
437
+ shard: { current: 2, total: 4 },
438
+ },
439
+ // ... more shards
440
+ ],
441
+ });
442
+
443
+ // Run in CI
444
+ // npx playwright test --shard=1/4
445
+ // npx playwright test --shard=2/4
446
+ ```
447
+
448
+ ### Pattern 3: Accessibility Testing
449
+
450
+ ```typescript
451
+ // Install: npm install @axe-core/playwright
452
+ import { test, expect } from "@playwright/test";
453
+ import AxeBuilder from "@axe-core/playwright";
454
+
455
+ test("page should not have accessibility violations", async ({ page }) => {
456
+ await page.goto("/");
457
+
458
+ const accessibilityScanResults = await new AxeBuilder({ page })
459
+ .exclude("#third-party-widget")
460
+ .analyze();
461
+
462
+ expect(accessibilityScanResults.violations).toEqual([]);
463
+ });
464
+
465
+ test("form is accessible", async ({ page }) => {
466
+ await page.goto("/signup");
467
+
468
+ const results = await new AxeBuilder({ page }).include("form").analyze();
469
+
470
+ expect(results.violations).toEqual([]);
471
+ });
472
+ ```
473
+
474
+ ## Best Practices
475
+
476
+ 1. **Use Data Attributes**: `data-testid` or `data-cy` for stable selectors
477
+ 2. **Avoid Brittle Selectors**: Don't rely on CSS classes or DOM structure
478
+ 3. **Test User Behavior**: Click, type, see - not implementation details
479
+ 4. **Keep Tests Independent**: Each test should run in isolation
480
+ 5. **Clean Up Test Data**: Create and destroy test data in each test
481
+ 6. **Use Page Objects**: Encapsulate page logic
482
+ 7. **Meaningful Assertions**: Check actual user-visible behavior
483
+ 8. **Optimize for Speed**: Mock when possible, parallel execution
484
+
485
+ ```typescript
486
+ // ❌ Bad selectors
487
+ cy.get(".btn.btn-primary.submit-button").click();
488
+ cy.get("div > form > div:nth-child(2) > input").type("text");
489
+
490
+ // ✅ Good selectors
491
+ cy.getByRole("button", { name: "Submit" }).click();
492
+ cy.getByLabel("Email address").type("user@example.com");
493
+ cy.get('[data-testid="email-input"]').type("user@example.com");
494
+ ```
495
+
496
+ ## Common Pitfalls
497
+
498
+ - **Flaky Tests**: Use proper waits, not fixed timeouts
499
+ - **Slow Tests**: Mock external APIs, use parallel execution
500
+ - **Over-Testing**: Don't test every edge case with E2E
501
+ - **Coupled Tests**: Tests should not depend on each other
502
+ - **Poor Selectors**: Avoid CSS classes and nth-child
503
+ - **No Cleanup**: Clean up test data after each test
504
+ - **Testing Implementation**: Test user behavior, not internals
505
+
506
+ ## Debugging Failing Tests
507
+
508
+ ```typescript
509
+ // Playwright debugging
510
+ // 1. Run in headed mode
511
+ npx playwright test --headed
512
+
513
+ // 2. Run in debug mode
514
+ npx playwright test --debug
515
+
516
+ // 3. Use trace viewer
517
+ await page.screenshot({ path: 'screenshot.png' });
518
+ await page.video()?.saveAs('video.webm');
519
+
520
+ // 4. Add test.step for better reporting
521
+ test('checkout flow', async ({ page }) => {
522
+ await test.step('Add item to cart', async () => {
523
+ await page.goto('/products');
524
+ await page.getByRole('button', { name: 'Add to Cart' }).click();
525
+ });
526
+
527
+ await test.step('Proceed to checkout', async () => {
528
+ await page.goto('/cart');
529
+ await page.getByRole('button', { name: 'Checkout' }).click();
530
+ });
531
+ });
532
+
533
+ // 5. Inspect page state
534
+ await page.pause(); // Pauses execution, opens inspector
535
+ ```
536
+
537
+ ## Resources
538
+
539
+ - **references/playwright-best-practices.md**: Playwright-specific patterns
540
+ - **references/cypress-best-practices.md**: Cypress-specific patterns
541
+ - **references/flaky-test-debugging.md**: Debugging unreliable tests
542
+ - **assets/e2e-testing-checklist.md**: What to test with E2E
543
+ - **assets/selector-strategies.md**: Finding reliable selectors
544
+ - **scripts/test-analyzer.ts**: Analyze test flakiness and duration