testeiya 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/PIPELINES.md +3 -0
  2. package/README.md +10 -20
  3. package/dist/prompt/clis.d.ts +7 -0
  4. package/dist/prompt/pipeline-report.d.ts +1 -0
  5. package/dist/prompt/report.d.ts +10 -0
  6. package/dist/prompt/system-prompt.d.ts +22 -0
  7. package/dist/prompt/system-prompt.js +1 -1
  8. package/dist/prompt/system-prompt.js.map +1 -1
  9. package/dist/prompt/testomat.io.d.ts +19 -0
  10. package/dist/prompt/thread.d.ts +73 -0
  11. package/dist/src/args.d.ts +39 -0
  12. package/dist/src/attribution-extension.d.ts +3 -0
  13. package/dist/src/checkpoint.d.ts +30 -0
  14. package/dist/src/cli.d.ts +2 -0
  15. package/dist/src/cli.js +27 -32
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/doctor.d.ts +11 -0
  18. package/dist/src/env.d.ts +30 -0
  19. package/dist/src/exec.d.ts +11 -0
  20. package/dist/src/git.d.ts +41 -0
  21. package/dist/src/git.js +10 -0
  22. package/dist/src/git.js.map +1 -1
  23. package/dist/src/langfuse-extension.d.ts +7 -0
  24. package/dist/src/langfuse.d.ts +67 -0
  25. package/dist/src/mcp.d.ts +19 -0
  26. package/dist/src/model.d.ts +20 -0
  27. package/dist/src/model.js +2 -0
  28. package/dist/src/model.js.map +1 -1
  29. package/dist/src/models.d.ts +1 -0
  30. package/dist/src/output.d.ts +84 -0
  31. package/dist/src/pipeline/command-stage.d.ts +12 -0
  32. package/dist/src/pipeline/crash-guard.d.ts +12 -0
  33. package/dist/src/pipeline/crash-guard.js +21 -0
  34. package/dist/src/pipeline/crash-guard.js.map +1 -0
  35. package/dist/src/pipeline/diagram.d.ts +24 -0
  36. package/dist/src/pipeline/gate.d.ts +21 -0
  37. package/dist/src/pipeline/launcher.d.ts +33 -0
  38. package/dist/src/pipeline/launcher.js +16 -3
  39. package/dist/src/pipeline/launcher.js.map +1 -1
  40. package/dist/src/pipeline/log.d.ts +29 -0
  41. package/dist/src/pipeline/log.js +9 -0
  42. package/dist/src/pipeline/log.js.map +1 -1
  43. package/dist/src/pipeline/overlay.d.ts +29 -0
  44. package/dist/src/pipeline/pipeline-file.d.ts +44 -0
  45. package/dist/src/pipeline/pipeline-file.js +16 -8
  46. package/dist/src/pipeline/pipeline-file.js.map +1 -1
  47. package/dist/src/pipeline/pipeline.d.ts +78 -0
  48. package/dist/src/pipeline/pipeline.js +33 -7
  49. package/dist/src/pipeline/pipeline.js.map +1 -1
  50. package/dist/src/pipeline/report.d.ts +26 -0
  51. package/dist/src/pipeline/report.js +13 -0
  52. package/dist/src/pipeline/report.js.map +1 -1
  53. package/dist/src/pipeline/spec.d.ts +63 -0
  54. package/dist/src/pipeline/stage-env.d.ts +13 -0
  55. package/dist/src/pipeline/stage-env.js +31 -0
  56. package/dist/src/pipeline/stage-env.js.map +1 -0
  57. package/dist/src/pipeline/stage.d.ts +71 -0
  58. package/dist/src/pipeline/stage.js.map +1 -1
  59. package/dist/src/pipeline/state.d.ts +63 -0
  60. package/dist/src/pipeline/summary-stage.d.ts +24 -0
  61. package/dist/src/pipeline/task-stage.d.ts +24 -0
  62. package/dist/src/pipeline/task-stage.js +86 -2
  63. package/dist/src/pipeline/task-stage.js.map +1 -1
  64. package/dist/src/pipeline/variables.d.ts +20 -0
  65. package/dist/src/result.d.ts +6 -0
  66. package/dist/src/run.d.ts +69 -0
  67. package/dist/src/run.js +116 -60
  68. package/dist/src/run.js.map +1 -1
  69. package/dist/src/session.d.ts +43 -0
  70. package/dist/src/session.js +3 -1
  71. package/dist/src/session.js.map +1 -1
  72. package/dist/src/sessions.d.ts +23 -0
  73. package/dist/src/skills.d.ts +29 -0
  74. package/package.json +11 -2
  75. package/pipelines/api-testing.yml +16 -5
  76. package/pipelines/issue-test-cases.yml +3 -4
  77. package/pipelines/pr-review.yml +14 -5
  78. package/pipelines/regression.yml +1 -0
  79. package/pipelines/web-testing.yml +1 -0
  80. package/prompt/system-prompt.ts +1 -1
  81. package/scripts/vendor-skills.js +62 -0
  82. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -119
  83. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -141
  84. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -100
  85. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -196
  86. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -83
  87. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -126
  88. package/skills/codeceptjs/lint-codeceptjs-tests/SKILL.md +0 -104
  89. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -109
  90. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -295
  91. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -339
  92. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -459
  93. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -338
  94. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -78
  95. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -102
  96. package/skills/playwright/playwright-best-practices/SKILL.md +0 -303
  97. package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +0 -360
  98. package/skills/playwright/playwright-best-practices/advanced/authentication.md +0 -871
  99. package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +0 -364
  100. package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +0 -409
  101. package/skills/playwright/playwright-best-practices/advanced/multi-context.md +0 -288
  102. package/skills/playwright/playwright-best-practices/advanced/multi-user.md +0 -393
  103. package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +0 -452
  104. package/skills/playwright/playwright-best-practices/advanced/third-party.md +0 -464
  105. package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  106. package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +0 -369
  107. package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +0 -383
  108. package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  109. package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +0 -403
  110. package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +0 -504
  111. package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +0 -403
  112. package/skills/playwright/playwright-best-practices/core/annotations.md +0 -424
  113. package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +0 -361
  114. package/skills/playwright/playwright-best-practices/core/configuration.md +0 -452
  115. package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +0 -417
  116. package/skills/playwright/playwright-best-practices/core/global-setup.md +0 -434
  117. package/skills/playwright/playwright-best-practices/core/locators.md +0 -242
  118. package/skills/playwright/playwright-best-practices/core/page-object-model.md +0 -315
  119. package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +0 -453
  120. package/skills/playwright/playwright-best-practices/core/test-data.md +0 -492
  121. package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +0 -361
  122. package/skills/playwright/playwright-best-practices/core/test-tags.md +0 -298
  123. package/skills/playwright/playwright-best-practices/debugging/console-errors.md +0 -420
  124. package/skills/playwright/playwright-best-practices/debugging/debugging.md +0 -504
  125. package/skills/playwright/playwright-best-practices/debugging/error-testing.md +0 -360
  126. package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +0 -496
  127. package/skills/playwright/playwright-best-practices/frameworks/angular.md +0 -530
  128. package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +0 -469
  129. package/skills/playwright/playwright-best-practices/frameworks/react.md +0 -531
  130. package/skills/playwright/playwright-best-practices/frameworks/vue.md +0 -574
  131. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  132. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  133. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  134. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  135. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  136. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  137. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  138. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  139. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  140. package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  141. package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  142. package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  143. package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  144. package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  145. package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  146. package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +0 -509
  147. package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  148. package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  149. package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  150. package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  151. package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +0 -508
  152. package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  153. package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  154. package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  155. package/skills/playwright/playwright-cli/SKILL.md +0 -489
  156. package/skills/playwright/playwright-cli/references/element-attributes.md +0 -23
  157. package/skills/playwright/playwright-cli/references/playwright-tests.md +0 -39
  158. package/skills/playwright/playwright-cli/references/pr-attachments.md +0 -60
  159. package/skills/playwright/playwright-cli/references/request-mocking.md +0 -87
  160. package/skills/playwright/playwright-cli/references/running-code.md +0 -245
  161. package/skills/playwright/playwright-cli/references/session-management.md +0 -227
  162. package/skills/playwright/playwright-cli/references/storage-state.md +0 -275
  163. package/skills/playwright/playwright-cli/references/test-generation.md +0 -433
  164. package/skills/playwright/playwright-cli/references/tracing.md +0 -139
  165. package/skills/playwright/playwright-cli/references/video-recording.md +0 -216
  166. package/skills/skills.lock.json +0 -89
  167. package/skills/skills.yaml +0 -35
  168. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/SKILL.md +0 -0
  169. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/references/no-install.md +0 -0
  170. /package/skills/{testomatio/explorbot → explorbot}/explorbot-plan/SKILL.md +0 -0
  171. /package/skills/{testomatio/explorbot → explorbot}/explorbot-setup/SKILL.md +0 -0
  172. /package/skills/{testomatio/explorbot → explorbot}/prima/SKILL.md +0 -0
  173. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/SKILL.md +0 -0
  174. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/references/output-format.md +0 -0
  175. /package/skills/{testomatio/qa-process → qa-process}/qa-review-pr/SKILL.md +0 -0
  176. /package/skills/{testomatio/qa-process → qa-process}/testing-workflow/SKILL.md +0 -0
  177. /package/skills/{testomatio/requirements → requirements}/catalog-features/SKILL.md +0 -0
  178. /package/skills/{testomatio/requirements → requirements}/catalog-features/references/layout.md +0 -0
  179. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/SKILL.md +0 -0
  180. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/features.md +0 -0
  181. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/layout.md +0 -0
  182. /package/skills/{testomatio/requirements → requirements}/pull-request-diff-analyzer/SKILL.md +0 -0
  183. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/SKILL.md +0 -0
  184. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/answer-shapes.md +0 -0
  185. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/examples.md +0 -0
  186. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/SKILL.md +0 -0
  187. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/references/summary-example.md +0 -0
  188. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/SKILL.md +0 -0
  189. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -0
  190. /package/skills/{testomatio/requirements → requirements}/qa-thinking/SKILL.md +0 -0
  191. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/SKILL.md +0 -0
  192. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/behaviors.md +0 -0
  193. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/layout.md +0 -0
  194. /package/skills/{testomatio/requirements → requirements}/write-user-story/SKILL.md +0 -0
  195. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/CLAUDE.md +0 -0
  196. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/SKILL.md +0 -0
  197. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -0
  198. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -0
  199. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -0
  200. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -0
  201. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -0
  202. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/SKILL.md +0 -0
  203. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -0
  204. /package/skills/{testomatio/test-automation → test-automation}/epic-requirements-specification/SKILL.md +0 -0
  205. /package/skills/{testomatio/test-automation → test-automation}/qa-automation-test-consolidation/SKILL.md +0 -0
  206. /package/skills/{testomatio/test-automation → test-automation}/qa-data-seeder/SKILL.md +0 -0
  207. /package/skills/{testomatio/test-automation → test-automation}/run-tests-with-testomatio-reporter/SKILL.md +0 -0
  208. /package/skills/{testomatio/test-automation → test-automation}/setup-change-aware-pr-testing/SKILL.md +0 -0
  209. /package/skills/{testomatio/test-automation → test-automation}/setup-ci-automation/SKILL.md +0 -0
  210. /package/skills/{testomatio/test-automation → test-automation}/testomat-allure-adapter/SKILL.md +0 -0
  211. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/SKILL.md +0 -0
  212. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -0
  213. /package/skills/{testomatio/test-management → test-management}/detect-useless-tests/SKILL.md +0 -0
  214. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/SKILL.md +0 -0
  215. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -0
  216. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/SKILL.md +0 -0
  217. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CSV_MIGRATION.md +0 -0
  218. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +0 -0
  219. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTMO_MIGRATION.md +0 -0
  220. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +0 -0
  221. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/XRAY_MIGRATION.md +0 -0
  222. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/SKILL.md +0 -0
  223. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -0
  224. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -0
  225. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -0
  226. /package/skills/{testomatio/test-management → test-management}/qa-split-testing-levels-pyramid/SKILL.md +0 -0
  227. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/SKILL.md +0 -0
  228. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +0 -0
  229. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/SKILL.md +0 -0
  230. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -0
  231. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -0
  232. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/scripts/check-coverage.mjs +0 -0
  233. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/SKILL.md +0 -0
  234. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/test-case-format.md +0 -0
  235. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/testomat-tms-guide.md +0 -0
  236. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/writing-rule.md +0 -0
  237. /package/skills/{testomatio/test-management → test-management}/scan-automation-project/SKILL.md +0 -0
  238. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/SKILL.md +0 -0
  239. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -0
  240. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/SKILL.md +0 -0
  241. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/references/MCP_SETUP.md +0 -0
