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,492 +0,0 @@
1
- # Test Data Factories & Generators
2
-
3
- This file covers **reusable test data builders** (factories, Faker, data generators). For related topics:
4
-
5
- - **Per-test database fixtures** (isolation, transaction rollback): See [fixtures-hooks.md](fixtures-hooks.md#database-fixtures)
6
- - **One-time database setup** (migrations, snapshots): See [global-setup.md](global-setup.md#database-patterns)
7
-
8
- ## Table of Contents
9
-
10
- 1. [Factory Pattern](#factory-pattern)
11
- 2. [Faker Integration](#faker-integration)
12
- 3. [Data-Driven Testing](#data-driven-testing)
13
- 4. [Test Data Fixtures](#test-data-fixtures)
14
- 5. [Database Seeding](#database-seeding)
15
-
16
- ## Factory Pattern
17
-
18
- ### Basic Factory
19
-
20
- ```typescript
21
- // factories/user.factory.ts
22
- interface User {
23
- id: string;
24
- email: string;
25
- name: string;
26
- role: "admin" | "user" | "guest";
27
- createdAt: Date;
28
- }
29
-
30
- let userIdCounter = 0;
31
-
32
- export function createUser(overrides: Partial<User> = {}): User {
33
- userIdCounter++;
34
- return {
35
- id: `user-${userIdCounter}`,
36
- email: `user${userIdCounter}@test.com`,
37
- name: `Test User ${userIdCounter}`,
38
- role: "user",
39
- createdAt: new Date(),
40
- ...overrides,
41
- };
42
- }
43
-
44
- // Usage
45
- const user = createUser();
46
- const admin = createUser({ role: "admin", name: "Admin User" });
47
- ```
48
-
49
- ### Factory with Traits
50
-
51
- ```typescript
52
- // factories/product.factory.ts
53
- interface Product {
54
- id: string;
55
- name: string;
56
- price: number;
57
- stock: number;
58
- category: string;
59
- featured: boolean;
60
- }
61
-
62
- type ProductTrait = "outOfStock" | "featured" | "expensive" | "sale";
63
-
64
- const traits: Record<ProductTrait, Partial<Product>> = {
65
- outOfStock: { stock: 0 },
66
- featured: { featured: true },
67
- expensive: { price: 999.99 },
68
- sale: { price: 9.99 },
69
- };
70
-
71
- let productIdCounter = 0;
72
-
73
- export function createProduct(
74
- overrides: Partial<Product> = {},
75
- ...traitNames: ProductTrait[]
76
- ): Product {
77
- productIdCounter++;
78
-
79
- const appliedTraits = traitNames.reduce(
80
- (acc, trait) => ({ ...acc, ...traits[trait] }),
81
- {},
82
- );
83
-
84
- return {
85
- id: `prod-${productIdCounter}`,
86
- name: `Product ${productIdCounter}`,
87
- price: 29.99,
88
- stock: 100,
89
- category: "General",
90
- featured: false,
91
- ...appliedTraits,
92
- ...overrides,
93
- };
94
- }
95
-
96
- // Usage
97
- const product = createProduct();
98
- const featuredProduct = createProduct({}, "featured");
99
- const saleItem = createProduct({ name: "Sale Item" }, "sale", "featured");
100
- const soldOut = createProduct({}, "outOfStock");
101
- ```
102
-
103
- ### Factory with Relationships
104
-
105
- ```typescript
106
- // factories/order.factory.ts
107
- import { createUser, User } from "./user.factory";
108
- import { createProduct, Product } from "./product.factory";
109
-
110
- interface OrderItem {
111
- product: Product;
112
- quantity: number;
113
- }
114
-
115
- interface Order {
116
- id: string;
117
- user: User;
118
- items: OrderItem[];
119
- total: number;
120
- status: "pending" | "paid" | "shipped" | "delivered";
121
- }
122
-
123
- let orderIdCounter = 0;
124
-
125
- export function createOrder(overrides: Partial<Order> = {}): Order {
126
- orderIdCounter++;
127
-
128
- const user = overrides.user ?? createUser();
129
- const items = overrides.items ?? [{ product: createProduct(), quantity: 1 }];
130
- const total = items.reduce(
131
- (sum, item) => sum + item.product.price * item.quantity,
132
- 0,
133
- );
134
-
135
- return {
136
- id: `order-${orderIdCounter}`,
137
- user,
138
- items,
139
- total,
140
- status: "pending",
141
- ...overrides,
142
- };
143
- }
144
-
145
- // Usage
146
- const order = createOrder();
147
- const bigOrder = createOrder({
148
- items: [
149
- { product: createProduct({ price: 100 }), quantity: 5 },
150
- { product: createProduct({ price: 50 }), quantity: 2 },
151
- ],
152
- });
153
- ```
154
-
155
- ## Faker Integration
156
-
157
- ### Setup Faker
158
-
159
- ```bash
160
- npm install -D @faker-js/faker
161
- ```
162
-
163
- ```typescript
164
- // factories/faker-user.factory.ts
165
- import { faker } from "@faker-js/faker";
166
-
167
- interface User {
168
- id: string;
169
- email: string;
170
- name: string;
171
- avatar: string;
172
- address: {
173
- street: string;
174
- city: string;
175
- country: string;
176
- zipCode: string;
177
- };
178
- }
179
-
180
- export function createFakeUser(overrides: Partial<User> = {}): User {
181
- return {
182
- id: faker.string.uuid(),
183
- email: faker.internet.email(),
184
- name: faker.person.fullName(),
185
- avatar: faker.image.avatar(),
186
- address: {
187
- street: faker.location.streetAddress(),
188
- city: faker.location.city(),
189
- country: faker.location.country(),
190
- zipCode: faker.location.zipCode(),
191
- },
192
- ...overrides,
193
- };
194
- }
195
- ```
196
-
197
- ### Seeded Faker for Reproducibility
198
-
199
- ```typescript
200
- import { faker } from "@faker-js/faker";
201
-
202
- // Set seed for reproducible data
203
- faker.seed(12345);
204
-
205
- export function createDeterministicUser(): User {
206
- return {
207
- id: faker.string.uuid(),
208
- email: faker.internet.email(),
209
- name: faker.person.fullName(),
210
- // Same seed = same data every time
211
- };
212
- }
213
-
214
- // Or seed per test
215
- test("user profile", async ({ page }) => {
216
- faker.seed(42); // Reset seed for this test
217
- const user = createFakeUser();
218
- // user will always have the same data
219
- });
220
- ```
221
-
222
- ### Faker Fixture
223
-
224
- ```typescript
225
- // fixtures/faker.fixture.ts
226
- import { test as base } from "@playwright/test";
227
- import { faker } from "@faker-js/faker";
228
-
229
- type FakerFixtures = {
230
- fake: typeof faker;
231
- };
232
-
233
- export const test = base.extend<FakerFixtures>({
234
- fake: async ({}, use, testInfo) => {
235
- // Seed based on test name for reproducibility
236
- faker.seed(testInfo.title.length);
237
- await use(faker);
238
- },
239
- });
240
-
241
- // Usage
242
- test("create user with fake data", async ({ page, fake }) => {
243
- await page.goto("/signup");
244
-
245
- await page.getByLabel("Name").fill(fake.person.fullName());
246
- await page.getByLabel("Email").fill(fake.internet.email());
247
- await page.getByLabel("Password").fill(fake.internet.password());
248
-
249
- await page.getByRole("button", { name: "Sign Up" }).click();
250
- });
251
- ```
252
-
253
- ## Data-Driven Testing
254
-
255
- ### test.each with Arrays
256
-
257
- ```typescript
258
- const loginScenarios = [
259
- { email: "user@example.com", password: "pass123", expected: "Dashboard" },
260
- { email: "admin@example.com", password: "admin123", expected: "Admin Panel" },
261
- {
262
- email: "invalid@example.com",
263
- password: "wrong",
264
- expected: "Invalid credentials",
265
- },
266
- ];
267
-
268
- for (const { email, password, expected } of loginScenarios) {
269
- test(`login with ${email}`, async ({ page }) => {
270
- await page.goto("/login");
271
- await page.getByLabel("Email").fill(email);
272
- await page.getByLabel("Password").fill(password);
273
- await page.getByRole("button", { name: "Sign In" }).click();
274
-
275
- await expect(page.getByText(expected)).toBeVisible();
276
- });
277
- }
278
- ```
279
-
280
- ### Parameterized Tests
281
-
282
- ```typescript
283
- // data/checkout-scenarios.ts
284
- export const checkoutScenarios = [
285
- {
286
- name: "standard shipping",
287
- shipping: "standard",
288
- expectedDays: "5-7 business days",
289
- expectedCost: "$5.99",
290
- },
291
- {
292
- name: "express shipping",
293
- shipping: "express",
294
- expectedDays: "2-3 business days",
295
- expectedCost: "$14.99",
296
- },
297
- {
298
- name: "overnight shipping",
299
- shipping: "overnight",
300
- expectedDays: "Next business day",
301
- expectedCost: "$29.99",
302
- },
303
- ];
304
- ```
305
-
306
- ```typescript
307
- import { checkoutScenarios } from "./data/checkout-scenarios";
308
-
309
- test.describe("shipping options", () => {
310
- for (const scenario of checkoutScenarios) {
311
- test(`checkout with ${scenario.name}`, async ({ page }) => {
312
- await page.goto("/checkout");
313
-
314
- await page.getByLabel(scenario.shipping, { exact: false }).check();
315
-
316
- await expect(page.getByText(scenario.expectedDays)).toBeVisible();
317
- await expect(page.getByText(scenario.expectedCost)).toBeVisible();
318
- });
319
- }
320
- });
321
- ```
322
-
323
- ### CSV/JSON Data Source
324
-
325
- ```typescript
326
- import fs from "fs";
327
-
328
- interface TestCase {
329
- input: string;
330
- expected: string;
331
- }
332
-
333
- // Load test data from JSON
334
- const testCases: TestCase[] = JSON.parse(
335
- fs.readFileSync("./data/search-tests.json", "utf-8"),
336
- );
337
-
338
- test.describe("search functionality", () => {
339
- for (const { input, expected } of testCases) {
340
- test(`search for "${input}"`, async ({ page }) => {
341
- await page.goto("/search");
342
- await page.getByLabel("Search").fill(input);
343
- await page.getByLabel("Search").press("Enter");
344
-
345
- await expect(page.getByText(expected)).toBeVisible();
346
- });
347
- }
348
- });
349
- ```
350
-
351
- ## Test Data Fixtures
352
-
353
- ### Fixture with Factory
354
-
355
- ```typescript
356
- // fixtures/data.fixture.ts
357
- import { test as base } from "@playwright/test";
358
- import { createUser, User } from "../factories/user.factory";
359
- import { createProduct, Product } from "../factories/product.factory";
360
-
361
- type DataFixtures = {
362
- testUser: User;
363
- testProducts: Product[];
364
- };
365
-
366
- export const test = base.extend<DataFixtures>({
367
- testUser: async ({}, use) => {
368
- const user = createUser({ name: "E2E Test User" });
369
- await use(user);
370
- },
371
-
372
- testProducts: async ({}, use) => {
373
- const products = [
374
- createProduct({ name: "Test Product 1" }),
375
- createProduct({ name: "Test Product 2" }),
376
- createProduct({ name: "Test Product 3" }),
377
- ];
378
- await use(products);
379
- },
380
- });
381
-
382
- // Usage
383
- test("add product to cart", async ({ page, testUser, testProducts }) => {
384
- // Mock API with test data
385
- await page.route("**/api/user", (route) => route.fulfill({ json: testUser }));
386
- await page.route("**/api/products", (route) =>
387
- route.fulfill({ json: testProducts }),
388
- );
389
-
390
- await page.goto("/products");
391
- await expect(page.getByText(testProducts[0].name)).toBeVisible();
392
- });
393
- ```
394
-
395
- ## Database Seeding
396
-
397
- ### API-Based Seeding
398
-
399
- ```typescript
400
- // fixtures/seed.fixture.ts
401
- import { test as base, APIRequestContext } from "@playwright/test";
402
- import { createUser } from "../factories/user.factory";
403
-
404
- type SeedFixtures = {
405
- seedUser: (overrides?: Partial<User>) => Promise<User>;
406
- cleanupUsers: string[];
407
- };
408
-
409
- export const test = base.extend<SeedFixtures>({
410
- cleanupUsers: [],
411
-
412
- seedUser: async ({ request, cleanupUsers }, use) => {
413
- await use(async (overrides = {}) => {
414
- const userData = createUser(overrides);
415
-
416
- const response = await request.post("/api/test/users", {
417
- data: userData,
418
- });
419
- const user = await response.json();
420
-
421
- cleanupUsers.push(user.id);
422
- return user;
423
- });
424
- },
425
-
426
- // Cleanup after test
427
- cleanupUsers: async ({ request }, use) => {
428
- const userIds: string[] = [];
429
- await use(userIds);
430
-
431
- // Delete all created users
432
- for (const id of userIds) {
433
- await request.delete(`/api/test/users/${id}`);
434
- }
435
- },
436
- });
437
-
438
- // Usage
439
- test("user profile page", async ({ page, seedUser }) => {
440
- const user = await seedUser({ name: "John Doe" });
441
-
442
- await page.goto(`/users/${user.id}`);
443
- await expect(page.getByText("John Doe")).toBeVisible();
444
- });
445
- ```
446
-
447
- ### Transaction Rollback Seeding
448
-
449
- ```typescript
450
- // fixtures/db.fixture.ts
451
- export const test = base.extend<{}, { db: DbTransaction }>({
452
- db: [
453
- async ({}, use) => {
454
- const client = await pool.connect();
455
- await client.query("BEGIN");
456
-
457
- await use({
458
- query: (sql: string, params?: any[]) => client.query(sql, params),
459
- seed: async (table: string, data: object) => {
460
- const keys = Object.keys(data);
461
- const values = Object.values(data);
462
- const placeholders = keys.map((_, i) => `$${i + 1}`);
463
-
464
- const result = await client.query(
465
- `INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders.join(", ")}) RETURNING *`,
466
- values,
467
- );
468
- return result.rows[0];
469
- },
470
- });
471
-
472
- await client.query("ROLLBACK");
473
- client.release();
474
- },
475
- { scope: "test" },
476
- ],
477
- });
478
- ```
479
-
480
- ## Anti-Patterns to Avoid
481
-
482
- | Anti-Pattern | Problem | Solution |
483
- | ------------------------------- | ------------------------------- | -------------------------- |
484
- | Hardcoded test data | Brittle, repetitive | Use factories |
485
- | Random data without seed | Non-reproducible failures | Seed faker per test |
486
- | Shared mutable test data | Tests interfere with each other | Create fresh data per test |
487
- | Manual data creation everywhere | Duplication, maintenance burden | Centralize in factories |
488
-
489
- ## Related References
490
-
491
- - **Fixtures**: See [fixtures-hooks.md](fixtures-hooks.md) for fixture patterns
492
- - **API Testing**: See [test-suite-structure.md](test-suite-structure.md) for API mocking