@wazir-dev/cli 1.0.0

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 (629) hide show
  1. package/AGENTS.md +111 -0
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +21 -0
  5. package/README.md +314 -0
  6. package/assets/composition-engine.mmd +34 -0
  7. package/assets/demo-script.sh +17 -0
  8. package/assets/logo-dark.svg +14 -0
  9. package/assets/logo.svg +14 -0
  10. package/assets/pipeline.mmd +39 -0
  11. package/assets/record-demo.sh +51 -0
  12. package/docs/README.md +51 -0
  13. package/docs/adapters/context-mode.md +60 -0
  14. package/docs/concepts/architecture.md +87 -0
  15. package/docs/concepts/artifact-model.md +60 -0
  16. package/docs/concepts/composition-engine.md +36 -0
  17. package/docs/concepts/indexing-and-recall.md +160 -0
  18. package/docs/concepts/observability.md +41 -0
  19. package/docs/concepts/roles-and-workflows.md +59 -0
  20. package/docs/concepts/terminology-policy.md +27 -0
  21. package/docs/getting-started/01-installation.md +78 -0
  22. package/docs/getting-started/02-first-run.md +102 -0
  23. package/docs/getting-started/03-adding-to-project.md +15 -0
  24. package/docs/getting-started/04-host-setup.md +15 -0
  25. package/docs/guides/ci-integration.md +15 -0
  26. package/docs/guides/creating-skills.md +15 -0
  27. package/docs/guides/expertise-module-authoring.md +15 -0
  28. package/docs/guides/hook-development.md +15 -0
  29. package/docs/guides/memory-and-learnings.md +34 -0
  30. package/docs/guides/multi-host-export.md +15 -0
  31. package/docs/guides/troubleshooting.md +101 -0
  32. package/docs/guides/writing-custom-roles.md +15 -0
  33. package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
  34. package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
  35. package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
  36. package/docs/readmes/INDEX.md +99 -0
  37. package/docs/readmes/features/expertise/README.md +171 -0
  38. package/docs/readmes/features/exports/README.md +222 -0
  39. package/docs/readmes/features/hooks/README.md +103 -0
  40. package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
  41. package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
  42. package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
  43. package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
  44. package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
  45. package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
  46. package/docs/readmes/features/hooks/session-start.md +119 -0
  47. package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
  48. package/docs/readmes/features/roles/README.md +157 -0
  49. package/docs/readmes/features/roles/clarifier.md +152 -0
  50. package/docs/readmes/features/roles/content-author.md +190 -0
  51. package/docs/readmes/features/roles/designer.md +193 -0
  52. package/docs/readmes/features/roles/executor.md +184 -0
  53. package/docs/readmes/features/roles/learner.md +210 -0
  54. package/docs/readmes/features/roles/planner.md +182 -0
  55. package/docs/readmes/features/roles/researcher.md +164 -0
  56. package/docs/readmes/features/roles/reviewer.md +184 -0
  57. package/docs/readmes/features/roles/specifier.md +162 -0
  58. package/docs/readmes/features/roles/verifier.md +215 -0
  59. package/docs/readmes/features/schemas/README.md +178 -0
  60. package/docs/readmes/features/skills/README.md +63 -0
  61. package/docs/readmes/features/skills/brainstorming.md +96 -0
  62. package/docs/readmes/features/skills/debugging.md +148 -0
  63. package/docs/readmes/features/skills/design.md +120 -0
  64. package/docs/readmes/features/skills/prepare-next.md +109 -0
  65. package/docs/readmes/features/skills/run-audit.md +159 -0
  66. package/docs/readmes/features/skills/scan-project.md +109 -0
  67. package/docs/readmes/features/skills/self-audit.md +176 -0
  68. package/docs/readmes/features/skills/tdd.md +137 -0
  69. package/docs/readmes/features/skills/using-skills.md +92 -0
  70. package/docs/readmes/features/skills/verification.md +120 -0
  71. package/docs/readmes/features/skills/writing-plans.md +104 -0
  72. package/docs/readmes/features/tooling/README.md +320 -0
  73. package/docs/readmes/features/workflows/README.md +186 -0
  74. package/docs/readmes/features/workflows/author.md +181 -0
  75. package/docs/readmes/features/workflows/clarify.md +154 -0
  76. package/docs/readmes/features/workflows/design-review.md +171 -0
  77. package/docs/readmes/features/workflows/design.md +169 -0
  78. package/docs/readmes/features/workflows/discover.md +162 -0
  79. package/docs/readmes/features/workflows/execute.md +173 -0
  80. package/docs/readmes/features/workflows/learn.md +167 -0
  81. package/docs/readmes/features/workflows/plan-review.md +165 -0
  82. package/docs/readmes/features/workflows/plan.md +170 -0
  83. package/docs/readmes/features/workflows/prepare-next.md +167 -0
  84. package/docs/readmes/features/workflows/review.md +169 -0
  85. package/docs/readmes/features/workflows/run-audit.md +191 -0
  86. package/docs/readmes/features/workflows/spec-challenge.md +159 -0
  87. package/docs/readmes/features/workflows/specify.md +160 -0
  88. package/docs/readmes/features/workflows/verify.md +177 -0
  89. package/docs/readmes/packages/README.md +50 -0
  90. package/docs/readmes/packages/ajv.md +117 -0
  91. package/docs/readmes/packages/context-mode.md +118 -0
  92. package/docs/readmes/packages/gray-matter.md +116 -0
  93. package/docs/readmes/packages/node-test.md +137 -0
  94. package/docs/readmes/packages/yaml.md +112 -0
  95. package/docs/reference/configuration-reference.md +159 -0
  96. package/docs/reference/expertise-index.md +52 -0
  97. package/docs/reference/git-flow.md +43 -0
  98. package/docs/reference/hooks.md +87 -0
  99. package/docs/reference/host-exports.md +50 -0
  100. package/docs/reference/launch-checklist.md +172 -0
  101. package/docs/reference/marketplace-listings.md +76 -0
  102. package/docs/reference/release-process.md +34 -0
  103. package/docs/reference/roles-reference.md +77 -0
  104. package/docs/reference/skills.md +33 -0
  105. package/docs/reference/templates.md +29 -0
  106. package/docs/reference/tooling-cli.md +94 -0
  107. package/docs/truth-claims.yaml +222 -0
  108. package/expertise/PROGRESS.md +63 -0
  109. package/expertise/README.md +18 -0
  110. package/expertise/antipatterns/PROGRESS.md +56 -0
  111. package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
  112. package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
  113. package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
  114. package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
  115. package/expertise/antipatterns/backend/index.md +24 -0
  116. package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
  117. package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
  118. package/expertise/antipatterns/code/async-antipatterns.md +622 -0
  119. package/expertise/antipatterns/code/code-smells.md +1186 -0
  120. package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
  121. package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
  122. package/expertise/antipatterns/code/index.md +27 -0
  123. package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
  124. package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
  125. package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
  126. package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
  127. package/expertise/antipatterns/design/dark-patterns.md +1121 -0
  128. package/expertise/antipatterns/design/index.md +22 -0
  129. package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
  130. package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
  131. package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
  132. package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
  133. package/expertise/antipatterns/frontend/index.md +23 -0
  134. package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
  135. package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
  136. package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
  137. package/expertise/antipatterns/index.md +31 -0
  138. package/expertise/antipatterns/performance/index.md +20 -0
  139. package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
  140. package/expertise/antipatterns/performance/premature-optimization.md +623 -0
  141. package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
  142. package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
  143. package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
  144. package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
  145. package/expertise/antipatterns/process/index.md +23 -0
  146. package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
  147. package/expertise/antipatterns/security/index.md +20 -0
  148. package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
  149. package/expertise/antipatterns/security/security-theater.md +843 -0
  150. package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
  151. package/expertise/architecture/PROGRESS.md +70 -0
  152. package/expertise/architecture/data/caching-architecture.md +671 -0
  153. package/expertise/architecture/data/data-consistency.md +574 -0
  154. package/expertise/architecture/data/data-modeling.md +536 -0
  155. package/expertise/architecture/data/event-streams-and-queues.md +634 -0
  156. package/expertise/architecture/data/index.md +25 -0
  157. package/expertise/architecture/data/search-architecture.md +663 -0
  158. package/expertise/architecture/data/sql-vs-nosql.md +708 -0
  159. package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
  160. package/expertise/architecture/decisions/build-vs-buy.md +616 -0
  161. package/expertise/architecture/decisions/index.md +23 -0
  162. package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
  163. package/expertise/architecture/decisions/technology-selection.md +616 -0
  164. package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
  165. package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
  166. package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
  167. package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
  168. package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
  169. package/expertise/architecture/distributed/index.md +25 -0
  170. package/expertise/architecture/distributed/saga-pattern.md +797 -0
  171. package/expertise/architecture/foundations/architectural-thinking.md +460 -0
  172. package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
  173. package/expertise/architecture/foundations/design-principles-solid.md +649 -0
  174. package/expertise/architecture/foundations/domain-driven-design.md +719 -0
  175. package/expertise/architecture/foundations/index.md +25 -0
  176. package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
  177. package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
  178. package/expertise/architecture/index.md +34 -0
  179. package/expertise/architecture/integration/api-design-graphql.md +638 -0
  180. package/expertise/architecture/integration/api-design-grpc.md +804 -0
  181. package/expertise/architecture/integration/api-design-rest.md +892 -0
  182. package/expertise/architecture/integration/index.md +25 -0
  183. package/expertise/architecture/integration/third-party-integration.md +795 -0
  184. package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
  185. package/expertise/architecture/integration/websockets-realtime.md +791 -0
  186. package/expertise/architecture/mobile-architecture/index.md +22 -0
  187. package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
  188. package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
  189. package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
  190. package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
  191. package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
  192. package/expertise/architecture/patterns/event-driven.md +797 -0
  193. package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
  194. package/expertise/architecture/patterns/index.md +27 -0
  195. package/expertise/architecture/patterns/layered-architecture.md +736 -0
  196. package/expertise/architecture/patterns/microservices.md +753 -0
  197. package/expertise/architecture/patterns/modular-monolith.md +692 -0
  198. package/expertise/architecture/patterns/monolith.md +626 -0
  199. package/expertise/architecture/patterns/plugin-architecture.md +735 -0
  200. package/expertise/architecture/patterns/serverless.md +780 -0
  201. package/expertise/architecture/scaling/database-scaling.md +615 -0
  202. package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
  203. package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
  204. package/expertise/architecture/scaling/index.md +24 -0
  205. package/expertise/architecture/scaling/multi-tenancy.md +800 -0
  206. package/expertise/architecture/scaling/stateless-design.md +787 -0
  207. package/expertise/backend/embedded-firmware.md +625 -0
  208. package/expertise/backend/go.md +853 -0
  209. package/expertise/backend/index.md +24 -0
  210. package/expertise/backend/java-spring.md +448 -0
  211. package/expertise/backend/node-typescript.md +625 -0
  212. package/expertise/backend/python-fastapi.md +724 -0
  213. package/expertise/backend/rust.md +458 -0
  214. package/expertise/backend/solidity.md +711 -0
  215. package/expertise/composition-map.yaml +443 -0
  216. package/expertise/content/foundations/content-modeling.md +395 -0
  217. package/expertise/content/foundations/editorial-standards.md +449 -0
  218. package/expertise/content/foundations/index.md +24 -0
  219. package/expertise/content/foundations/microcopy.md +455 -0
  220. package/expertise/content/foundations/terminology-governance.md +509 -0
  221. package/expertise/content/index.md +34 -0
  222. package/expertise/content/patterns/accessibility-copy.md +518 -0
  223. package/expertise/content/patterns/index.md +24 -0
  224. package/expertise/content/patterns/notification-content.md +433 -0
  225. package/expertise/content/patterns/sample-content.md +486 -0
  226. package/expertise/content/patterns/state-copy.md +439 -0
  227. package/expertise/design/PROGRESS.md +58 -0
  228. package/expertise/design/disciplines/dark-mode-theming.md +577 -0
  229. package/expertise/design/disciplines/design-systems.md +595 -0
  230. package/expertise/design/disciplines/index.md +25 -0
  231. package/expertise/design/disciplines/information-architecture.md +800 -0
  232. package/expertise/design/disciplines/interaction-design.md +788 -0
  233. package/expertise/design/disciplines/responsive-design.md +552 -0
  234. package/expertise/design/disciplines/usability-testing.md +516 -0
  235. package/expertise/design/disciplines/user-research.md +792 -0
  236. package/expertise/design/foundations/accessibility-design.md +796 -0
  237. package/expertise/design/foundations/color-theory.md +797 -0
  238. package/expertise/design/foundations/iconography.md +795 -0
  239. package/expertise/design/foundations/index.md +26 -0
  240. package/expertise/design/foundations/motion-and-animation.md +653 -0
  241. package/expertise/design/foundations/rtl-design.md +585 -0
  242. package/expertise/design/foundations/spacing-and-layout.md +607 -0
  243. package/expertise/design/foundations/typography.md +800 -0
  244. package/expertise/design/foundations/visual-hierarchy.md +761 -0
  245. package/expertise/design/index.md +32 -0
  246. package/expertise/design/patterns/authentication-flows.md +474 -0
  247. package/expertise/design/patterns/content-consumption.md +789 -0
  248. package/expertise/design/patterns/data-display.md +618 -0
  249. package/expertise/design/patterns/e-commerce.md +1494 -0
  250. package/expertise/design/patterns/feedback-and-states.md +642 -0
  251. package/expertise/design/patterns/forms-and-input.md +819 -0
  252. package/expertise/design/patterns/gamification.md +801 -0
  253. package/expertise/design/patterns/index.md +31 -0
  254. package/expertise/design/patterns/microinteractions.md +449 -0
  255. package/expertise/design/patterns/navigation.md +800 -0
  256. package/expertise/design/patterns/notifications.md +705 -0
  257. package/expertise/design/patterns/onboarding.md +700 -0
  258. package/expertise/design/patterns/search-and-filter.md +601 -0
  259. package/expertise/design/patterns/settings-and-preferences.md +768 -0
  260. package/expertise/design/patterns/social-and-community.md +748 -0
  261. package/expertise/design/platforms/desktop-native.md +612 -0
  262. package/expertise/design/platforms/index.md +25 -0
  263. package/expertise/design/platforms/mobile-android.md +825 -0
  264. package/expertise/design/platforms/mobile-cross-platform.md +983 -0
  265. package/expertise/design/platforms/mobile-ios.md +699 -0
  266. package/expertise/design/platforms/tablet.md +794 -0
  267. package/expertise/design/platforms/web-dashboard.md +790 -0
  268. package/expertise/design/platforms/web-responsive.md +550 -0
  269. package/expertise/design/psychology/behavioral-nudges.md +449 -0
  270. package/expertise/design/psychology/cognitive-load.md +1191 -0
  271. package/expertise/design/psychology/error-psychology.md +778 -0
  272. package/expertise/design/psychology/index.md +22 -0
  273. package/expertise/design/psychology/persuasive-design.md +736 -0
  274. package/expertise/design/psychology/user-mental-models.md +623 -0
  275. package/expertise/design/tooling/open-pencil.md +266 -0
  276. package/expertise/frontend/angular.md +1073 -0
  277. package/expertise/frontend/desktop-electron.md +546 -0
  278. package/expertise/frontend/flutter.md +782 -0
  279. package/expertise/frontend/index.md +27 -0
  280. package/expertise/frontend/native-android.md +409 -0
  281. package/expertise/frontend/native-ios.md +490 -0
  282. package/expertise/frontend/react-native.md +1160 -0
  283. package/expertise/frontend/react.md +808 -0
  284. package/expertise/frontend/vue.md +1089 -0
  285. package/expertise/humanize/domain-rules-code.md +79 -0
  286. package/expertise/humanize/domain-rules-content.md +67 -0
  287. package/expertise/humanize/domain-rules-technical-docs.md +56 -0
  288. package/expertise/humanize/index.md +35 -0
  289. package/expertise/humanize/self-audit-checklist.md +87 -0
  290. package/expertise/humanize/sentence-patterns.md +218 -0
  291. package/expertise/humanize/vocabulary-blacklist.md +105 -0
  292. package/expertise/i18n/PROGRESS.md +65 -0
  293. package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
  294. package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
  295. package/expertise/i18n/advanced/complex-scripts.md +30 -0
  296. package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
  297. package/expertise/i18n/advanced/testing-i18n.md +28 -0
  298. package/expertise/i18n/content/content-adaptation.md +23 -0
  299. package/expertise/i18n/content/locale-specific-formatting.md +23 -0
  300. package/expertise/i18n/content/machine-translation-integration.md +28 -0
  301. package/expertise/i18n/content/translation-management.md +29 -0
  302. package/expertise/i18n/foundations/date-time-calendars.md +67 -0
  303. package/expertise/i18n/foundations/i18n-architecture.md +272 -0
  304. package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
  305. package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
  306. package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
  307. package/expertise/i18n/foundations/string-externalization.md +236 -0
  308. package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
  309. package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
  310. package/expertise/i18n/index.md +38 -0
  311. package/expertise/i18n/platform/backend-i18n.md +31 -0
  312. package/expertise/i18n/platform/flutter-i18n.md +148 -0
  313. package/expertise/i18n/platform/native-android-i18n.md +36 -0
  314. package/expertise/i18n/platform/native-ios-i18n.md +36 -0
  315. package/expertise/i18n/platform/react-i18n.md +103 -0
  316. package/expertise/i18n/platform/web-css-i18n.md +81 -0
  317. package/expertise/i18n/rtl/arabic-specific.md +175 -0
  318. package/expertise/i18n/rtl/hebrew-specific.md +149 -0
  319. package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
  320. package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
  321. package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
  322. package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
  323. package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
  324. package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
  325. package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
  326. package/expertise/i18n/rtl/rtl-typography.md +160 -0
  327. package/expertise/index.md +113 -0
  328. package/expertise/index.yaml +216 -0
  329. package/expertise/infrastructure/cloud-aws.md +597 -0
  330. package/expertise/infrastructure/cloud-gcp.md +599 -0
  331. package/expertise/infrastructure/cybersecurity.md +816 -0
  332. package/expertise/infrastructure/database-mongodb.md +447 -0
  333. package/expertise/infrastructure/database-postgres.md +400 -0
  334. package/expertise/infrastructure/devops-cicd.md +787 -0
  335. package/expertise/infrastructure/index.md +27 -0
  336. package/expertise/performance/PROGRESS.md +50 -0
  337. package/expertise/performance/backend/api-latency.md +1204 -0
  338. package/expertise/performance/backend/background-jobs.md +506 -0
  339. package/expertise/performance/backend/connection-pooling.md +1209 -0
  340. package/expertise/performance/backend/database-query-optimization.md +515 -0
  341. package/expertise/performance/backend/index.md +23 -0
  342. package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
  343. package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
  344. package/expertise/performance/foundations/caching-strategies.md +489 -0
  345. package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
  346. package/expertise/performance/foundations/index.md +24 -0
  347. package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
  348. package/expertise/performance/foundations/memory-management.md +964 -0
  349. package/expertise/performance/foundations/performance-budgets.md +1314 -0
  350. package/expertise/performance/index.md +31 -0
  351. package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
  352. package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
  353. package/expertise/performance/infrastructure/index.md +22 -0
  354. package/expertise/performance/infrastructure/load-balancing.md +1081 -0
  355. package/expertise/performance/infrastructure/observability.md +1079 -0
  356. package/expertise/performance/mobile/index.md +23 -0
  357. package/expertise/performance/mobile/mobile-animations.md +544 -0
  358. package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
  359. package/expertise/performance/mobile/mobile-network.md +452 -0
  360. package/expertise/performance/mobile/mobile-rendering.md +599 -0
  361. package/expertise/performance/mobile/mobile-startup-time.md +505 -0
  362. package/expertise/performance/platform-specific/flutter-performance.md +647 -0
  363. package/expertise/performance/platform-specific/index.md +22 -0
  364. package/expertise/performance/platform-specific/node-performance.md +1307 -0
  365. package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
  366. package/expertise/performance/platform-specific/react-performance.md +1403 -0
  367. package/expertise/performance/web/bundle-optimization.md +1239 -0
  368. package/expertise/performance/web/image-and-media.md +636 -0
  369. package/expertise/performance/web/index.md +24 -0
  370. package/expertise/performance/web/network-optimization.md +1133 -0
  371. package/expertise/performance/web/rendering-performance.md +1098 -0
  372. package/expertise/performance/web/ssr-and-hydration.md +918 -0
  373. package/expertise/performance/web/web-vitals.md +1374 -0
  374. package/expertise/quality/accessibility.md +985 -0
  375. package/expertise/quality/evidence-based-verification.md +499 -0
  376. package/expertise/quality/index.md +24 -0
  377. package/expertise/quality/ml-model-audit.md +614 -0
  378. package/expertise/quality/performance.md +600 -0
  379. package/expertise/quality/testing-api.md +891 -0
  380. package/expertise/quality/testing-mobile.md +496 -0
  381. package/expertise/quality/testing-web.md +849 -0
  382. package/expertise/security/PROGRESS.md +54 -0
  383. package/expertise/security/agentic-identity.md +540 -0
  384. package/expertise/security/compliance-frameworks.md +601 -0
  385. package/expertise/security/data/data-encryption.md +364 -0
  386. package/expertise/security/data/data-privacy-gdpr.md +692 -0
  387. package/expertise/security/data/database-security.md +1171 -0
  388. package/expertise/security/data/index.md +22 -0
  389. package/expertise/security/data/pii-handling.md +531 -0
  390. package/expertise/security/foundations/authentication.md +1041 -0
  391. package/expertise/security/foundations/authorization.md +603 -0
  392. package/expertise/security/foundations/cryptography.md +1001 -0
  393. package/expertise/security/foundations/index.md +25 -0
  394. package/expertise/security/foundations/owasp-top-10.md +1354 -0
  395. package/expertise/security/foundations/secrets-management.md +1217 -0
  396. package/expertise/security/foundations/secure-sdlc.md +700 -0
  397. package/expertise/security/foundations/supply-chain-security.md +698 -0
  398. package/expertise/security/index.md +31 -0
  399. package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
  400. package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
  401. package/expertise/security/infrastructure/container-security.md +721 -0
  402. package/expertise/security/infrastructure/incident-response.md +1295 -0
  403. package/expertise/security/infrastructure/index.md +24 -0
  404. package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
  405. package/expertise/security/infrastructure/network-security.md +1337 -0
  406. package/expertise/security/mobile/index.md +23 -0
  407. package/expertise/security/mobile/mobile-android-security.md +1218 -0
  408. package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
  409. package/expertise/security/mobile/mobile-data-storage.md +1265 -0
  410. package/expertise/security/mobile/mobile-ios-security.md +1401 -0
  411. package/expertise/security/mobile/mobile-network-security.md +1520 -0
  412. package/expertise/security/smart-contract-security.md +594 -0
  413. package/expertise/security/testing/index.md +22 -0
  414. package/expertise/security/testing/penetration-testing.md +1258 -0
  415. package/expertise/security/testing/security-code-review.md +1765 -0
  416. package/expertise/security/testing/threat-modeling.md +1074 -0
  417. package/expertise/security/testing/vulnerability-scanning.md +1062 -0
  418. package/expertise/security/web/api-security.md +586 -0
  419. package/expertise/security/web/cors-and-headers.md +433 -0
  420. package/expertise/security/web/csrf.md +562 -0
  421. package/expertise/security/web/file-upload.md +1477 -0
  422. package/expertise/security/web/index.md +25 -0
  423. package/expertise/security/web/injection.md +1375 -0
  424. package/expertise/security/web/session-management.md +1101 -0
  425. package/expertise/security/web/xss.md +1158 -0
  426. package/exports/README.md +17 -0
  427. package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
  428. package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
  429. package/exports/hosts/claude/.claude/agents/designer.md +55 -0
  430. package/exports/hosts/claude/.claude/agents/executor.md +55 -0
  431. package/exports/hosts/claude/.claude/agents/learner.md +51 -0
  432. package/exports/hosts/claude/.claude/agents/planner.md +53 -0
  433. package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
  434. package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
  435. package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
  436. package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
  437. package/exports/hosts/claude/.claude/commands/author.md +42 -0
  438. package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
  439. package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
  440. package/exports/hosts/claude/.claude/commands/design.md +44 -0
  441. package/exports/hosts/claude/.claude/commands/discover.md +37 -0
  442. package/exports/hosts/claude/.claude/commands/execute.md +48 -0
  443. package/exports/hosts/claude/.claude/commands/learn.md +38 -0
  444. package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
  445. package/exports/hosts/claude/.claude/commands/plan.md +39 -0
  446. package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
  447. package/exports/hosts/claude/.claude/commands/review.md +40 -0
  448. package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
  449. package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
  450. package/exports/hosts/claude/.claude/commands/specify.md +38 -0
  451. package/exports/hosts/claude/.claude/commands/verify.md +37 -0
  452. package/exports/hosts/claude/.claude/settings.json +34 -0
  453. package/exports/hosts/claude/CLAUDE.md +19 -0
  454. package/exports/hosts/claude/export.manifest.json +38 -0
  455. package/exports/hosts/claude/host-package.json +67 -0
  456. package/exports/hosts/codex/AGENTS.md +19 -0
  457. package/exports/hosts/codex/export.manifest.json +38 -0
  458. package/exports/hosts/codex/host-package.json +41 -0
  459. package/exports/hosts/cursor/.cursor/hooks.json +16 -0
  460. package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
  461. package/exports/hosts/cursor/export.manifest.json +38 -0
  462. package/exports/hosts/cursor/host-package.json +42 -0
  463. package/exports/hosts/gemini/GEMINI.md +19 -0
  464. package/exports/hosts/gemini/export.manifest.json +38 -0
  465. package/exports/hosts/gemini/host-package.json +41 -0
  466. package/hooks/README.md +18 -0
  467. package/hooks/definitions/loop_cap_guard.yaml +21 -0
  468. package/hooks/definitions/post_tool_capture.yaml +24 -0
  469. package/hooks/definitions/pre_compact_summary.yaml +19 -0
  470. package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
  471. package/hooks/definitions/protected_path_write_guard.yaml +19 -0
  472. package/hooks/definitions/session_start.yaml +19 -0
  473. package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
  474. package/hooks/loop-cap-guard +17 -0
  475. package/hooks/post-tool-lint +36 -0
  476. package/hooks/protected-path-write-guard +17 -0
  477. package/hooks/session-start +41 -0
  478. package/llms-full.txt +2355 -0
  479. package/llms.txt +43 -0
  480. package/package.json +79 -0
  481. package/roles/README.md +20 -0
  482. package/roles/clarifier.md +42 -0
  483. package/roles/content-author.md +63 -0
  484. package/roles/designer.md +55 -0
  485. package/roles/executor.md +55 -0
  486. package/roles/learner.md +51 -0
  487. package/roles/planner.md +53 -0
  488. package/roles/researcher.md +43 -0
  489. package/roles/reviewer.md +54 -0
  490. package/roles/specifier.md +47 -0
  491. package/roles/verifier.md +71 -0
  492. package/schemas/README.md +24 -0
  493. package/schemas/accepted-learning.schema.json +20 -0
  494. package/schemas/author-artifact.schema.json +156 -0
  495. package/schemas/clarification.schema.json +19 -0
  496. package/schemas/design-artifact.schema.json +80 -0
  497. package/schemas/docs-claim.schema.json +18 -0
  498. package/schemas/export-manifest.schema.json +20 -0
  499. package/schemas/hook.schema.json +67 -0
  500. package/schemas/host-export-package.schema.json +18 -0
  501. package/schemas/implementation-plan.schema.json +19 -0
  502. package/schemas/proposed-learning.schema.json +19 -0
  503. package/schemas/research.schema.json +18 -0
  504. package/schemas/review.schema.json +29 -0
  505. package/schemas/run-manifest.schema.json +18 -0
  506. package/schemas/spec-challenge.schema.json +18 -0
  507. package/schemas/spec.schema.json +20 -0
  508. package/schemas/usage.schema.json +102 -0
  509. package/schemas/verification-proof.schema.json +29 -0
  510. package/schemas/wazir-manifest.schema.json +173 -0
  511. package/skills/README.md +40 -0
  512. package/skills/brainstorming/SKILL.md +77 -0
  513. package/skills/debugging/SKILL.md +50 -0
  514. package/skills/design/SKILL.md +61 -0
  515. package/skills/dispatching-parallel-agents/SKILL.md +128 -0
  516. package/skills/executing-plans/SKILL.md +70 -0
  517. package/skills/finishing-a-development-branch/SKILL.md +169 -0
  518. package/skills/humanize/SKILL.md +123 -0
  519. package/skills/init-pipeline/SKILL.md +124 -0
  520. package/skills/prepare-next/SKILL.md +20 -0
  521. package/skills/receiving-code-review/SKILL.md +123 -0
  522. package/skills/requesting-code-review/SKILL.md +105 -0
  523. package/skills/requesting-code-review/code-reviewer.md +108 -0
  524. package/skills/run-audit/SKILL.md +197 -0
  525. package/skills/scan-project/SKILL.md +41 -0
  526. package/skills/self-audit/SKILL.md +153 -0
  527. package/skills/subagent-driven-development/SKILL.md +154 -0
  528. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  529. package/skills/subagent-driven-development/implementer-prompt.md +102 -0
  530. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  531. package/skills/tdd/SKILL.md +23 -0
  532. package/skills/using-git-worktrees/SKILL.md +163 -0
  533. package/skills/using-skills/SKILL.md +95 -0
  534. package/skills/verification/SKILL.md +22 -0
  535. package/skills/wazir/SKILL.md +463 -0
  536. package/skills/writing-plans/SKILL.md +30 -0
  537. package/skills/writing-skills/SKILL.md +157 -0
  538. package/skills/writing-skills/anthropic-best-practices.md +122 -0
  539. package/skills/writing-skills/persuasion-principles.md +50 -0
  540. package/templates/README.md +20 -0
  541. package/templates/artifacts/README.md +10 -0
  542. package/templates/artifacts/accepted-learning.md +19 -0
  543. package/templates/artifacts/accepted-learning.template.json +12 -0
  544. package/templates/artifacts/author.md +74 -0
  545. package/templates/artifacts/author.template.json +19 -0
  546. package/templates/artifacts/clarification.md +21 -0
  547. package/templates/artifacts/clarification.template.json +12 -0
  548. package/templates/artifacts/execute-notes.md +19 -0
  549. package/templates/artifacts/implementation-plan.md +21 -0
  550. package/templates/artifacts/implementation-plan.template.json +11 -0
  551. package/templates/artifacts/learning-proposal.md +19 -0
  552. package/templates/artifacts/next-run-handoff.md +21 -0
  553. package/templates/artifacts/plan-review.md +19 -0
  554. package/templates/artifacts/proposed-learning.template.json +12 -0
  555. package/templates/artifacts/research.md +21 -0
  556. package/templates/artifacts/research.template.json +12 -0
  557. package/templates/artifacts/review-findings.md +19 -0
  558. package/templates/artifacts/review.template.json +11 -0
  559. package/templates/artifacts/run-manifest.template.json +8 -0
  560. package/templates/artifacts/spec-challenge.md +19 -0
  561. package/templates/artifacts/spec-challenge.template.json +11 -0
  562. package/templates/artifacts/spec.md +21 -0
  563. package/templates/artifacts/spec.template.json +12 -0
  564. package/templates/artifacts/verification-proof.md +19 -0
  565. package/templates/artifacts/verification-proof.template.json +11 -0
  566. package/templates/examples/accepted-learning.example.json +14 -0
  567. package/templates/examples/author.example.json +152 -0
  568. package/templates/examples/clarification.example.json +15 -0
  569. package/templates/examples/docs-claim.example.json +8 -0
  570. package/templates/examples/export-manifest.example.json +7 -0
  571. package/templates/examples/host-export-package.example.json +11 -0
  572. package/templates/examples/implementation-plan.example.json +17 -0
  573. package/templates/examples/proposed-learning.example.json +13 -0
  574. package/templates/examples/research.example.json +15 -0
  575. package/templates/examples/research.example.md +6 -0
  576. package/templates/examples/review.example.json +17 -0
  577. package/templates/examples/run-manifest.example.json +9 -0
  578. package/templates/examples/spec-challenge.example.json +14 -0
  579. package/templates/examples/spec.example.json +21 -0
  580. package/templates/examples/verification-proof.example.json +21 -0
  581. package/templates/examples/wazir-manifest.example.yaml +65 -0
  582. package/templates/task-definition-schema.md +99 -0
  583. package/tooling/README.md +20 -0
  584. package/tooling/src/adapters/context-mode.js +50 -0
  585. package/tooling/src/capture/command.js +376 -0
  586. package/tooling/src/capture/store.js +99 -0
  587. package/tooling/src/capture/usage.js +270 -0
  588. package/tooling/src/checks/branches.js +50 -0
  589. package/tooling/src/checks/brand-truth.js +110 -0
  590. package/tooling/src/checks/changelog.js +231 -0
  591. package/tooling/src/checks/command-registry.js +36 -0
  592. package/tooling/src/checks/commits.js +102 -0
  593. package/tooling/src/checks/docs-drift.js +103 -0
  594. package/tooling/src/checks/docs-truth.js +201 -0
  595. package/tooling/src/checks/runtime-surface.js +156 -0
  596. package/tooling/src/cli.js +116 -0
  597. package/tooling/src/command-options.js +56 -0
  598. package/tooling/src/commands/validate.js +320 -0
  599. package/tooling/src/doctor/command.js +91 -0
  600. package/tooling/src/export/command.js +77 -0
  601. package/tooling/src/export/compiler.js +498 -0
  602. package/tooling/src/guards/loop-cap-guard.js +52 -0
  603. package/tooling/src/guards/protected-path-write-guard.js +67 -0
  604. package/tooling/src/index/command.js +152 -0
  605. package/tooling/src/index/storage.js +1061 -0
  606. package/tooling/src/index/summarizers.js +261 -0
  607. package/tooling/src/loaders.js +18 -0
  608. package/tooling/src/project-root.js +22 -0
  609. package/tooling/src/recall/command.js +225 -0
  610. package/tooling/src/schema-validator.js +30 -0
  611. package/tooling/src/state-root.js +40 -0
  612. package/tooling/src/status/command.js +71 -0
  613. package/wazir.manifest.yaml +135 -0
  614. package/workflows/README.md +19 -0
  615. package/workflows/author.md +42 -0
  616. package/workflows/clarify.md +38 -0
  617. package/workflows/design-review.md +46 -0
  618. package/workflows/design.md +44 -0
  619. package/workflows/discover.md +37 -0
  620. package/workflows/execute.md +48 -0
  621. package/workflows/learn.md +38 -0
  622. package/workflows/plan-review.md +42 -0
  623. package/workflows/plan.md +39 -0
  624. package/workflows/prepare-next.md +37 -0
  625. package/workflows/review.md +40 -0
  626. package/workflows/run-audit.md +41 -0
  627. package/workflows/spec-challenge.md +41 -0
  628. package/workflows/specify.md +38 -0
  629. package/workflows/verify.md +37 -0
