@tinkcarlos/skillora 0.2.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 (234) hide show
  1. package/.claude/skills/.temp-skill-index.md +245 -0
  2. package/.claude/skills/SKILL.md +264 -0
  3. package/.claude/skills/api-scaffolding/SKILL.md +431 -0
  4. package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
  5. package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
  6. package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
  7. package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
  8. package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
  9. package/.claude/skills/api-testing-observability/SKILL.md +583 -0
  10. package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
  11. package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
  12. package/.claude/skills/brainstorming/SKILL.md +283 -0
  13. package/.claude/skills/bug-fixing/SKILL.md +382 -0
  14. package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
  15. package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
  16. package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
  17. package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
  18. package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
  19. package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
  20. package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
  21. package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
  22. package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
  23. package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
  24. package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
  25. package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
  26. package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
  27. package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
  28. package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
  29. package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
  30. package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
  31. package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
  32. package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
  33. package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
  34. package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
  35. package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
  36. package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
  37. package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
  38. package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
  39. package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
  40. package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
  41. package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
  42. package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
  43. package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
  44. package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
  45. package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
  46. package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
  47. package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
  48. package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
  49. package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
  50. package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
  51. package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
  52. package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
  53. package/.claude/skills/code-review/SKILL.md +535 -0
  54. package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
  55. package/.claude/skills/code-review/references/automated-analysis.md +456 -0
  56. package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
  57. package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
  58. package/.claude/skills/code-review/references/backend-review.md +868 -0
  59. package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
  60. package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
  61. package/.claude/skills/code-review/references/common-patterns.md +321 -0
  62. package/.claude/skills/code-review/references/configuration-review.md +425 -0
  63. package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
  64. package/.claude/skills/code-review/references/database-review.md +298 -0
  65. package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
  66. package/.claude/skills/code-review/references/external-standards.md +51 -0
  67. package/.claude/skills/code-review/references/feature-review.md +329 -0
  68. package/.claude/skills/code-review/references/file-review-template.md +326 -0
  69. package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
  70. package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
  71. package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
  72. package/.claude/skills/code-review/references/frontend-review.md +783 -0
  73. package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
  74. package/.claude/skills/code-review/references/fullstack-review.md +477 -0
  75. package/.claude/skills/code-review/references/functional-completeness.md +386 -0
  76. package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
  77. package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
  78. package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
  79. package/.claude/skills/code-review/references/iteration-review.md +264 -0
  80. package/.claude/skills/code-review/references/job-review.md +335 -0
  81. package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
  82. package/.claude/skills/code-review/references/logic-completeness.md +535 -0
  83. package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
  84. package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
  85. package/.claude/skills/code-review/references/new-project-review.md +226 -0
  86. package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
  87. package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
  88. package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
  89. package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
  90. package/.claude/skills/code-review/references/python-patterns.md +494 -0
  91. package/.claude/skills/code-review/references/rca-techniques.md +362 -0
  92. package/.claude/skills/code-review/references/report-template.md +430 -0
  93. package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
  94. package/.claude/skills/code-review/references/review-dimensions.md +311 -0
  95. package/.claude/skills/code-review/references/review-guide.md +202 -0
  96. package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
  97. package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
  98. package/.claude/skills/code-review/references/review-record-template.md +195 -0
  99. package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
  100. package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
  101. package/.claude/skills/containerization/SKILL.md +313 -0
  102. package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
  103. package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
  104. package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
  105. package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
  106. package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
  107. package/.claude/skills/frontend-design/LICENSE.txt +177 -0
  108. package/.claude/skills/frontend-design/SKILL.md +587 -0
  109. package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
  110. package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
  111. package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
  112. package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
  113. package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
  114. package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
  115. package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
  116. package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
  117. package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
  118. package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
  119. package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
  120. package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
  121. package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
  122. package/.claude/skills/fullstack-developer/SKILL.md +512 -0
  123. package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
  124. package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
  125. package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
  126. package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
  127. package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
  128. package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
  129. package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
  130. package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
  131. package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
  132. package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
  133. package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
  134. package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
  135. package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
  136. package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
  137. package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
  138. package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
  139. package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
  140. package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
  141. package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
  142. package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
  143. package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
  144. package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
  145. package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
  146. package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
  147. package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
  148. package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
  149. package/.claude/skills/performance-optimization/SKILL.md +250 -0
  150. package/.claude/skills/product-requirements/SKILL.md +357 -0
  151. package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
  152. package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
  153. package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
  154. package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
  155. package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
  156. package/.claude/skills/product-requirements/references/external-standards.md +62 -0
  157. package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
  158. package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
  159. package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
  160. package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
  161. package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
  162. package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
  163. package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
  164. package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
  165. package/.claude/skills/react-best-practices/SKILL.md +198 -0
  166. package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
  167. package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
  168. package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
  169. package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
  170. package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
  171. package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
  172. package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
  173. package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
  174. package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
  175. package/.claude/skills/security-audit/SKILL.md +226 -0
  176. package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
  177. package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
  178. package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
  179. package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
  180. package/.claude/skills/shared-references/skill-call-graph.md +230 -0
  181. package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
  182. package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
  183. package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
  184. package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
  185. package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
  186. package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
  187. package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
  188. package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
  189. package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
  190. package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
  191. package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
  192. package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
  193. package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
  194. package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
  195. package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
  196. package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
  197. package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
  198. package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
  199. package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
  200. package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
  201. package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
  202. package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
  203. package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
  204. package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
  205. package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
  206. package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
  207. package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
  208. package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
  209. package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
  210. package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
  211. package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
  212. package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
  213. package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
  214. package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
  215. package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
  216. package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
  217. package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
  218. package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
  219. package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
  220. package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
  221. package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
  222. package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
  223. package/.claude/skills/test-driven-development/SKILL.md +246 -0
  224. package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
  225. package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
  226. package/.claude/skills/using-skillstack/SKILL.md +127 -0
  227. package/.claude/skills/vercel-deploy/SKILL.md +166 -0
  228. package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
  229. package/.claude/skills/verification-before-completion/SKILL.md +305 -0
  230. package/.claude/skills/writing-plans/SKILL.md +259 -0
  231. package/README.md +69 -0
  232. package/bin/cli.js +468 -0
  233. package/lib/init.js +333 -0
  234. package/package.json +29 -0