@@ -1,377 +0,0 @@
1
- # File Upload & Download Testing
2
-
3
- > For advanced patterns (progress tracking, cancellation, retry logic), see [file-upload-download.md](./file-upload-download.md)
4
-
5
- ## Table of Contents
6
-
7
- 1. [File Downloads](#file-downloads)
8
- 2. [File Uploads](#file-uploads)
9
- 3. [Drag and Drop](#drag-and-drop)
10
- 4. [File Content Verification](#file-content-verification)
11
-
12
- ## File Downloads
13
-
14
- ### Basic Download
15
-
16
- ```typescript
17
- test("download PDF report", async ({ page }) => {
18
- await page.goto("/reports");
19
-
20
- // Start waiting for download before clicking
21
- const downloadPromise = page.waitForEvent("download");
22
- await page.getByRole("button", { name: "Download PDF" }).click();
23
- const download = await downloadPromise;
24
-
25
- // Verify filename
26
- expect(download.suggestedFilename()).toBe("report.pdf");
27
-
28
- // Save to specific path
29
- await download.saveAs("./downloads/report.pdf");
30
- });
31
- ```
32
-
33
- ### Download with Custom Path
34
-
35
- ```typescript
36
- test("download to temp directory", async ({ page }, testInfo) => {
37
- await page.goto("/exports");
38
-
39
- const downloadPromise = page.waitForEvent("download");
40
- await page.getByRole("link", { name: "Export CSV" }).click();
41
- const download = await downloadPromise;
42
-
43
- // Save to test output directory
44
- const path = testInfo.outputPath(download.suggestedFilename());
45
- await download.saveAs(path);
46
-
47
- // Attach to test report
48
- await testInfo.attach("downloaded-file", { path });
49
- });
50
- ```
51
-
52
- ### Verify Download Content
53
-
54
- ```typescript
55
- import fs from "fs";
56
- import path from "path";
57
-
58
- test("verify CSV content", async ({ page }, testInfo) => {
59
- await page.goto("/data");
60
-
61
- const downloadPromise = page.waitForEvent("download");
62
- await page.getByRole("button", { name: "Export" }).click();
63
- const download = await downloadPromise;
64
-
65
- const filePath = testInfo.outputPath("export.csv");
66
- await download.saveAs(filePath);
67
-
68
- // Read and verify content
69
- const content = fs.readFileSync(filePath, "utf-8");
70
- expect(content).toContain("Name,Email,Status");
71
- expect(content).toContain("John Doe");
72
-
73
- // Verify row count
74
- const rows = content.trim().split("\n");
75
- expect(rows.length).toBeGreaterThan(1);
76
- });
77
- ```
78
-
79
- ### Multiple Downloads
80
-
81
- ```typescript
82
- test("download multiple files", async ({ page }) => {
83
- await page.goto("/batch-export");
84
-
85
- await page.getByRole("checkbox", { name: "Select All" }).check();
86
-
87
- // Collect all downloads
88
- const downloads: Download[] = [];
89
- page.on("download", (download) => downloads.push(download));
90
-
91
- await page.getByRole("button", { name: "Download Selected" }).click();
92
-
93
- // Wait for all downloads
94
- await expect.poll(() => downloads.length, { timeout: 30000 }).toBe(5);
95
-
96
- // Verify each download
97
- for (const download of downloads) {
98
- expect(download.suggestedFilename()).toMatch(/\.pdf$/);
99
- }
100
- });
101
- ```
102
-
103
- ### Download Fixture
104
-
105
- ```typescript
106
- // fixtures/download.fixture.ts
107
- import { test as base, Download } from "@playwright/test";
108
- import fs from "fs";
109
- import path from "path";
110
-
111
- type DownloadFixtures = {
112
- downloadDir: string;
113
- downloadAndVerify: (
114
- trigger: () => Promise<void>,
115
- expectedFilename: string,
116
- ) => Promise<string>;
117
- };
118
-
119
- export const test = base.extend<DownloadFixtures>({
120
- downloadDir: async ({}, use, testInfo) => {
121
- const dir = testInfo.outputPath("downloads");
122
- fs.mkdirSync(dir, { recursive: true });
123
- await use(dir);
124
- },
125
-
126
- downloadAndVerify: async ({ page, downloadDir }, use) => {
127
- await use(async (trigger, expectedFilename) => {
128
- const downloadPromise = page.waitForEvent("download");
129
- await trigger();
130
- const download = await downloadPromise;
131
-
132
- expect(download.suggestedFilename()).toBe(expectedFilename);
133
-
134
- const filePath = path.join(downloadDir, expectedFilename);
135
- await download.saveAs(filePath);
136
- return filePath;
137
- });
138
- },
139
- });
140
- ```
141
-
142
- ## File Uploads
143
-
144
- ### Basic Upload
145
-
146
- ```typescript
147
- test("upload profile picture", async ({ page }) => {
148
- await page.goto("/settings/profile");
149
-
150
- // Upload file
151
- await page
152
- .getByLabel("Profile Picture")
153
- .setInputFiles("./fixtures/avatar.png");
154
-
155
- // Verify preview
156
- await expect(page.getByAltText("Profile preview")).toBeVisible();
157
-
158
- await page.getByRole("button", { name: "Save" }).click();
159
- await expect(page.getByText("Profile updated")).toBeVisible();
160
- });
161
- ```
162
-
163
- ### Multiple File Upload
164
-
165
- ```typescript
166
- test("upload multiple documents", async ({ page }) => {
167
- await page.goto("/documents/upload");
168
-
169
- await page
170
- .getByLabel("Documents")
171
- .setInputFiles([
172
- "./fixtures/doc1.pdf",
173
- "./fixtures/doc2.pdf",
174
- "./fixtures/doc3.pdf",
175
- ]);
176
-
177
- // Verify all files listed
178
- await expect(page.getByText("doc1.pdf")).toBeVisible();
179
- await expect(page.getByText("doc2.pdf")).toBeVisible();
180
- await expect(page.getByText("doc3.pdf")).toBeVisible();
181
-
182
- await page.getByRole("button", { name: "Upload All" }).click();
183
- await expect(page.getByText("3 files uploaded")).toBeVisible();
184
- });
185
- ```
186
-
187
- ### Upload with File Chooser
188
-
189
- ```typescript
190
- test("upload via file chooser dialog", async ({ page }) => {
191
- await page.goto("/upload");
192
-
193
- // Handle file chooser
194
- const fileChooserPromise = page.waitForEvent("filechooser");
195
- await page.getByRole("button", { name: "Choose File" }).click();
196
- const fileChooser = await fileChooserPromise;
197
-
198
- await fileChooser.setFiles("./fixtures/document.pdf");
199
-
200
- await expect(page.getByText("document.pdf")).toBeVisible();
201
- });
202
- ```
203
-
204
- ### Clear and Re-upload
205
-
206
- ```typescript
207
- test("replace uploaded file", async ({ page }) => {
208
- await page.goto("/upload");
209
-
210
- const input = page.getByLabel("Document");
211
-
212
- // Upload first file
213
- await input.setInputFiles("./fixtures/old.pdf");
214
- await expect(page.getByText("old.pdf")).toBeVisible();
215
-
216
- // Clear selection
217
- await input.setInputFiles([]);
218
-
219
- // Upload new file
220
- await input.setInputFiles("./fixtures/new.pdf");
221
- await expect(page.getByText("new.pdf")).toBeVisible();
222
- await expect(page.getByText("old.pdf")).toBeHidden();
223
- });
224
- ```
225
-
226
- ### Upload from Buffer
227
-
228
- ```typescript
229
- test("upload generated file", async ({ page }) => {
230
- await page.goto("/upload");
231
-
232
- // Create file content dynamically
233
- const content = "Name,Email\nJohn,john@example.com";
234
-
235
- await page.getByLabel("CSV File").setInputFiles({
236
- name: "users.csv",
237
- mimeType: "text/csv",
238
- buffer: Buffer.from(content),
239
- });
240
-
241
- await expect(page.getByText("users.csv")).toBeVisible();
242
- });
243
- ```
244
-
245
- ## Drag and Drop
246
-
247
- ### Drag and Drop Upload
248
-
249
- ```typescript
250
- test("drag and drop file upload", async ({ page }) => {
251
- await page.goto("/upload");
252
-
253
- const dropzone = page.getByTestId("dropzone");
254
-
255
- // Create a DataTransfer with the file
256
- const dataTransfer = await page.evaluateHandle(() => new DataTransfer());
257
-
258
- // Read file and add to DataTransfer
259
- const buffer = fs.readFileSync("./fixtures/image.png");
260
- await page.evaluate(
261
- async ([dataTransfer, data]) => {
262
- const file = new File([new Uint8Array(data)], "image.png", {
263
- type: "image/png",
264
- });
265
- dataTransfer.items.add(file);
266
- },
267
- [dataTransfer, [...buffer]] as const,
268
- );
269
-
270
- // Dispatch drop event
271
- await dropzone.dispatchEvent("drop", { dataTransfer });
272
-
273
- await expect(page.getByText("image.png uploaded")).toBeVisible();
274
- });
275
- ```
276
-
277
- ### Simpler Drag and Drop
278
-
279
- ```typescript
280
- test("drag and drop with setInputFiles", async ({ page }) => {
281
- await page.goto("/upload");
282
-
283
- // Most dropzones have a hidden file input
284
- const input = page.locator('input[type="file"]');
285
-
286
- // This works even if the input is hidden
287
- await input.setInputFiles("./fixtures/document.pdf");
288
-
289
- await expect(page.getByText("document.pdf")).toBeVisible();
290
- });
291
- ```
292
-
293
- ## File Content Verification
294
-
295
- ### Verify PDF Content
296
-
297
- ```typescript
298
- import pdf from "pdf-parse";
299
-
300
- test("verify PDF content", async ({ page }, testInfo) => {
301
- await page.goto("/invoice/123");
302
-
303
- const downloadPromise = page.waitForEvent("download");
304
- await page.getByRole("button", { name: "Download Invoice" }).click();
305
- const download = await downloadPromise;
306
-
307
- const path = testInfo.outputPath("invoice.pdf");
308
- await download.saveAs(path);
309
-
310
- // Parse PDF
311
- const dataBuffer = fs.readFileSync(path);
312
- const data = await pdf(dataBuffer);
313
-
314
- expect(data.text).toContain("Invoice #123");
315
- expect(data.text).toContain("Total: $99.99");
316
- });
317
- ```
318
-
319
- ### Verify Excel Content
320
-
321
- ```typescript
322
- import XLSX from "xlsx";
323
-
324
- test("verify Excel export", async ({ page }, testInfo) => {
325
- await page.goto("/reports");
326
-
327
- const downloadPromise = page.waitForEvent("download");
328
- await page.getByRole("button", { name: "Export Excel" }).click();
329
- const download = await downloadPromise;
330
-
331
- const path = testInfo.outputPath("report.xlsx");
332
- await download.saveAs(path);
333
-
334
- // Parse Excel
335
- const workbook = XLSX.readFile(path);
336
- const sheet = workbook.Sheets[workbook.SheetNames[0]];
337
- const data = XLSX.utils.sheet_to_json(sheet);
338
-
339
- expect(data).toHaveLength(10);
340
- expect(data[0]).toHaveProperty("Name");
341
- expect(data[0]).toHaveProperty("Email");
342
- });
343
- ```
344
-
345
- ### Verify JSON Download
346
-
347
- ```typescript
348
- test("verify JSON export", async ({ page }, testInfo) => {
349
- await page.goto("/api-data");
350
-
351
- const downloadPromise = page.waitForEvent("download");
352
- await page.getByRole("button", { name: "Export JSON" }).click();
353
- const download = await downloadPromise;
354
-
355
- const path = testInfo.outputPath("data.json");
356
- await download.saveAs(path);
357
-
358
- const content = JSON.parse(fs.readFileSync(path, "utf-8"));
359
-
360
- expect(content.users).toHaveLength(5);
361
- expect(content.exportDate).toBeDefined();
362
- });
363
- ```
364
-
365
- ## Anti-Patterns to Avoid
366
-
367
- | Anti-Pattern | Problem | Solution |
368
- | ------------------------------------- | ------------------------------- | --------------------------------------------- |
369
- | Not waiting for download | Race condition, test fails | Always use `waitForEvent("download")` |
370
- | Hardcoded download paths | Conflicts in parallel runs | Use `testInfo.outputPath()` |
371
- | Skipping content verification | Download might be empty/corrupt | Verify file content when possible |
372
- | Using `force: true` for hidden inputs | May not trigger proper events | Use `setInputFiles` on hidden inputs directly |
373
-
374
- ## Related References
375
-
376
- - **Fixtures**: See [fixtures-hooks.md](../core/fixtures-hooks.md) for download fixture patterns
377
- - **Debugging**: See [debugging.md](../debugging/debugging.md) for troubleshooting download issues