@@ -0,0 +1,891 @@
1
+ # API Testing — Expertise Module
2
+
3
+ > An API testing specialist validates the functional correctness, performance, security, and contract compliance of HTTP-based (REST, GraphQL) and RPC-based (gRPC) service interfaces. The scope covers test design across the API testing pyramid, contract testing between consumers and providers, schema validation, load/stress testing, security testing against OWASP API Top 10, and integration of API tests into CI/CD pipelines.
4
+
5
+ ---
6
+
7
+ ## Core Patterns & Conventions
8
+
9
+ ### API Testing Pyramid
10
+
11
+ Structure API tests in layers, with more tests at the bottom (fast, cheap) and fewer at the top (slow, expensive):
12
+
13
+ ```
14
+ / E2E \ ← Few: full user flows across real services
15
+ / Contract \ ← Medium: consumer-provider contract verification
16
+ / Integration \ ← Many: service + real DB/cache, no external deps
17
+ / Unit Tests \ ← Most: resolver/handler logic, mocked dependencies
18
+ ```
19
+
20
+ | Layer | Scope | Speed | Isolation | Tools |
21
+ |-------------|--------------------------------------|---------|-----------------|------------------------------------|
22
+ | Unit | Handler/resolver logic in isolation | <50ms | Full (all mocked)| Jest, Vitest, pytest |
23
+ | Integration | Service + real DB, cache, queue | <2s | Partial | Supertest, Testcontainers |
24
+ | Contract | Consumer-provider interface agreement| <5s | Consumer/provider| Pact v13, Specmatic 1.3+ |
25
+ | E2E | Full request through deployed stack | <30s | None | Playwright API, Bruno CLI, Postman |
26
+
27
+ **Rule of thumb:** Aim for 70% unit, 20% integration, 8% contract, 2% E2E for API test suites.
28
+
29
+ ### REST API Testing Patterns
30
+
31
+ Test every endpoint across five dimensions:
32
+
33
+ 1. **HTTP method correctness** — GET returns data, POST creates (201), PUT replaces, PATCH modifies, DELETE removes (204).
34
+ 2. **Status code accuracy** — Verify correct codes: 200, 201, 204, 400, 401, 403, 404, 409, 422, 429, 500.
35
+ 3. **Response body structure** — Validate JSON schema, field types, nullable fields, nested objects.
36
+ 4. **Header validation** — Content-Type, Cache-Control, CORS headers, rate-limit headers (X-RateLimit-*).
37
+ 5. **HATEOAS/links** — If using hypermedia, validate `_links` or `Link` headers for discoverability.
38
+
39
+ ```
40
+ Test Matrix per Endpoint:
41
+ ┌─────────────┬───────┬──────────┬──────────┬───────────┬──────────┐
42
+ │ Endpoint │ Happy │ Bad Input│ Auth │ Not Found │ Conflict │
43
+ ├─────────────┼───────┼──────────┼──────────┼───────────┼──────────┤
44
+ │ GET /users │ 200 │ 400 │ 401/403 │ - │ - │
45
+ │ POST /users │ 201 │ 422 │ 401/403 │ - │ 409 │
46
+ │ GET /users/1│ 200 │ 400 │ 401/403 │ 404 │ - │
47
+ │ PUT /users/1│ 200 │ 422 │ 401/403 │ 404 │ 409 │
48
+ │ DEL /users/1│ 204 │ 400 │ 401/403 │ 404 │ - │
49
+ └─────────────┴───────┴──────────┴──────────┴───────────┴──────────┘
50
+ ```
51
+
52
+ ### GraphQL Testing Patterns
53
+
54
+ GraphQL APIs require distinct testing strategies from REST:
55
+
56
+ - **Query validation** — Test valid queries return expected shapes; invalid queries return structured errors.
57
+ - **Mutation testing** — Verify create/update/delete operations and their side effects.
58
+ - **Subscription testing** — Use WebSocket clients to verify real-time event delivery.
59
+ - **Schema evolution** — Ensure new fields do not break existing queries (additive-only changes).
60
+ - **N+1 detection** — Use DataLoader and monitor resolver call counts in tests.
61
+ - **Depth/complexity limiting** — Verify queries exceeding max depth or complexity are rejected (HTTP 400).
62
+ - **Introspection control** — Verify introspection is disabled in production environments.
63
+
64
+ ```javascript
65
+ // Example: testing GraphQL query depth limiting
66
+ const deepQuery = `{ user { posts { comments { author { posts { comments { id }}}}}}}`;
67
+ const res = await request(app).post('/graphql').send({ query: deepQuery });
68
+ expect(res.body.errors[0].message).toContain('exceeds maximum depth');
69
+ ```
70
+
71
+ ### gRPC Testing Patterns
72
+
73
+ - **Proto contract validation** — Verify .proto files are backward compatible using `buf breaking`.
74
+ - **Unary RPC testing** — Standard request-response validation with proper status codes (OK, NOT_FOUND, INVALID_ARGUMENT).
75
+ - **Streaming tests** — Test server-streaming, client-streaming, and bidirectional streaming RPCs.
76
+ - **Deadline/timeout handling** — Verify services respect deadline propagation and return DEADLINE_EXCEEDED.
77
+ - **Metadata testing** — Validate gRPC metadata (headers/trailers) carry expected values.
78
+ - **Tools** — grpcurl for CLI testing, ghz (v0.120+) for load testing, Postman (v10+) for GUI-based gRPC testing.
79
+
80
+ ### Contract Testing
81
+
82
+ Contract testing verifies that consumer expectations match provider capabilities without requiring both services to run simultaneously.
83
+
84
+ **Consumer-Driven (Pact v13):**
85
+ 1. Consumer writes tests defining expected interactions (request shape + expected response).
86
+ 2. Pact generates a contract file (pact.json) from consumer tests.
87
+ 3. Provider verifies it can fulfill all consumer contracts.
88
+ 4. Pact Broker (or PactFlow) stores contracts and tracks verification status.
89
+
90
+ **Provider-Driven / Spec-Driven (Specmatic 1.3+):**
91
+ 1. OpenAPI spec serves as the contract.
92
+ 2. Specmatic generates tests from the spec automatically.
93
+ 3. Both consumer stubs and provider tests derived from the same spec.
94
+ 4. Backward compatibility checked by comparing spec versions.
95
+
96
+ **Best practices:**
97
+ - Use matchers (type-based) over exact values — contracts should be as loose as possible.
98
+ - Run consumer tests on every consumer commit; provider verification on every provider commit.
99
+ - Tag contracts with branch/environment (dev, staging, prod) via Pact Broker.
100
+ - Use `can-i-deploy` CLI to gate deployments based on contract verification status.
101
+
102
+ ### Schema Validation
103
+
104
+ Validate API responses against schemas at two levels:
105
+
106
+ 1. **Design-time** — Lint OpenAPI specs with Spectral (v6+) or Redocly CLI. Enforce naming conventions, require descriptions, ban breaking changes.
107
+ 2. **Runtime** — Validate responses against JSON Schema in tests using ajv (v8+) or zod.
108
+
109
+ ```javascript
110
+ // Runtime schema validation with ajv
111
+ import Ajv from 'ajv';
112
+ const ajv = new Ajv({ allErrors: true });
113
+ const validate = ajv.compile(userSchema);
114
+ const valid = validate(response.body);
115
+ expect(valid).toBe(true);
116
+ expect(validate.errors).toBeNull();
117
+ ```
118
+
119
+ ### Test Data Management
120
+
121
+ - **Factories over fixtures** — Use libraries like fishery (TS) or factory-bot (Ruby) to generate test data programmatically.
122
+ - **Database seeding** — Use dedicated seed scripts; reset DB state before each test suite (not each test for speed).
123
+ - **Isolated test databases** — Use Testcontainers to spin up ephemeral Postgres/MySQL/MongoDB per test run.
124
+ - **Avoid shared mutable state** — Each test should create its own data; never depend on data from another test.
125
+ - **Sensitive data** — Use faker.js/Faker (Python) for PII; never use production data in tests.
126
+
127
+ ### API Versioning Testing
128
+
129
+ - **URL versioning** (`/v1/`, `/v2/`) — Test both versions simultaneously during migration periods.
130
+ - **Header versioning** (`Accept: application/vnd.api+json;version=2`) — Verify correct version routing.
131
+ - **Backward compatibility** — Old clients must continue working after new version deploys.
132
+ - **Deprecation headers** — Verify `Sunset` and `Deprecation` headers are present on deprecated endpoints.
133
+ - **Version matrix testing** — Maintain a test suite per active version; retire tests when versions sunset.
134
+
135
+ ### Idempotency Testing
136
+
137
+ - **POST with Idempotency-Key** — Send identical POST requests with same key; verify only one resource created.
138
+ - **PUT idempotency** — Verify repeated PUT requests produce identical state.
139
+ - **DELETE idempotency** — Second DELETE should return 204 or 404 consistently (document which).
140
+ - **Concurrent idempotency** — Send parallel identical requests; verify no duplicate side effects.
141
+ - **Key expiry** — Verify idempotency keys expire after documented TTL.
142
+
143
+ ### Pagination and Filtering Testing
144
+
145
+ - **Offset-based** — Test `?page=1&limit=20`, verify total count, boundary pages (first/last/beyond).
146
+ - **Cursor-based** — Test `?cursor=abc&limit=20`, verify next/prev cursors, empty pages.
147
+ - **Filtering** — Test each filter parameter independently and in combination.
148
+ - **Sorting** — Verify `?sort=created_at:desc` returns correctly ordered results.
149
+ - **Edge cases** — Empty results, single result, limit=0, limit=max+1, negative page numbers.
150
+ - **Consistency** — Verify pagination remains stable when data changes between page fetches (cursor > offset).
151
+
152
+ ---
153
+
154
+ ## Anti-Patterns & Pitfalls
155
+
156
+ ### 1. Testing Only the Happy Path
157
+ **Why it is a problem:** Production traffic includes malformed requests, missing fields, wrong types, and boundary values. If you only test valid inputs, you miss entire categories of bugs — 400-level errors, validation gaps, and crash-inducing payloads reach production.
158
+
159
+ ### 2. Hardcoding Test Data and URLs
160
+ **Why it is a problem:** Tests break when environments change. Hardcoded IDs couple tests to specific database state. Use environment variables for URLs and factories/builders for test data.
161
+
162
+ ### 3. Ignoring Response Schema Validation
163
+ **Why it is a problem:** A test that checks `status === 200` but ignores the response body can pass even when the API returns completely wrong data. Always validate response structure against a schema (OpenAPI, JSON Schema, or Zod).
164
+
165
+ ### 4. Sharing Mutable State Between Tests
166
+ **Why it is a problem:** Test A creates a user; Test B updates it; Test C deletes it. If Test B fails, Test C fails too — but not because of its own bug. This creates flaky, order-dependent test suites that are impossible to debug or parallelize.
167
+
168
+ ### 5. Over-Mocking (Testing the Mocks, Not the API)
169
+ **Why it is a problem:** When you mock the HTTP client, database, and every dependency, you are testing whether your mock returns what you told it to return. Integration tests with real databases (via Testcontainers) catch real bugs that unit tests with mocks miss entirely.
170
+
171
+ ### 6. Ice Cream Cone Anti-Pattern
172
+ **Why it is a problem:** Having more E2E tests than unit/integration tests inverts the testing pyramid. E2E tests are slow (10-60s each), flaky (network, timing), and expensive to maintain. A suite of 500 E2E tests creates a 2-hour CI pipeline that nobody trusts.
173
+
174
+ ### 7. Not Testing Error Responses
175
+ **Why it is a problem:** APIs must return structured, consistent error responses (error code, message, field-level details). If error responses are untested, consumers get inconsistent formats — sometimes a string, sometimes an object, sometimes HTML — breaking client error handling.
176
+
177
+ ### 8. Ignoring Authentication and Authorization Edge Cases
178
+ **Why it is a problem:** Testing only "valid token returns 200" misses critical security bugs: expired tokens, tokens with wrong scopes, tokens for wrong tenant, missing tokens. Each of these must return the correct 401/403 with appropriate error details.
179
+
180
+ ### 9. Not Testing Rate Limiting
181
+ **Why it is a problem:** Rate limits protect your API from abuse and resource exhaustion. Without tests, you discover they are misconfigured when a client gets throttled unexpectedly or — worse — when a DDoS succeeds because limits were never enforced.
182
+
183
+ ### 10. Coupling Tests to Implementation Details
184
+ **Why it is a problem:** Testing internal database state, checking SQL queries, or asserting on internal function calls makes tests break when you refactor internals, even if the API behavior is unchanged. Test the API contract (request in, response out), not the implementation.
185
+
186
+ ### 11. Making Tests Too DRY
187
+ **Why it is a problem:** Over-abstracting test code into helper functions and shared variables makes individual tests unreadable. Test code should be DAMP (Descriptive And Meaningful Phrases) — some repetition is acceptable if it makes each test self-contained and easy to understand when it fails.
188
+
189
+ ### 12. Not Testing Backward Compatibility
190
+ **Why it is a problem:** Adding a required field, changing a field type, or removing an endpoint breaks existing clients silently. Without backward compatibility tests, you ship breaking changes that cause production incidents for consumers.
191
+
192
+ ### 13. Sequential Test Dependencies
193
+ **Why it is a problem:** Tests that must run in a specific order (create -> read -> update -> delete) cannot be parallelized and create cascading failures. Each test should set up its own preconditions and tear down its own data.
194
+
195
+ ### 14. Ignoring Timeout and Retry Behavior
196
+ **Why it is a problem:** APIs that do not handle timeouts gracefully can hang indefinitely. Clients that do not implement retry with backoff can amplify failures. Test that your API responds within documented SLA even under load, and that client retries use exponential backoff.
197
+
198
+ ### 15. Testing Against Production Data
199
+ **Why it is a problem:** Using production data in tests risks exposing PII, creates GDPR/compliance violations, and makes tests non-deterministic (data changes). Use synthetic data generators (faker.js, Faker) with realistic but fictional data.
200
+
201
+ ---
202
+
203
+ ## Testing Strategy
204
+
205
+ ### What to Test at Each Layer
206
+
207
+ | Layer | What to Test |
208
+ |-------------|---------------------------------------------------------------------|
209
+ | Unit | Input validation, business logic, serialization, error mapping |
210
+ | Integration | DB queries, cache behavior, queue publish/consume, external calls |
211
+ | Contract | Request/response shapes between consumer and provider |
212
+ | E2E | Critical user journeys across deployed services, auth flows |
213
+
214
+ ### Positive, Negative, Boundary, and Edge Case Testing
215
+
216
+ **Positive tests** — Valid inputs produce expected outputs:
217
+ - Correct request body returns 200/201 with expected data.
218
+ - Valid query parameters filter/sort correctly.
219
+
220
+ **Negative tests** — Invalid inputs produce appropriate errors:
221
+ - Missing required fields return 422 with field-level errors.
222
+ - Wrong data types (string where int expected) return 400.
223
+ - Unauthorized requests return 401; forbidden requests return 403.
224
+
225
+ **Boundary tests** — Limits of acceptable input:
226
+ - String fields at min/max length.
227
+ - Numeric fields at min/max value, zero, negative.
228
+ - Array fields empty, at max size, one over max.
229
+ - Date fields at epoch, far future, leap seconds.
230
+
231
+ **Edge case tests** — Unusual but valid scenarios:
232
+ - Unicode, emoji, RTL text in string fields.
233
+ - Extremely large payloads (test 413 response).
234
+ - Concurrent requests for the same resource.
235
+ - Requests during service deployment (graceful shutdown).
236
+
237
+ ### Authentication and Authorization Testing
238
+
239
+ ```
240
+ Auth Test Matrix:
241
+ ┌───────────────────────┬──────┬──────┬──────┬──────┐
242
+ │ Scenario │ GET │ POST │ PUT │ DEL │
243
+ ├───────────────────────┼──────┼──────┼──────┼──────┤
244
+ │ No token │ 401 │ 401 │ 401 │ 401 │
245
+ │ Expired token │ 401 │ 401 │ 401 │ 401 │
246
+ │ Malformed token │ 401 │ 401 │ 401 │ 401 │
247
+ │ Valid token, no scope │ 403 │ 403 │ 403 │ 403 │
248
+ │ Valid token, read │ 200 │ 403 │ 403 │ 403 │
249
+ │ Valid token, write │ 200 │ 201 │ 200 │ 204 │
250
+ │ Valid token, admin │ 200 │ 201 │ 200 │ 204 │
251
+ │ Other tenant's token │ 403 │ 403 │ 403 │ 403 │
252
+ └───────────────────────┴──────┴──────┴──────┴──────┘
253
+ ```
254
+
255
+ ### Rate Limiting and Throttling Tests
256
+
257
+ - Verify `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.
258
+ - Send requests at the limit boundary; verify 429 returned at limit+1.
259
+ - Verify `Retry-After` header value is accurate.
260
+ - Test per-user, per-IP, and per-API-key rate limits independently.
261
+ - Verify rate limits reset correctly after the window expires.
262
+
263
+ ### Error Response Validation
264
+
265
+ Enforce a consistent error response format across all endpoints:
266
+
267
+ ```json
268
+ {
269
+ "error": {
270
+ "code": "VALIDATION_ERROR",
271
+ "message": "Request validation failed",
272
+ "details": [
273
+ { "field": "email", "message": "must be a valid email address" },
274
+ { "field": "age", "message": "must be a positive integer" }
275
+ ],
276
+ "requestId": "req_abc123",
277
+ "timestamp": "2026-03-07T12:00:00Z"
278
+ }
279
+ }
280
+ ```
281
+
282
+ Test that ALL error paths (400, 401, 403, 404, 409, 422, 429, 500) follow this format.
283
+
284
+ ### Backward Compatibility Testing
285
+
286
+ - **Additive changes** — New optional fields, new endpoints: verify old clients still work.
287
+ - **Spec diffing** — Use `oasdiff` (v1.10+) to detect breaking changes between OpenAPI spec versions.
288
+ - **Consumer contract replay** — Run all existing Pact contracts against the new provider version.
289
+ - **Shadow testing** — Replay production traffic against the new version and compare responses.
290
+
291
+ ### Load and Stress Testing
292
+
293
+ | Pattern | Description | Tool |
294
+ |-----------|----------------------------------------------------|----------------|
295
+ | Ramp-up | Gradually increase users: 0→100 over 5 min | k6, Artillery |
296
+ | Spike | Sudden burst: 10→500 users instantly | k6, Locust |
297
+ | Soak | Sustained load for 2-4 hours; detect memory leaks | k6, Gatling |
298
+ | Stress | Push beyond capacity until failure; find break point| k6, Locust |
299
+ | Breakpoint| Incrementally add load until error rate > threshold | k6 |
300
+
301
+ ---
302
+
303
+ ## Performance Considerations
304
+
305
+ ### API Performance Benchmarking
306
+
307
+ Establish baselines before optimizing. Measure under realistic conditions:
308
+
309
+ - **Warm-up phase** — Run 30-60s of traffic before measuring to prime caches and JIT.
310
+ - **Steady-state measurement** — Collect metrics over 5+ minutes of stable load.
311
+ - **Percentile-based reporting** — Never use averages alone; always report p50, p95, p99.
312
+
313
+ ### Response Time Thresholds
314
+
315
+ | Tier | p50 Target | p95 Target | p99 Target |
316
+ |-----------------------|------------|------------|------------|
317
+ | Internal microservice | <50ms | <100ms | <200ms |
318
+ | Public REST API | <200ms | <500ms | <1000ms |
319
+ | Complex queries/reports| <500ms | <2000ms | <5000ms |
320
+ | Real-time/WebSocket | <20ms | <50ms | <100ms |
321
+
322
+ **Rule:** p99 should be within 2-3x of p50. A wider gap indicates tail latency issues (GC pauses, cold caches, lock contention).
323
+
324
+ **SLO example:** "99th percentile latency for `/api/v1/orders` under 500ms at 1000 RPS, measured over 30-day rolling window."
325
+
326
+ ### Load Testing Patterns
327
+
328
+ ```
329
+ Ramp-Up Pattern: Spike Pattern:
330
+ Users Users
331
+ 100 ┤ ┌──────┐ 500 ┤ ┌┐
332
+ 75 ┤ /│ │ 375 ┤ ││
333
+ 50 ┤ / │ │ 250 ┤ ││
334
+ 25 ┤ / │ │ 125 ┤ ││
335
+ 0 ┤─/ │ └── 0 ┤──┘└──────
336
+ 0 2 4 6 8 10 min 0 2 4 6 8 min
337
+
338
+ Soak Pattern: Stress/Breakpoint:
339
+ Users Users
340
+ 100 ┤ ┌────────────┐ 500 ┤ /
341
+ 75 ┤ │ │ 375 ┤ /
342
+ 50 ┤ │ │ 250 ┤ /
343
+ 25 ┤ /│ │ 125 ┤ /
344
+ 0 ┤/ │ └── 0 ┤────/
345
+ 0 2 4 hours 0 5 10 15 20 min
346
+ ```
347
+
348
+ ### Throughput Testing
349
+
350
+ - Measure **requests per second (RPS)** at various concurrency levels.
351
+ - Identify the **saturation point** — the RPS where error rate exceeds 1% or latency exceeds SLA.
352
+ - Test **payload size impact** — compare throughput for 1KB, 10KB, 100KB, 1MB responses.
353
+ - Verify **connection pooling** — test with and without keep-alive; measure connection setup overhead.
354
+
355
+ ### Connection Handling Testing
356
+
357
+ - **Keep-alive** — Verify HTTP/1.1 keep-alive reduces latency for sequential requests.
358
+ - **Connection limits** — Test behavior when max connections reached (should queue, not crash).
359
+ - **Graceful shutdown** — During deployment, verify in-flight requests complete (drain period).
360
+ - **HTTP/2 multiplexing** — Verify concurrent streams over single connection improve throughput.
361
+ - **WebSocket stability** — Hold connections open for hours; verify no memory leaks or disconnects.
362
+
363
+ ---
364
+
365
+ ## Security Considerations
366
+
367
+ ### OWASP API Security Top 10 (2023 Edition)
368
+
369
+ | # | Risk | Test Approach |
370
+ |-----|----------------------------------------------|----------------------------------------------------------|
371
+ | API1| Broken Object Level Authorization (BOLA) | Access resource with ID belonging to another user/tenant |
372
+ | API2| Broken Authentication | Test weak passwords, credential stuffing, token reuse |
373
+ | API3| Broken Object Property Level Authorization | Send fields user should not update (role, isAdmin) |
374
+ | API4| Unrestricted Resource Consumption | Send huge payloads, deep nesting, many concurrent reqs |
375
+ | API5| Broken Function Level Authorization (BFLA) | Call admin endpoints with regular user credentials |
376
+ | API6| Unrestricted Access to Sensitive Business Flows| Automate business flows (purchase, signup) at scale |
377
+ | API7| Server-Side Request Forgery (SSRF) | Inject internal URLs in URL-accepting parameters |
378
+ | API8| Security Misconfiguration | Check default credentials, verbose errors, open CORS |
379
+ | API9| Improper Inventory Management | Discover undocumented/shadow endpoints via fuzzing |
380
+ | API10| Unsafe Consumption of APIs | Test how your API handles malicious data from third parties|
381
+
382
+ ### Authentication Bypass Testing
383
+
384
+ - Attempt access without any credentials (missing Authorization header).
385
+ - Send expired, revoked, and malformed JWT tokens.
386
+ - Test JWT algorithm confusion (alg: none, RS256→HS256).
387
+ - Verify token signature validation (modify payload, keep signature).
388
+ - Test OAuth2 flows: authorization code replay, PKCE bypass, scope escalation.
389
+ - Check for API keys exposed in URLs, logs, or error messages.
390
+
391
+ ### Injection Testing
392
+
393
+ - **SQL injection** — `' OR 1=1 --`, `'; DROP TABLE users; --` in query parameters and body fields.
394
+ - **NoSQL injection** — `{"$gt": ""}`, `{"$ne": null}` in MongoDB query parameters.
395
+ - **Command injection** — `; ls -la`, `| cat /etc/passwd` in fields processed by shell commands.
396
+ - **LDAP injection** — `*)(uid=*))(|(uid=*` in authentication fields.
397
+ - **Header injection** — `\r\nX-Injected: true` in user-controlled header values.
398
+
399
+ Use Schemathesis (v3.36+) for automated property-based fuzzing against OpenAPI specs — academic research shows it detects 1.4x-4.5x more defects than other fuzzing tools.
400
+
401
+ ### Broken Authorization Testing (BOLA/BFLA)
402
+
403
+ ```
404
+ BOLA Test Pattern:
405
+ User A owns Resource 1
406
+ User B owns Resource 2
407
+
408
+ Test: User A requests GET /resources/2 → must return 403 or 404
409
+ Test: User A requests PUT /resources/2 → must return 403 or 404
410
+ Test: User A requests DELETE /resources/2 → must return 403 or 404
411
+
412
+ BFLA Test Pattern:
413
+ Regular user calls:
414
+ POST /admin/users → must return 403
415
+ DELETE /admin/config → must return 403
416
+ GET /internal/metrics → must return 403 or 404
417
+ ```
418
+
419
+ ### Rate Limiting and Resource Exhaustion
420
+
421
+ - Send requests exceeding documented rate limits; verify 429 response.
422
+ - Send extremely large request bodies (100MB+); verify 413 response.
423
+ - Send deeply nested JSON (1000+ levels); verify rejection.
424
+ - Open many concurrent connections; verify server remains responsive.
425
+ - Test slowloris attacks (slow headers/body); verify timeouts.
426
+
427
+ ### API Fuzzing
428
+
429
+ - **Schema-based fuzzing** — Schemathesis generates test cases from OpenAPI/GraphQL schemas automatically.
430
+ - **Property-based testing** — Use Hypothesis (Python) or fast-check (JS) for structured random input generation.
431
+ - **Mutation-based fuzzing** — Modify valid requests: swap types, add fields, truncate values, inject special characters.
432
+ - **Tools** — Schemathesis v3.36+, RESTler (Microsoft), Burp Suite API scanning, StackHawk (CI-integrated).
433
+
434
+ ---
435
+
436
+ ## Integration Patterns
437
+
438
+ ### CI/CD Integration for API Tests
439
+
440
+ ```yaml
441
+ # GitHub Actions example — layered API test pipeline
442
+ name: API Tests
443
+ on: [push, pull_request]
444
+
445
+ jobs:
446
+ unit-integration:
447
+ runs-on: ubuntu-latest
448
+ services:
449
+ postgres:
450
+ image: postgres:16
451
+ env:
452
+ POSTGRES_DB: test
453
+ POSTGRES_PASSWORD: test
454
+ ports: ['5432:5432']
455
+ steps:
456
+ - uses: actions/checkout@v4
457
+ - uses: actions/setup-node@v4
458
+ with: { node-version: '22' }
459
+ - run: npm ci
460
+ - run: npm run test:unit # <30s gate
461
+ - run: npm run test:integration # <2min gate
462
+
463
+ contract:
464
+ needs: unit-integration
465
+ runs-on: ubuntu-latest
466
+ steps:
467
+ - uses: actions/checkout@v4
468
+ - run: npm ci
469
+ - run: npm run test:contract
470
+ - run: npx pact-broker can-i-deploy # deployment gate
471
+
472
+ e2e:
473
+ needs: contract
474
+ runs-on: ubuntu-latest
475
+ steps:
476
+ - run: npm run test:e2e -- --project=api-tests
477
+ ```
478
+
479
+ ### Mock Servers
480
+
481
+ | Tool | Best For | Protocol Support | Spec-Driven |
482
+ |-----------|---------------------------------------|-------------------------|-------------|
483
+ | WireMock | Java/JVM ecosystems, complex scenarios| HTTP, HTTPS | Partial |
484
+ | MSW v2 | Frontend JS/TS, Service Workers | HTTP (browser + Node) | No |
485
+ | Prism v5 | OpenAPI-first teams, design-time mocks| HTTP (OpenAPI v2/v3.1) | Yes |
486
+ | Mockoon | GUI-based quick mocking | HTTP, HTTPS | Import only |
487
+ | json-server| Quick REST prototype from JSON file | HTTP | No |
488
+
489
+ **When to use each:**
490
+ - **Prism** — You have an OpenAPI spec and want auto-generated, spec-compliant mocks with validation.
491
+ - **WireMock** — You need stateful mocking, fault injection, or recording of real traffic for replay.
492
+ - **MSW** — You are mocking APIs consumed by a frontend application (intercepts at the network level).
493
+
494
+ ### Service Virtualization
495
+
496
+ Service virtualization goes beyond mocking by simulating entire service behaviors including stateful interactions, latency profiles, and failure modes:
497
+
498
+ - **Testcontainers** (v0.10+) — Spin up real dependencies (Postgres, Redis, Kafka) in containers per test run.
499
+ - **LocalStack** — Simulate AWS services (S3, SQS, DynamoDB) locally for integration tests.
500
+ - **WireMock Cloud** — Team-shared virtual services with recorded behaviors.
501
+
502
+ ### Test Environments and Data Isolation
503
+
504
+ - **Ephemeral environments** — Spin up per-PR preview environments (Vercel, Railway, Kubernetes namespaces).
505
+ - **Database isolation** — Use separate schemas or databases per test run; never share with other test suites.
506
+ - **Secret management** — Use environment-specific vaults (Doppler, AWS SSM); never hardcode API keys in tests.
507
+ - **Test data seeding** — Idempotent seed scripts that create known baseline data; run before each suite.
508
+
509
+ ### API Monitoring
510
+
511
+ - **Synthetic monitoring** — Scheduled API health checks from multiple regions (Checkly, Datadog Synthetics, Postman Monitors).
512
+ - **Contract monitoring** — Continuous verification that deployed APIs match their OpenAPI spec.
513
+ - **Alerting thresholds** — Alert on p99 > 2x baseline, error rate > 0.1%, or 5xx spike.
514
+ - **Dashboard metrics** — Request volume, latency percentiles, error rates, availability %, top errors by endpoint.
515
+
516
+ ---
517
+
518
+ ## DevOps & Deployment
519
+
520
+ ### API Test Gates in CI/CD
521
+
522
+ ```
523
+ PR Merge Gate (must pass):
524
+ ✓ Unit tests (< 1 min)
525
+ ✓ Integration tests (< 3 min)
526
+ ✓ Contract tests (< 2 min)
527
+ ✓ Schema lint (< 30s, via Spectral/Redocly)
528
+ ✓ Breaking change detection (< 30s, via oasdiff)
529
+
530
+ Staging Deploy Gate (must pass):
531
+ ✓ E2E API tests against staging
532
+ ✓ Smoke tests (critical paths only)
533
+ ✓ can-i-deploy (Pact Broker)
534
+
535
+ Production Deploy Gate:
536
+ ✓ Canary deployment with traffic split
537
+ ✓ Synthetic monitoring green for 15 min
538
+ ✓ Error rate < 0.1% on canary
539
+ ✓ p99 latency within SLA on canary
540
+ ```
541
+
542
+ ### Environment Management for API Testing
543
+
544
+ - **Environment parity** — Staging must mirror production in API versions, auth config, rate limits.
545
+ - **Feature flags** — Test API behavior with flags on and off; verify graceful degradation.
546
+ - **DNS/routing** — Use environment-specific base URLs via config, never hardcoded.
547
+ - **Data residency** — Ensure test environments comply with same data residency rules as production.
548
+
549
+ ### Test Data Seeding and Cleanup
550
+
551
+ - **Before suite** — Run idempotent seed scripts to create baseline data (users, products, config).
552
+ - **Before each test** — Create test-specific data via API calls or direct DB inserts.
553
+ - **After each test** — Clean up created resources (soft delete or hard delete depending on test type).
554
+ - **After suite** — Drop ephemeral databases/schemas; garbage-collect orphaned test data.
555
+ - **Never** — Depend on manually created data in shared environments.
556
+
557
+ ### API Documentation Testing
558
+
559
+ | Tool | Approach | Best For |
560
+ |--------------|------------------------------------|-----------------------------------|
561
+ | Schemathesis | Property-based fuzzing from spec | Finding edge cases, security bugs |
562
+ | Dredd | Contract validation against spec | Ensuring doc matches implementation|
563
+ | Optic | Diff-based API change detection | Catching undocumented changes |
564
+ | oasdiff | Breaking change detection | CI gate for backward compatibility|
565
+ | Spectral | OpenAPI spec linting | Enforcing API design standards |
566
+
567
+ Run `schemathesis run --url http://localhost:3000 --spec openapi.yaml` in CI to catch undocumented behaviors.
568
+
569
+ ### Production API Monitoring
570
+
571
+ - **Health checks** — `GET /health` returning service status, dependency connectivity, version info.
572
+ - **Canary analysis** — Compare canary metrics (latency, error rate) against baseline automatically.
573
+ - **Alerting** — PagerDuty/Opsgenie alerts on availability < 99.9%, error rate > 0.5%, p99 > SLA.
574
+ - **Runbooks** — Link alerts to API-specific runbooks with diagnostic steps and rollback procedures.
575
+
576
+ ---
577
+
578
+ ## Decision Trees
579
+
580
+ ### Which API Testing Tool?
581
+
582
+ ```
583
+ Start: What is your primary need?
584
+
585
+ ├─ Automated tests in code (CI/CD)?
586
+ │ ├─ Node.js/TypeScript project?
587
+ │ │ ├─ Testing Express/Fastify/Nest directly? → Supertest + Jest/Vitest
588
+ │ │ ├─ Testing deployed API + browser tests? → Playwright API Testing
589
+ │ │ └─ Contract testing needed? → Pact JS v13
590
+ │ ├─ Python project?
591
+ │ │ ├─ Testing FastAPI/Django directly? → pytest + httpx
592
+ │ │ └─ Load testing needed? → Locust
593
+ │ └─ JVM project? → REST Assured + WireMock
594
+
595
+ ├─ Manual/exploratory API testing?
596
+ │ ├─ Need Git-native, no cloud dependency? → Bruno
597
+ │ ├─ Need team collaboration + cloud sync? → Postman
598
+ │ └─ Need OpenAPI-first mock server? → Prism
599
+
600
+ └─ Load/performance testing?
601
+ ├─ Developer-friendly, JS scripting, CI-native? → k6 (v1.0+)
602
+ ├─ Python team, distributed testing? → Locust
603
+ └─ YAML-based, quick setup? → Artillery (v2.0+)
604
+ ```
605
+
606
+ ### Contract Testing: When and How?
607
+
608
+ ```
609
+ Start: How many services consume your API?
610
+
611
+ ├─ 1 consumer (monolith or single client)
612
+ │ └─ Contract testing optional
613
+ │ └─ Use integration tests + OpenAPI validation instead
614
+
615
+ ├─ 2-5 consumers
616
+ │ ├─ Consumers owned by same team? → Spec-driven (Specmatic)
617
+ │ └─ Consumers owned by different teams? → Consumer-driven (Pact)
618
+
619
+ └─ 6+ consumers or public API
620
+ ├─ Have OpenAPI spec as source of truth? → Specmatic + oasdiff
621
+ ├─ No spec, consumers define needs? → Pact + PactFlow
622
+ └─ Both? → Pact for internal + Schemathesis for public
623
+ ```
624
+
625
+ ### When to Mock vs Use Real Dependencies?
626
+
627
+ ```
628
+ Start: What dependency are you testing against?
629
+
630
+ ├─ Database (Postgres, MongoDB, Redis)
631
+ │ ├─ Unit tests → Mock the repository layer
632
+ │ └─ Integration tests → Use Testcontainers (real DB in Docker)
633
+
634
+ ├─ External third-party API (Stripe, Twilio, AWS)
635
+ │ ├─ Unit tests → Mock the HTTP client
636
+ │ ├─ Integration tests → Use WireMock/MSW with recorded responses
637
+ │ └─ E2E tests → Use sandbox/test environments provided by vendor
638
+
639
+ ├─ Internal microservice
640
+ │ ├─ Unit tests → Mock the service client
641
+ │ ├─ Contract tests → Use Pact (consumer mock, provider verify)
642
+ │ └─ E2E tests → Use real service in staging
643
+
644
+ └─ Message queue (Kafka, RabbitMQ, SQS)
645
+ ├─ Unit tests → Mock the producer/consumer
646
+ └─ Integration tests → Use Testcontainers (real broker)
647
+ ```
648
+
649
+ ---
650
+
651
+ ## Code Examples
652
+
653
+ ### 1. REST API Testing with Supertest + Jest
654
+
655
+ ```typescript
656
+ // tests/api/users.test.ts
657
+ import request from 'supertest';
658
+ import { app } from '../../src/app';
659
+ import { db } from '../../src/db';
660
+
661
+ describe('POST /api/v1/users', () => {
662
+ afterEach(async () => {
663
+ await db('users').truncate();
664
+ });
665
+
666
+ it('creates a user with valid data', async () => {
667
+ const res = await request(app)
668
+ .post('/api/v1/users')
669
+ .send({ name: 'Ada Lovelace', email: 'ada@example.com' })
670
+ .set('Authorization', `Bearer ${testToken}`)
671
+ .expect('Content-Type', /json/)
672
+ .expect(201);
673
+
674
+ expect(res.body).toMatchObject({
675
+ id: expect.any(String),
676
+ name: 'Ada Lovelace',
677
+ email: 'ada@example.com',
678
+ createdAt: expect.stringMatching(/^\d{4}-\d{2}-\d{2}/),
679
+ });
680
+ });
681
+
682
+ it('returns 422 for invalid email', async () => {
683
+ const res = await request(app)
684
+ .post('/api/v1/users')
685
+ .send({ name: 'Test', email: 'not-an-email' })
686
+ .set('Authorization', `Bearer ${testToken}`)
687
+ .expect(422);
688
+
689
+ expect(res.body.error.details).toContainEqual(
690
+ expect.objectContaining({ field: 'email' })
691
+ );
692
+ });
693
+
694
+ it('returns 401 without auth token', async () => {
695
+ await request(app)
696
+ .post('/api/v1/users')
697
+ .send({ name: 'Test', email: 'test@example.com' })
698
+ .expect(401);
699
+ });
700
+ });
701
+ ```
702
+
703
+ ### 2. Playwright API Testing
704
+
705
+ ```typescript
706
+ // tests/api/orders.spec.ts
707
+ import { test, expect } from '@playwright/test';
708
+
709
+ test.describe('Orders API', () => {
710
+ let orderId: string;
711
+
712
+ test('creates an order and retrieves it', async ({ request }) => {
713
+ // Create
714
+ const createRes = await request.post('/api/v1/orders', {
715
+ data: {
716
+ items: [{ productId: 'prod_001', quantity: 2 }],
717
+ shippingAddress: { city: 'London', postalCode: 'SW1A 1AA' },
718
+ },
719
+ headers: { Authorization: `Bearer ${process.env.TEST_TOKEN}` },
720
+ });
721
+ expect(createRes.status()).toBe(201);
722
+
723
+ const order = await createRes.json();
724
+ orderId = order.id;
725
+ expect(order.items).toHaveLength(1);
726
+ expect(order.status).toBe('pending');
727
+
728
+ // Retrieve
729
+ const getRes = await request.get(`/api/v1/orders/${orderId}`, {
730
+ headers: { Authorization: `Bearer ${process.env.TEST_TOKEN}` },
731
+ });
732
+ expect(getRes.status()).toBe(200);
733
+ expect(await getRes.json()).toMatchObject({ id: orderId, status: 'pending' });
734
+ });
735
+
736
+ test('returns 404 for non-existent order', async ({ request }) => {
737
+ const res = await request.get('/api/v1/orders/non_existent_id', {
738
+ headers: { Authorization: `Bearer ${process.env.TEST_TOKEN}` },
739
+ });
740
+ expect(res.status()).toBe(404);
741
+ });
742
+ });
743
+ ```
744
+
745
+ ### 3. Pact Consumer Contract Test (Pact JS v13)
746
+
747
+ ```typescript
748
+ // tests/contract/user-service.consumer.pact.ts
749
+ import { PactV4, MatchersV3 } from '@pact-foundation/pact';
750
+ import { UserApiClient } from '../../src/clients/user-api';
751
+
752
+ const { like, eachLike, string, integer, uuid } = MatchersV3;
753
+
754
+ const provider = new PactV4({
755
+ consumer: 'OrderService',
756
+ provider: 'UserService',
757
+ });
758
+
759
+ describe('UserService API Contract', () => {
760
+ it('returns user details by ID', async () => {
761
+ await provider
762
+ .addInteraction()
763
+ .given('user with ID user-001 exists')
764
+ .uponReceiving('a request for user details')
765
+ .withRequest('GET', '/api/v1/users/user-001', (builder) => {
766
+ builder.headers({ Accept: 'application/json' });
767
+ })
768
+ .willRespondWith(200, (builder) => {
769
+ builder
770
+ .headers({ 'Content-Type': 'application/json' })
771
+ .jsonBody({
772
+ id: uuid('user-001'),
773
+ name: string('Ada Lovelace'),
774
+ email: string('ada@example.com'),
775
+ orderCount: integer(5),
776
+ });
777
+ })
778
+ .executeTest(async (mockServer) => {
779
+ const client = new UserApiClient(mockServer.url);
780
+ const user = await client.getUserById('user-001');
781
+
782
+ expect(user.id).toBe('user-001');
783
+ expect(user.name).toBeDefined();
784
+ expect(user.email).toContain('@');
785
+ });
786
+ });
787
+ });
788
+ ```
789
+
790
+ ### 4. k6 Load Test Script
791
+
792
+ ```javascript
793
+ // load-tests/api-load.js
794
+ import http from 'k6/http';
795
+ import { check, sleep } from 'k6';
796
+ import { Rate, Trend } from 'k6/metrics';
797
+
798
+ const errorRate = new Rate('errors');
799
+ const orderLatency = new Trend('order_latency');
800
+
801
+ export const options = {
802
+ stages: [
803
+ { duration: '2m', target: 50 }, // ramp up to 50 users
804
+ { duration: '5m', target: 50 }, // hold at 50 users
805
+ { duration: '2m', target: 200 }, // ramp up to 200 users
806
+ { duration: '5m', target: 200 }, // hold at 200 users
807
+ { duration: '2m', target: 0 }, // ramp down
808
+ ],
809
+ thresholds: {
810
+ http_req_duration: ['p(95)<500', 'p(99)<1000'], // 95% < 500ms, 99% < 1s
811
+ errors: ['rate<0.01'], // error rate < 1%
812
+ order_latency: ['p(95)<800'],
813
+ },
814
+ };
815
+
816
+ const BASE_URL = __ENV.BASE_URL || 'http://localhost:3000';
817
+ const AUTH_TOKEN = __ENV.AUTH_TOKEN;
818
+
819
+ export default function () {
820
+ // List orders
821
+ const listRes = http.get(`${BASE_URL}/api/v1/orders?page=1&limit=10`, {
822
+ headers: { Authorization: `Bearer ${AUTH_TOKEN}` },
823
+ });
824
+ check(listRes, {
825
+ 'list status is 200': (r) => r.status === 200,
826
+ 'list returns array': (r) => Array.isArray(r.json().data),
827
+ }) || errorRate.add(1);
828
+
829
+ // Create order
830
+ const createRes = http.post(
831
+ `${BASE_URL}/api/v1/orders`,
832
+ JSON.stringify({
833
+ items: [{ productId: 'prod_001', quantity: 1 }],
834
+ }),
835
+ {
836
+ headers: {
837
+ 'Content-Type': 'application/json',
838
+ Authorization: `Bearer ${AUTH_TOKEN}`,
839
+ },
840
+ }
841
+ );
842
+ check(createRes, {
843
+ 'create status is 201': (r) => r.status === 201,
844
+ 'create returns id': (r) => r.json().id !== undefined,
845
+ }) || errorRate.add(1);
846
+ orderLatency.add(createRes.timings.duration);
847
+
848
+ sleep(1); // simulate user think time
849
+ }
850
+ ```
851
+
852
+ ### 5. OpenAPI Schema Validation in CI
853
+
854
+ ```typescript
855
+ // tests/schema/validate-responses.test.ts
856
+ import Ajv from 'ajv';
857
+ import addFormats from 'ajv-formats';
858
+ import request from 'supertest';
859
+ import { app } from '../../src/app';
860
+ import openApiSpec from '../../openapi.yaml'; // loaded via yaml-loader
861
+
862
+ const ajv = new Ajv({ allErrors: true, strict: false });
863
+ addFormats(ajv);
864
+
865
+ function getResponseSchema(path: string, method: string, status: number) {
866
+ return openApiSpec.paths[path]?.[method]?.responses?.[status]?.content
867
+ ?.['application/json']?.schema;
868
+ }
869
+
870
+ describe('Response Schema Validation', () => {
871
+ it('GET /api/v1/users matches OpenAPI schema', async () => {
872
+ const res = await request(app)
873
+ .get('/api/v1/users')
874
+ .set('Authorization', `Bearer ${testToken}`)
875
+ .expect(200);
876
+
877
+ const schema = getResponseSchema('/api/v1/users', 'get', 200);
878
+ const validate = ajv.compile(schema);
879
+ const valid = validate(res.body);
880
+
881
+ if (!valid) {
882
+ console.error('Schema validation errors:', validate.errors);
883
+ }
884
+ expect(valid).toBe(true);
885
+ });
886
+ });
887
+ ```
888
+
889
+ ---
890
+
891
+ *Researched: 2026-03-07 | Sources: [OWASP API Security Top 10 2023](https://owasp.org/API-Security/editions/2023/en/0x11-t10/), [Pact Documentation](https://docs.pact.io/), [Grafana k6 Documentation](https://grafana.com/docs/k6/latest/), [Playwright API Testing](https://playwright.dev/docs/api-testing), [Schemathesis](https://schemathesis.io/), [Specmatic Contract Testing](https://docs.specmatic.io/contract_driven_development/contract_testing), [Supertest npm](https://www.npmjs.com/package/supertest), [API Response Time Benchmarks](https://odown.com/blog/api-response-time-standards/), [Bruno API Client](https://www.usebruno.com/), [WireMock](https://wiremock.org/), [Capital One Schemathesis Guide](https://www.capitalone.com/tech/software-engineering/api-testing-schemathesis/), [BrowserStack API Simulation Tools](https://www.browserstack.com/guide/api-simulation-tools-comparison), [GraphQL Testing Best Practices](https://www.graphql-js.org/docs/testing-best-practices/), [Latency Percentiles Explained](https://oneuptime.com/blog/post/2025-09-15-p50-vs-p95-vs-p99-latency-percentiles/view)*