@@ -0,0 +1,1320 @@
1
+ # API Mocking Framework
2
+
3
+ You are an API mocking expert specializing in creating realistic mock services for development, testing, and demonstration purposes. Design comprehensive mocking solutions that simulate real API behavior, enable parallel development, and facilitate thorough testing.
4
+
5
+ ## Context
6
+ The user needs to create mock APIs for development, testing, or demonstration purposes. Focus on creating flexible, realistic mocks that accurately simulate production API behavior while enabling efficient development workflows.
7
+
8
+ ## Requirements
9
+ $ARGUMENTS
10
+
11
+ ## Instructions
12
+
13
+ ### 1. Mock Server Setup
14
+
15
+ Create comprehensive mock server infrastructure:
16
+
17
+ **Mock Server Framework**
18
+ ```python
19
+ from typing import Dict, List, Any, Optional
20
+ import json
21
+ import asyncio
22
+ from datetime import datetime
23
+ from fastapi import FastAPI, Request, Response
24
+ import uvicorn
25
+
26
+ class MockAPIServer:
27
+ def __init__(self, config: Dict[str, Any]):
28
+ self.app = FastAPI(title="Mock API Server")
29
+ self.routes = {}
30
+ self.middleware = []
31
+ self.state_manager = StateManager()
32
+ self.scenario_manager = ScenarioManager()
33
+
34
+ def setup_mock_server(self):
35
+ """Setup comprehensive mock server"""
36
+ # Configure middleware
37
+ self._setup_middleware()
38
+
39
+ # Load mock definitions
40
+ self._load_mock_definitions()
41
+
42
+ # Setup dynamic routes
43
+ self._setup_dynamic_routes()
44
+
45
+ # Initialize scenarios
46
+ self._initialize_scenarios()
47
+
48
+ return self.app
49
+
50
+ def _setup_middleware(self):
51
+ """Configure server middleware"""
52
+ @self.app.middleware("http")
53
+ async def add_mock_headers(request: Request, call_next):
54
+ response = await call_next(request)
55
+ response.headers["X-Mock-Server"] = "true"
56
+ response.headers["X-Mock-Scenario"] = self.scenario_manager.current_scenario
57
+ return response
58
+
59
+ @self.app.middleware("http")
60
+ async def simulate_latency(request: Request, call_next):
61
+ # Simulate network latency
62
+ latency = self._calculate_latency(request.url.path)
63
+ await asyncio.sleep(latency / 1000) # Convert to seconds
64
+ response = await call_next(request)
65
+ return response
66
+
67
+ @self.app.middleware("http")
68
+ async def track_requests(request: Request, call_next):
69
+ # Track request for verification
70
+ self.state_manager.track_request({
71
+ 'method': request.method,
72
+ 'path': str(request.url.path),
73
+ 'headers': dict(request.headers),
74
+ 'timestamp': datetime.now()
75
+ })
76
+ response = await call_next(request)
77
+ return response
78
+
79
+ def _setup_dynamic_routes(self):
80
+ """Setup dynamic route handling"""
81
+ @self.app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH"])
82
+ async def handle_mock_request(path: str, request: Request):
83
+ # Find matching mock
84
+ mock = self._find_matching_mock(request.method, path, request)
85
+
86
+ if not mock:
87
+ return Response(
88
+ content=json.dumps({"error": "No mock found for this endpoint"}),
89
+ status_code=404,
90
+ media_type="application/json"
91
+ )
92
+
93
+ # Process mock response
94
+ response_data = await self._process_mock_response(mock, request)
95
+
96
+ return Response(
97
+ content=json.dumps(response_data['body']),
98
+ status_code=response_data['status'],
99
+ headers=response_data['headers'],
100
+ media_type="application/json"
101
+ )
102
+
103
+ async def _process_mock_response(self, mock: Dict[str, Any], request: Request):
104
+ """Process and generate mock response"""
105
+ # Check for conditional responses
106
+ if mock.get('conditions'):
107
+ for condition in mock['conditions']:
108
+ if self._evaluate_condition(condition, request):
109
+ return await self._generate_response(condition['response'], request)
110
+
111
+ # Use default response
112
+ return await self._generate_response(mock['response'], request)
113
+
114
+ def _generate_response(self, response_template: Dict[str, Any], request: Request):
115
+ """Generate response from template"""
116
+ response = {
117
+ 'status': response_template.get('status', 200),
118
+ 'headers': response_template.get('headers', {}),
119
+ 'body': self._process_response_body(response_template['body'], request)
120
+ }
121
+
122
+ # Apply response transformations
123
+ if response_template.get('transformations'):
124
+ response = self._apply_transformations(response, response_template['transformations'])
125
+
126
+ return response
127
+ ```
128
+
129
+ ### 2. Request/Response Stubbing
130
+
131
+ Implement flexible stubbing system:
132
+
133
+ **Stubbing Engine**
134
+ ```python
135
+ class StubbingEngine:
136
+ def __init__(self):
137
+ self.stubs = {}
138
+ self.matchers = self._initialize_matchers()
139
+
140
+ def create_stub(self, method: str, path: str, **kwargs):
141
+ """Create a new stub"""
142
+ stub_id = self._generate_stub_id()
143
+
144
+ stub = {
145
+ 'id': stub_id,
146
+ 'method': method,
147
+ 'path': path,
148
+ 'matchers': self._build_matchers(kwargs),
149
+ 'response': kwargs.get('response', {}),
150
+ 'priority': kwargs.get('priority', 0),
151
+ 'times': kwargs.get('times', -1), # -1 for unlimited
152
+ 'delay': kwargs.get('delay', 0),
153
+ 'scenario': kwargs.get('scenario', 'default')
154
+ }
155
+
156
+ self.stubs[stub_id] = stub
157
+ return stub_id
158
+
159
+ def _build_matchers(self, kwargs):
160
+ """Build request matchers"""
161
+ matchers = []
162
+
163
+ # Path parameter matching
164
+ if 'path_params' in kwargs:
165
+ matchers.append({
166
+ 'type': 'path_params',
167
+ 'params': kwargs['path_params']
168
+ })
169
+
170
+ # Query parameter matching
171
+ if 'query_params' in kwargs:
172
+ matchers.append({
173
+ 'type': 'query_params',
174
+ 'params': kwargs['query_params']
175
+ })
176
+
177
+ # Header matching
178
+ if 'headers' in kwargs:
179
+ matchers.append({
180
+ 'type': 'headers',
181
+ 'headers': kwargs['headers']
182
+ })
183
+
184
+ # Body matching
185
+ if 'body' in kwargs:
186
+ matchers.append({
187
+ 'type': 'body',
188
+ 'body': kwargs['body'],
189
+ 'match_type': kwargs.get('body_match_type', 'exact')
190
+ })
191
+
192
+ return matchers
193
+
194
+ def match_request(self, request: Dict[str, Any]):
195
+ """Find matching stub for request"""
196
+ candidates = []
197
+
198
+ for stub in self.stubs.values():
199
+ if self._matches_stub(request, stub):
200
+ candidates.append(stub)
201
+
202
+ # Sort by priority and return best match
203
+ if candidates:
204
+ return sorted(candidates, key=lambda x: x['priority'], reverse=True)[0]
205
+
206
+ return None
207
+
208
+ def _matches_stub(self, request: Dict[str, Any], stub: Dict[str, Any]):
209
+ """Check if request matches stub"""
210
+ # Check method
211
+ if request['method'] != stub['method']:
212
+ return False
213
+
214
+ # Check path
215
+ if not self._matches_path(request['path'], stub['path']):
216
+ return False
217
+
218
+ # Check all matchers
219
+ for matcher in stub['matchers']:
220
+ if not self._evaluate_matcher(request, matcher):
221
+ return False
222
+
223
+ # Check if stub is still valid
224
+ if stub['times'] == 0:
225
+ return False
226
+
227
+ return True
228
+
229
+ def create_dynamic_stub(self):
230
+ """Create dynamic stub with callbacks"""
231
+ return '''
232
+ class DynamicStub:
233
+ def __init__(self, path_pattern: str):
234
+ self.path_pattern = path_pattern
235
+ self.response_generator = None
236
+ self.state_modifier = None
237
+
238
+ def with_response_generator(self, generator):
239
+ """Set dynamic response generator"""
240
+ self.response_generator = generator
241
+ return self
242
+
243
+ def with_state_modifier(self, modifier):
244
+ """Set state modification callback"""
245
+ self.state_modifier = modifier
246
+ return self
247
+
248
+ async def process_request(self, request: Request, state: Dict[str, Any]):
249
+ """Process request dynamically"""
250
+ # Extract request data
251
+ request_data = {
252
+ 'method': request.method,
253
+ 'path': request.url.path,
254
+ 'headers': dict(request.headers),
255
+ 'query_params': dict(request.query_params),
256
+ 'body': await request.json() if request.method in ['POST', 'PUT'] else None
257
+ }
258
+
259
+ # Modify state if needed
260
+ if self.state_modifier:
261
+ state = self.state_modifier(state, request_data)
262
+
263
+ # Generate response
264
+ if self.response_generator:
265
+ response = self.response_generator(request_data, state)
266
+ else:
267
+ response = {'status': 200, 'body': {}}
268
+
269
+ return response, state
270
+
271
+ # Usage example
272
+ dynamic_stub = DynamicStub('/api/users/{user_id}')
273
+ dynamic_stub.with_response_generator(lambda req, state: {
274
+ 'status': 200,
275
+ 'body': {
276
+ 'id': req['path_params']['user_id'],
277
+ 'name': state.get('users', {}).get(req['path_params']['user_id'], 'Unknown'),
278
+ 'request_count': state.get('request_count', 0)
279
+ }
280
+ }).with_state_modifier(lambda state, req: {
281
+ **state,
282
+ 'request_count': state.get('request_count', 0) + 1
283
+ })
284
+ '''
285
+ ```
286
+
287
+ ### 3. Dynamic Data Generation
288
+
289
+ Generate realistic mock data:
290
+
291
+ **Mock Data Generator**
292
+ ```python
293
+ from faker import Faker
294
+ import random
295
+ from datetime import datetime, timedelta
296
+
297
+ class MockDataGenerator:
298
+ def __init__(self):
299
+ self.faker = Faker()
300
+ self.templates = {}
301
+ self.generators = self._init_generators()
302
+
303
+ def generate_data(self, schema: Dict[str, Any]):
304
+ """Generate data based on schema"""
305
+ if isinstance(schema, dict):
306
+ if '$ref' in schema:
307
+ # Reference to another schema
308
+ return self.generate_data(self.resolve_ref(schema['$ref']))
309
+
310
+ result = {}
311
+ for key, value in schema.items():
312
+ if key.startswith('$'):
313
+ continue
314
+ result[key] = self._generate_field(value)
315
+ return result
316
+
317
+ elif isinstance(schema, list):
318
+ # Generate array
319
+ count = random.randint(1, 10)
320
+ return [self.generate_data(schema[0]) for _ in range(count)]
321
+
322
+ else:
323
+ return schema
324
+
325
+ def _generate_field(self, field_schema: Dict[str, Any]):
326
+ """Generate field value based on schema"""
327
+ field_type = field_schema.get('type', 'string')
328
+
329
+ # Check for custom generator
330
+ if 'generator' in field_schema:
331
+ return self._use_custom_generator(field_schema['generator'])
332
+
333
+ # Check for enum
334
+ if 'enum' in field_schema:
335
+ return random.choice(field_schema['enum'])
336
+
337
+ # Generate based on type
338
+ generators = {
339
+ 'string': self._generate_string,
340
+ 'number': self._generate_number,
341
+ 'integer': self._generate_integer,
342
+ 'boolean': self._generate_boolean,
343
+ 'array': self._generate_array,
344
+ 'object': lambda s: self.generate_data(s)
345
+ }
346
+
347
+ generator = generators.get(field_type, self._generate_string)
348
+ return generator(field_schema)
349
+
350
+ def _generate_string(self, schema: Dict[str, Any]):
351
+ """Generate string value"""
352
+ # Check for format
353
+ format_type = schema.get('format', '')
354
+
355
+ format_generators = {
356
+ 'email': self.faker.email,
357
+ 'name': self.faker.name,
358
+ 'first_name': self.faker.first_name,
359
+ 'last_name': self.faker.last_name,
360
+ 'phone': self.faker.phone_number,
361
+ 'address': self.faker.address,
362
+ 'url': self.faker.url,
363
+ 'uuid': self.faker.uuid4,
364
+ 'date': lambda: self.faker.date().isoformat(),
365
+ 'datetime': lambda: self.faker.date_time().isoformat(),
366
+ 'password': lambda: self.faker.password()
367
+ }
368
+
369
+ if format_type in format_generators:
370
+ return format_generators[format_type]()
371
+
372
+ # Check for pattern
373
+ if 'pattern' in schema:
374
+ return self._generate_from_pattern(schema['pattern'])
375
+
376
+ # Default string generation
377
+ min_length = schema.get('minLength', 5)
378
+ max_length = schema.get('maxLength', 20)
379
+ return self.faker.text(max_nb_chars=random.randint(min_length, max_length))
380
+
381
+ def create_data_templates(self):
382
+ """Create reusable data templates"""
383
+ return {
384
+ 'user': {
385
+ 'id': {'type': 'string', 'format': 'uuid'},
386
+ 'username': {'type': 'string', 'generator': 'username'},
387
+ 'email': {'type': 'string', 'format': 'email'},
388
+ 'profile': {
389
+ 'type': 'object',
390
+ 'properties': {
391
+ 'firstName': {'type': 'string', 'format': 'first_name'},
392
+ 'lastName': {'type': 'string', 'format': 'last_name'},
393
+ 'avatar': {'type': 'string', 'format': 'url'},
394
+ 'bio': {'type': 'string', 'maxLength': 200}
395
+ }
396
+ },
397
+ 'createdAt': {'type': 'string', 'format': 'datetime'},
398
+ 'status': {'type': 'string', 'enum': ['active', 'inactive', 'suspended']}
399
+ },
400
+ 'product': {
401
+ 'id': {'type': 'string', 'format': 'uuid'},
402
+ 'name': {'type': 'string', 'generator': 'product_name'},
403
+ 'description': {'type': 'string', 'maxLength': 500},
404
+ 'price': {'type': 'number', 'minimum': 0.01, 'maximum': 9999.99},
405
+ 'category': {'type': 'string', 'enum': ['electronics', 'clothing', 'food', 'books']},
406
+ 'inStock': {'type': 'boolean'},
407
+ 'rating': {'type': 'number', 'minimum': 0, 'maximum': 5}
408
+ }
409
+ }
410
+
411
+ def generate_relational_data(self):
412
+ """Generate data with relationships"""
413
+ return '''
414
+ class RelationalDataGenerator:
415
+ def generate_related_entities(self, schema: Dict[str, Any], count: int):
416
+ """Generate related entities maintaining referential integrity"""
417
+ entities = {}
418
+
419
+ # First pass: generate primary entities
420
+ for entity_name, entity_schema in schema['entities'].items():
421
+ entities[entity_name] = []
422
+ for i in range(count):
423
+ entity = self.generate_entity(entity_schema)
424
+ entity['id'] = f"{entity_name}_{i}"
425
+ entities[entity_name].append(entity)
426
+
427
+ # Second pass: establish relationships
428
+ for relationship in schema.get('relationships', []):
429
+ self.establish_relationship(entities, relationship)
430
+
431
+ return entities
432
+
433
+ def establish_relationship(self, entities: Dict[str, List], relationship: Dict):
434
+ """Establish relationships between entities"""
435
+ source = relationship['source']
436
+ target = relationship['target']
437
+ rel_type = relationship['type']
438
+
439
+ if rel_type == 'one-to-many':
440
+ for source_entity in entities[source['entity']]:
441
+ # Select random targets
442
+ num_targets = random.randint(1, 5)
443
+ target_refs = random.sample(
444
+ entities[target['entity']],
445
+ min(num_targets, len(entities[target['entity']]))
446
+ )
447
+ source_entity[source['field']] = [t['id'] for t in target_refs]
448
+
449
+ elif rel_type == 'many-to-one':
450
+ for target_entity in entities[target['entity']]:
451
+ # Select one source
452
+ source_ref = random.choice(entities[source['entity']])
453
+ target_entity[target['field']] = source_ref['id']
454
+ '''
455
+ ```
456
+
457
+ ### 4. Mock Scenarios
458
+
459
+ Implement scenario-based mocking:
460
+
461
+ **Scenario Manager**
462
+ ```python
463
+ class ScenarioManager:
464
+ def __init__(self):
465
+ self.scenarios = {}
466
+ self.current_scenario = 'default'
467
+ self.scenario_states = {}
468
+
469
+ def define_scenario(self, name: str, definition: Dict[str, Any]):
470
+ """Define a mock scenario"""
471
+ self.scenarios[name] = {
472
+ 'name': name,
473
+ 'description': definition.get('description', ''),
474
+ 'initial_state': definition.get('initial_state', {}),
475
+ 'stubs': definition.get('stubs', []),
476
+ 'sequences': definition.get('sequences', []),
477
+ 'conditions': definition.get('conditions', [])
478
+ }
479
+
480
+ def create_test_scenarios(self):
481
+ """Create common test scenarios"""
482
+ return {
483
+ 'happy_path': {
484
+ 'description': 'All operations succeed',
485
+ 'stubs': [
486
+ {
487
+ 'path': '/api/auth/login',
488
+ 'response': {
489
+ 'status': 200,
490
+ 'body': {
491
+ 'token': 'valid_token',
492
+ 'user': {'id': '123', 'name': 'Test User'}
493
+ }
494
+ }
495
+ },
496
+ {
497
+ 'path': '/api/users/{id}',
498
+ 'response': {
499
+ 'status': 200,
500
+ 'body': {
501
+ 'id': '{id}',
502
+ 'name': 'Test User',
503
+ 'email': 'test@example.com'
504
+ }
505
+ }
506
+ }
507
+ ]
508
+ },
509
+ 'error_scenario': {
510
+ 'description': 'Various error conditions',
511
+ 'sequences': [
512
+ {
513
+ 'name': 'rate_limiting',
514
+ 'steps': [
515
+ {'repeat': 5, 'response': {'status': 200}},
516
+ {'repeat': 10, 'response': {'status': 429, 'body': {'error': 'Rate limit exceeded'}}}
517
+ ]
518
+ }
519
+ ],
520
+ 'stubs': [
521
+ {
522
+ 'path': '/api/auth/login',
523
+ 'conditions': [
524
+ {
525
+ 'match': {'body': {'username': 'locked_user'}},
526
+ 'response': {'status': 423, 'body': {'error': 'Account locked'}}
527
+ }
528
+ ]
529
+ }
530
+ ]
531
+ },
532
+ 'degraded_performance': {
533
+ 'description': 'Slow responses and timeouts',
534
+ 'stubs': [
535
+ {
536
+ 'path': '/api/*',
537
+ 'delay': 5000, # 5 second delay
538
+ 'response': {'status': 200}
539
+ }
540
+ ]
541
+ }
542
+ }
543
+
544
+ def execute_scenario_sequence(self):
545
+ """Execute scenario sequences"""
546
+ return '''
547
+ class SequenceExecutor:
548
+ def __init__(self):
549
+ self.sequence_states = {}
550
+
551
+ def get_sequence_response(self, sequence_name: str, request: Dict):
552
+ """Get response based on sequence state"""
553
+ if sequence_name not in self.sequence_states:
554
+ self.sequence_states[sequence_name] = {'step': 0, 'count': 0}
555
+
556
+ state = self.sequence_states[sequence_name]
557
+ sequence = self.get_sequence_definition(sequence_name)
558
+
559
+ # Get current step
560
+ current_step = sequence['steps'][state['step']]
561
+
562
+ # Check if we should advance to next step
563
+ state['count'] += 1
564
+ if state['count'] >= current_step.get('repeat', 1):
565
+ state['step'] = (state['step'] + 1) % len(sequence['steps'])
566
+ state['count'] = 0
567
+
568
+ return current_step['response']
569
+
570
+ def create_stateful_scenario(self):
571
+ """Create scenario with stateful behavior"""
572
+ return {
573
+ 'shopping_cart': {
574
+ 'initial_state': {
575
+ 'cart': {},
576
+ 'total': 0
577
+ },
578
+ 'stubs': [
579
+ {
580
+ 'method': 'POST',
581
+ 'path': '/api/cart/items',
582
+ 'handler': 'add_to_cart',
583
+ 'modifies_state': True
584
+ },
585
+ {
586
+ 'method': 'GET',
587
+ 'path': '/api/cart',
588
+ 'handler': 'get_cart',
589
+ 'uses_state': True
590
+ }
591
+ ],
592
+ 'handlers': {
593
+ 'add_to_cart': lambda state, request: {
594
+ 'state': {
595
+ **state,
596
+ 'cart': {
597
+ **state['cart'],
598
+ request['body']['product_id']: request['body']['quantity']
599
+ },
600
+ 'total': state['total'] + request['body']['price']
601
+ },
602
+ 'response': {
603
+ 'status': 201,
604
+ 'body': {'message': 'Item added to cart'}
605
+ }
606
+ },
607
+ 'get_cart': lambda state, request: {
608
+ 'response': {
609
+ 'status': 200,
610
+ 'body': {
611
+ 'items': state['cart'],
612
+ 'total': state['total']
613
+ }
614
+ }
615
+ }
616
+ }
617
+ }
618
+ }
619
+ '''
620
+ ```
621
+
622
+ ### 5. Contract Testing
623
+
624
+ Implement contract-based mocking:
625
+
626
+ **Contract Testing Framework**
627
+ ```python
628
+ class ContractMockServer:
629
+ def __init__(self):
630
+ self.contracts = {}
631
+ self.validators = self._init_validators()
632
+
633
+ def load_contract(self, contract_path: str):
634
+ """Load API contract (OpenAPI, AsyncAPI, etc.)"""
635
+ with open(contract_path, 'r') as f:
636
+ contract = yaml.safe_load(f)
637
+
638
+ # Parse contract
639
+ self.contracts[contract['info']['title']] = {
640
+ 'spec': contract,
641
+ 'endpoints': self._parse_endpoints(contract),
642
+ 'schemas': self._parse_schemas(contract)
643
+ }
644
+
645
+ def generate_mocks_from_contract(self, contract_name: str):
646
+ """Generate mocks from contract specification"""
647
+ contract = self.contracts[contract_name]
648
+ mocks = []
649
+
650
+ for path, methods in contract['endpoints'].items():
651
+ for method, spec in methods.items():
652
+ mock = self._create_mock_from_spec(path, method, spec)
653
+ mocks.append(mock)
654
+
655
+ return mocks
656
+
657
+ def _create_mock_from_spec(self, path: str, method: str, spec: Dict):
658
+ """Create mock from endpoint specification"""
659
+ mock = {
660
+ 'method': method.upper(),
661
+ 'path': self._convert_path_to_pattern(path),
662
+ 'responses': {}
663
+ }
664
+
665
+ # Generate responses for each status code
666
+ for status_code, response_spec in spec.get('responses', {}).items():
667
+ mock['responses'][status_code] = {
668
+ 'status': int(status_code),
669
+ 'headers': self._get_response_headers(response_spec),
670
+ 'body': self._generate_response_body(response_spec)
671
+ }
672
+
673
+ # Add request validation
674
+ if 'requestBody' in spec:
675
+ mock['request_validation'] = self._create_request_validator(spec['requestBody'])
676
+
677
+ return mock
678
+
679
+ def validate_against_contract(self):
680
+ """Validate mock responses against contract"""
681
+ return '''
682
+ class ContractValidator:
683
+ def validate_response(self, contract_spec, actual_response):
684
+ """Validate response against contract"""
685
+ validation_results = {
686
+ 'valid': True,
687
+ 'errors': []
688
+ }
689
+
690
+ # Find response spec for status code
691
+ response_spec = contract_spec['responses'].get(
692
+ str(actual_response['status']),
693
+ contract_spec['responses'].get('default')
694
+ )
695
+
696
+ if not response_spec:
697
+ validation_results['errors'].append({
698
+ 'type': 'unexpected_status',
699
+ 'message': f"Status {actual_response['status']} not defined in contract"
700
+ })
701
+ validation_results['valid'] = False
702
+ return validation_results
703
+
704
+ # Validate headers
705
+ if 'headers' in response_spec:
706
+ header_errors = self.validate_headers(
707
+ response_spec['headers'],
708
+ actual_response['headers']
709
+ )
710
+ validation_results['errors'].extend(header_errors)
711
+
712
+ # Validate body schema
713
+ if 'content' in response_spec:
714
+ body_errors = self.validate_body(
715
+ response_spec['content'],
716
+ actual_response['body']
717
+ )
718
+ validation_results['errors'].extend(body_errors)
719
+
720
+ validation_results['valid'] = len(validation_results['errors']) == 0
721
+ return validation_results
722
+
723
+ def validate_body(self, content_spec, actual_body):
724
+ """Validate response body against schema"""
725
+ errors = []
726
+
727
+ # Get schema for content type
728
+ schema = content_spec.get('application/json', {}).get('schema')
729
+ if not schema:
730
+ return errors
731
+
732
+ # Validate against JSON schema
733
+ try:
734
+ validate(instance=actual_body, schema=schema)
735
+ except ValidationError as e:
736
+ errors.append({
737
+ 'type': 'schema_validation',
738
+ 'path': e.json_path,
739
+ 'message': e.message
740
+ })
741
+
742
+ return errors
743
+ '''
744
+ ```
745
+
746
+ ### 6. Performance Testing
747
+
748
+ Create performance testing mocks:
749
+
750
+ **Performance Mock Server**
751
+ ```python
752
+ class PerformanceMockServer:
753
+ def __init__(self):
754
+ self.performance_profiles = {}
755
+ self.metrics_collector = MetricsCollector()
756
+
757
+ def create_performance_profile(self, name: str, config: Dict):
758
+ """Create performance testing profile"""
759
+ self.performance_profiles[name] = {
760
+ 'latency': config.get('latency', {'min': 10, 'max': 100}),
761
+ 'throughput': config.get('throughput', 1000), # requests per second
762
+ 'error_rate': config.get('error_rate', 0.01), # 1% errors
763
+ 'response_size': config.get('response_size', {'min': 100, 'max': 10000})
764
+ }
765
+
766
+ async def simulate_performance(self, profile_name: str, request: Request):
767
+ """Simulate performance characteristics"""
768
+ profile = self.performance_profiles[profile_name]
769
+
770
+ # Simulate latency
771
+ latency = random.uniform(profile['latency']['min'], profile['latency']['max'])
772
+ await asyncio.sleep(latency / 1000)
773
+
774
+ # Simulate errors
775
+ if random.random() < profile['error_rate']:
776
+ return self._generate_error_response()
777
+
778
+ # Generate response with specified size
779
+ response_size = random.randint(
780
+ profile['response_size']['min'],
781
+ profile['response_size']['max']
782
+ )
783
+
784
+ response_data = self._generate_data_of_size(response_size)
785
+
786
+ # Track metrics
787
+ self.metrics_collector.record({
788
+ 'latency': latency,
789
+ 'response_size': response_size,
790
+ 'timestamp': datetime.now()
791
+ })
792
+
793
+ return response_data
794
+
795
+ def create_load_test_scenarios(self):
796
+ """Create load testing scenarios"""
797
+ return {
798
+ 'gradual_load': {
799
+ 'description': 'Gradually increase load',
800
+ 'stages': [
801
+ {'duration': 60, 'target_rps': 100},
802
+ {'duration': 120, 'target_rps': 500},
803
+ {'duration': 180, 'target_rps': 1000},
804
+ {'duration': 60, 'target_rps': 100}
805
+ ]
806
+ },
807
+ 'spike_test': {
808
+ 'description': 'Sudden spike in traffic',
809
+ 'stages': [
810
+ {'duration': 60, 'target_rps': 100},
811
+ {'duration': 10, 'target_rps': 5000},
812
+ {'duration': 60, 'target_rps': 100}
813
+ ]
814
+ },
815
+ 'stress_test': {
816
+ 'description': 'Find breaking point',
817
+ 'stages': [
818
+ {'duration': 60, 'target_rps': 100},
819
+ {'duration': 60, 'target_rps': 500},
820
+ {'duration': 60, 'target_rps': 1000},
821
+ {'duration': 60, 'target_rps': 2000},
822
+ {'duration': 60, 'target_rps': 5000},
823
+ {'duration': 60, 'target_rps': 10000}
824
+ ]
825
+ }
826
+ }
827
+
828
+ def implement_throttling(self):
829
+ """Implement request throttling"""
830
+ return '''
831
+ class ThrottlingMiddleware:
832
+ def __init__(self, max_rps: int):
833
+ self.max_rps = max_rps
834
+ self.request_times = deque()
835
+
836
+ async def __call__(self, request: Request, call_next):
837
+ current_time = time.time()
838
+
839
+ # Remove old requests
840
+ while self.request_times and self.request_times[0] < current_time - 1:
841
+ self.request_times.popleft()
842
+
843
+ # Check if we're over limit
844
+ if len(self.request_times) >= self.max_rps:
845
+ return Response(
846
+ content=json.dumps({
847
+ 'error': 'Rate limit exceeded',
848
+ 'retry_after': 1
849
+ }),
850
+ status_code=429,
851
+ headers={'Retry-After': '1'}
852
+ )
853
+
854
+ # Record this request
855
+ self.request_times.append(current_time)
856
+
857
+ # Process request
858
+ response = await call_next(request)
859
+ return response
860
+ '''
861
+ ```
862
+
863
+ ### 7. Mock Data Management
864
+
865
+ Manage mock data effectively:
866
+
867
+ **Mock Data Store**
868
+ ```python
869
+ class MockDataStore:
870
+ def __init__(self):
871
+ self.collections = {}
872
+ self.indexes = {}
873
+
874
+ def create_collection(self, name: str, schema: Dict = None):
875
+ """Create a new data collection"""
876
+ self.collections[name] = {
877
+ 'data': {},
878
+ 'schema': schema,
879
+ 'counter': 0
880
+ }
881
+
882
+ # Create default index on 'id'
883
+ self.create_index(name, 'id')
884
+
885
+ def insert(self, collection: str, data: Dict):
886
+ """Insert data into collection"""
887
+ collection_data = self.collections[collection]
888
+
889
+ # Validate against schema if exists
890
+ if collection_data['schema']:
891
+ self._validate_data(data, collection_data['schema'])
892
+
893
+ # Generate ID if not provided
894
+ if 'id' not in data:
895
+ collection_data['counter'] += 1
896
+ data['id'] = str(collection_data['counter'])
897
+
898
+ # Store data
899
+ collection_data['data'][data['id']] = data
900
+
901
+ # Update indexes
902
+ self._update_indexes(collection, data)
903
+
904
+ return data['id']
905
+
906
+ def query(self, collection: str, filters: Dict = None):
907
+ """Query collection with filters"""
908
+ collection_data = self.collections[collection]['data']
909
+
910
+ if not filters:
911
+ return list(collection_data.values())
912
+
913
+ # Use indexes if available
914
+ if self._can_use_index(collection, filters):
915
+ return self._query_with_index(collection, filters)
916
+
917
+ # Full scan
918
+ results = []
919
+ for item in collection_data.values():
920
+ if self._matches_filters(item, filters):
921
+ results.append(item)
922
+
923
+ return results
924
+
925
+ def create_relationships(self):
926
+ """Define relationships between collections"""
927
+ return '''
928
+ class RelationshipManager:
929
+ def __init__(self, data_store: MockDataStore):
930
+ self.store = data_store
931
+ self.relationships = {}
932
+
933
+ def define_relationship(self,
934
+ source_collection: str,
935
+ target_collection: str,
936
+ relationship_type: str,
937
+ foreign_key: str):
938
+ """Define relationship between collections"""
939
+ self.relationships[f"{source_collection}->{target_collection}"] = {
940
+ 'type': relationship_type,
941
+ 'source': source_collection,
942
+ 'target': target_collection,
943
+ 'foreign_key': foreign_key
944
+ }
945
+
946
+ def populate_related_data(self, entity: Dict, collection: str, depth: int = 1):
947
+ """Populate related data for entity"""
948
+ if depth <= 0:
949
+ return entity
950
+
951
+ # Find relationships for this collection
952
+ for rel_key, rel in self.relationships.items():
953
+ if rel['source'] == collection:
954
+ # Get related data
955
+ foreign_id = entity.get(rel['foreign_key'])
956
+ if foreign_id:
957
+ related = self.store.get(rel['target'], foreign_id)
958
+ if related:
959
+ # Recursively populate
960
+ related = self.populate_related_data(
961
+ related,
962
+ rel['target'],
963
+ depth - 1
964
+ )
965
+ entity[rel['target']] = related
966
+
967
+ return entity
968
+
969
+ def cascade_operations(self, operation: str, collection: str, entity_id: str):
970
+ """Handle cascade operations"""
971
+ if operation == 'delete':
972
+ # Find dependent relationships
973
+ for rel in self.relationships.values():
974
+ if rel['target'] == collection:
975
+ # Delete dependent entities
976
+ dependents = self.store.query(
977
+ rel['source'],
978
+ {rel['foreign_key']: entity_id}
979
+ )
980
+ for dep in dependents:
981
+ self.store.delete(rel['source'], dep['id'])
982
+ '''
983
+ ```
984
+
985
+ ### 8. Testing Framework Integration
986
+
987
+ Integrate with popular testing frameworks:
988
+
989
+ **Testing Integration**
990
+ ```python
991
+ class TestingFrameworkIntegration:
992
+ def create_jest_integration(self):
993
+ """Jest testing integration"""
994
+ return '''
995
+ // jest.mock.config.js
996
+ import { MockServer } from './mockServer';
997
+
998
+ const mockServer = new MockServer();
999
+
1000
+ beforeAll(async () => {
1001
+ await mockServer.start({ port: 3001 });
1002
+
1003
+ // Load mock definitions
1004
+ await mockServer.loadMocks('./mocks/*.json');
1005
+
1006
+ // Set default scenario
1007
+ await mockServer.setScenario('test');
1008
+ });
1009
+
1010
+ afterAll(async () => {
1011
+ await mockServer.stop();
1012
+ });
1013
+
1014
+ beforeEach(async () => {
1015
+ // Reset mock state
1016
+ await mockServer.reset();
1017
+ });
1018
+
1019
+ // Test helper functions
1020
+ export const setupMock = async (stub) => {
1021
+ return await mockServer.addStub(stub);
1022
+ };
1023
+
1024
+ export const verifyRequests = async (matcher) => {
1025
+ const requests = await mockServer.getRequests(matcher);
1026
+ return requests;
1027
+ };
1028
+
1029
+ // Example test
1030
+ describe('User API', () => {
1031
+ it('should fetch user details', async () => {
1032
+ // Setup mock
1033
+ await setupMock({
1034
+ method: 'GET',
1035
+ path: '/api/users/123',
1036
+ response: {
1037
+ status: 200,
1038
+ body: { id: '123', name: 'Test User' }
1039
+ }
1040
+ });
1041
+
1042
+ // Make request
1043
+ const response = await fetch('http://localhost:3001/api/users/123');
1044
+ const user = await response.json();
1045
+
1046
+ // Verify
1047
+ expect(user.name).toBe('Test User');
1048
+
1049
+ // Verify mock was called
1050
+ const requests = await verifyRequests({ path: '/api/users/123' });
1051
+ expect(requests).toHaveLength(1);
1052
+ });
1053
+ });
1054
+ '''
1055
+
1056
+ def create_pytest_integration(self):
1057
+ """Pytest integration"""
1058
+ return '''
1059
+ # conftest.py
1060
+ import pytest
1061
+ from mock_server import MockServer
1062
+ import asyncio
1063
+
1064
+ @pytest.fixture(scope="session")
1065
+ def event_loop():
1066
+ loop = asyncio.get_event_loop_policy().new_event_loop()
1067
+ yield loop
1068
+ loop.close()
1069
+
1070
+ @pytest.fixture(scope="session")
1071
+ async def mock_server(event_loop):
1072
+ server = MockServer()
1073
+ await server.start(port=3001)
1074
+ yield server
1075
+ await server.stop()
1076
+
1077
+ @pytest.fixture(autouse=True)
1078
+ async def reset_mocks(mock_server):
1079
+ await mock_server.reset()
1080
+ yield
1081
+ # Verify no unexpected calls
1082
+ unmatched = await mock_server.get_unmatched_requests()
1083
+ assert len(unmatched) == 0, f"Unmatched requests: {unmatched}"
1084
+
1085
+ # Test utilities
1086
+ class MockBuilder:
1087
+ def __init__(self, mock_server):
1088
+ self.server = mock_server
1089
+ self.stubs = []
1090
+
1091
+ def when(self, method, path):
1092
+ self.current_stub = {
1093
+ 'method': method,
1094
+ 'path': path
1095
+ }
1096
+ return self
1097
+
1098
+ def with_body(self, body):
1099
+ self.current_stub['body'] = body
1100
+ return self
1101
+
1102
+ def then_return(self, status, body=None, headers=None):
1103
+ self.current_stub['response'] = {
1104
+ 'status': status,
1105
+ 'body': body,
1106
+ 'headers': headers or {}
1107
+ }
1108
+ self.stubs.append(self.current_stub)
1109
+ return self
1110
+
1111
+ async def setup(self):
1112
+ for stub in self.stubs:
1113
+ await self.server.add_stub(stub)
1114
+
1115
+ # Example test
1116
+ @pytest.mark.asyncio
1117
+ async def test_user_creation(mock_server):
1118
+ # Setup mocks
1119
+ mock = MockBuilder(mock_server)
1120
+ mock.when('POST', '/api/users') \
1121
+ .with_body({'name': 'New User'}) \
1122
+ .then_return(201, {'id': '456', 'name': 'New User'})
1123
+
1124
+ await mock.setup()
1125
+
1126
+ # Test code here
1127
+ response = await create_user({'name': 'New User'})
1128
+ assert response['id'] == '456'
1129
+ '''
1130
+ ```
1131
+
1132
+ ### 9. Mock Server Deployment
1133
+
1134
+ Deploy mock servers:
1135
+
1136
+ **Deployment Configuration**
1137
+ ```yaml
1138
+ # docker-compose.yml for mock services
1139
+ version: '3.8'
1140
+
1141
+ services:
1142
+ mock-api:
1143
+ build:
1144
+ context: .
1145
+ dockerfile: Dockerfile.mock
1146
+ ports:
1147
+ - "3001:3001"
1148
+ environment:
1149
+ - MOCK_SCENARIO=production
1150
+ - MOCK_DATA_PATH=/data/mocks
1151
+ volumes:
1152
+ - ./mocks:/data/mocks
1153
+ - ./scenarios:/data/scenarios
1154
+ healthcheck:
1155
+ test: ["CMD", "curl", "-f", "http://localhost:3001/health"]
1156
+ interval: 30s
1157
+ timeout: 10s
1158
+ retries: 3
1159
+
1160
+ mock-admin:
1161
+ build:
1162
+ context: .
1163
+ dockerfile: Dockerfile.admin
1164
+ ports:
1165
+ - "3002:3002"
1166
+ environment:
1167
+ - MOCK_SERVER_URL=http://mock-api:3001
1168
+ depends_on:
1169
+ - mock-api
1170
+
1171
+ # Kubernetes deployment
1172
+ ---
1173
+ apiVersion: apps/v1
1174
+ kind: Deployment
1175
+ metadata:
1176
+ name: mock-server
1177
+ spec:
1178
+ replicas: 2
1179
+ selector:
1180
+ matchLabels:
1181
+ app: mock-server
1182
+ template:
1183
+ metadata:
1184
+ labels:
1185
+ app: mock-server
1186
+ spec:
1187
+ containers:
1188
+ - name: mock-server
1189
+ image: mock-server:latest
1190
+ ports:
1191
+ - containerPort: 3001
1192
+ env:
1193
+ - name: MOCK_SCENARIO
1194
+ valueFrom:
1195
+ configMapKeyRef:
1196
+ name: mock-config
1197
+ key: scenario
1198
+ volumeMounts:
1199
+ - name: mock-definitions
1200
+ mountPath: /data/mocks
1201
+ volumes:
1202
+ - name: mock-definitions
1203
+ configMap:
1204
+ name: mock-definitions
1205
+ ```
1206
+
1207
+ ### 10. Mock Documentation
1208
+
1209
+ Generate mock API documentation:
1210
+
1211
+ **Documentation Generator**
1212
+ ```python
1213
+ class MockDocumentationGenerator:
1214
+ def generate_documentation(self, mock_server):
1215
+ """Generate comprehensive mock documentation"""
1216
+ return f"""
1217
+ # Mock API Documentation
1218
+
1219
+ ## Overview
1220
+ {self._generate_overview(mock_server)}
1221
+
1222
+ ## Available Endpoints
1223
+ {self._generate_endpoints_doc(mock_server)}
1224
+
1225
+ ## Scenarios
1226
+ {self._generate_scenarios_doc(mock_server)}
1227
+
1228
+ ## Data Models
1229
+ {self._generate_models_doc(mock_server)}
1230
+
1231
+ ## Usage Examples
1232
+ {self._generate_examples(mock_server)}
1233
+
1234
+ ## Configuration
1235
+ {self._generate_config_doc(mock_server)}
1236
+ """
1237
+
1238
+ def _generate_endpoints_doc(self, mock_server):
1239
+ """Generate endpoint documentation"""
1240
+ doc = ""
1241
+ for endpoint in mock_server.get_endpoints():
1242
+ doc += f"""
1243
+ ### {endpoint['method']} {endpoint['path']}
1244
+
1245
+ **Description**: {endpoint.get('description', 'No description')}
1246
+
1247
+ **Request**:
1248
+ ```json
1249
+ {json.dumps(endpoint.get('request_example', {}), indent=2)}
1250
+ ```
1251
+
1252
+ **Response**:
1253
+ ```json
1254
+ {json.dumps(endpoint.get('response_example', {}), indent=2)}
1255
+ ```
1256
+
1257
+ **Scenarios**:
1258
+ {self._format_endpoint_scenarios(endpoint)}
1259
+ """
1260
+ return doc
1261
+
1262
+ def create_interactive_docs(self):
1263
+ """Create interactive API documentation"""
1264
+ return '''
1265
+ <!DOCTYPE html>
1266
+ <html>
1267
+ <head>
1268
+ <title>Mock API Interactive Documentation</title>
1269
+ <script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"></script>
1270
+ <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css">
1271
+ </head>
1272
+ <body>
1273
+ <div id="swagger-ui"></div>
1274
+ <script>
1275
+ window.onload = function() {
1276
+ const ui = SwaggerUIBundle({
1277
+ url: "/api/mock/openapi.json",
1278
+ dom_id: '#swagger-ui',
1279
+ presets: [
1280
+ SwaggerUIBundle.presets.apis,
1281
+ SwaggerUIBundle.SwaggerUIStandalonePreset
1282
+ ],
1283
+ layout: "BaseLayout",
1284
+ tryItOutEnabled: true,
1285
+ requestInterceptor: (request) => {
1286
+ request.headers['X-Mock-Scenario'] =
1287
+ document.getElementById('scenario-select').value;
1288
+ return request;
1289
+ }
1290
+ });
1291
+ }
1292
+ </script>
1293
+
1294
+ <div class="scenario-selector">
1295
+ <label>Scenario:</label>
1296
+ <select id="scenario-select">
1297
+ <option value="default">Default</option>
1298
+ <option value="error">Error Conditions</option>
1299
+ <option value="slow">Slow Responses</option>
1300
+ </select>
1301
+ </div>
1302
+ </body>
1303
+ </html>
1304
+ '''
1305
+ ```
1306
+
1307
+ ## Output Format
1308
+
1309
+ 1. **Mock Server Setup**: Complete mock server implementation
1310
+ 2. **Stubbing Configuration**: Flexible request/response stubbing
1311
+ 3. **Data Generation**: Realistic mock data generation
1312
+ 4. **Scenario Definitions**: Comprehensive test scenarios
1313
+ 5. **Contract Testing**: Contract-based mock validation
1314
+ 6. **Performance Simulation**: Performance testing capabilities
1315
+ 7. **Data Management**: Mock data storage and relationships
1316
+ 8. **Testing Integration**: Framework integration examples
1317
+ 9. **Deployment Guide**: Mock server deployment configurations
1318
+ 10. **Documentation**: Auto-generated mock API documentation
1319
+
1320
+ Focus on creating flexible, realistic mock services that enable efficient development, thorough testing, and reliable API simulation for all stages of the development lifecycle.