claude-mpm 5.4.55__py3-none-any.whl → 5.4.85__py3-none-any.whl

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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (173) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
  3. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +63 -241
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +36 -9
  6. claude_mpm/cli/__init__.py +5 -1
  7. claude_mpm/cli/commands/agents.py +2 -4
  8. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  9. claude_mpm/cli/commands/configure.py +620 -21
  10. claude_mpm/cli/commands/skills.py +166 -14
  11. claude_mpm/cli/executor.py +1 -0
  12. claude_mpm/cli/interactive/__init__.py +10 -0
  13. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  14. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  15. claude_mpm/cli/interactive/skill_selector.py +481 -0
  16. claude_mpm/cli/parsers/base_parser.py +5 -0
  17. claude_mpm/cli/startup.py +223 -388
  18. claude_mpm/constants.py +1 -0
  19. claude_mpm/core/claude_runner.py +2 -2
  20. claude_mpm/core/interactive_session.py +7 -7
  21. claude_mpm/core/output_style_manager.py +21 -13
  22. claude_mpm/core/unified_config.py +50 -8
  23. claude_mpm/core/unified_paths.py +30 -13
  24. claude_mpm/scripts/start_activity_logging.py +0 -0
  25. claude_mpm/services/agents/deployment/agent_template_builder.py +8 -0
  26. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  27. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  28. claude_mpm/services/agents/sources/git_source_sync_service.py +7 -4
  29. claude_mpm/services/agents/startup_sync.py +5 -2
  30. claude_mpm/services/pm_skills_deployer.py +4 -0
  31. claude_mpm/services/skills/git_skill_source_manager.py +24 -8
  32. claude_mpm/services/skills/selective_skill_deployer.py +82 -83
  33. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  34. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  35. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  36. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  37. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  38. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  39. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  40. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  41. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  42. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  43. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  44. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  45. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  46. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  47. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  48. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  49. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  50. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  51. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  52. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  53. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  54. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  55. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  56. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  57. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  58. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  59. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  60. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  61. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  62. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  63. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  64. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  65. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  66. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  67. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  68. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  69. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  70. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  71. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  72. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  73. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  74. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  75. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  76. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  77. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  78. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  79. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  80. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  81. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  82. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  83. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  84. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  85. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  86. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  87. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  88. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  89. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  90. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  91. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  92. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  93. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  94. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  95. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  96. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  97. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  98. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  99. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  100. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  101. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  102. claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
  103. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  104. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  105. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  106. claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
  107. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  108. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  109. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  110. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  111. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  112. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  113. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  114. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  115. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  116. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  117. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  118. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  119. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  120. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  121. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  122. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  123. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  124. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  125. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  126. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  127. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  128. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  129. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  130. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  131. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  132. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  133. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  134. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  135. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  136. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  137. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  138. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  139. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  140. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  141. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  142. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  143. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  144. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  145. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  146. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  147. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  148. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  149. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  150. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  151. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  152. claude_mpm/utils/agent_dependency_loader.py +103 -4
  153. claude_mpm/utils/robust_installer.py +45 -24
  154. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/METADATA +47 -23
  155. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/RECORD +159 -47
  156. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  157. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  158. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  159. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  160. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  161. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  162. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  163. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  164. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  165. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  166. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  167. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  168. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  169. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
  170. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +0 -0
  171. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/licenses/LICENSE +0 -0
  172. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  173. {claude_mpm-5.4.55.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,384 @@
1
+ ---
2
+ name: tauri-testing
3
+ description: Comprehensive testing strategies for Tauri apps including unit tests, integration tests, IPC mocking, and end-to-end testing
4
+ version: 1.0.0
5
+ category: development
6
+ author: Claude MPM Team
7
+ license: MIT
8
+ progressive_disclosure:
9
+ entry_point:
10
+ summary: "Complete testing: unit tests for commands, integration tests for IPC, mocking patterns, E2E with WebDriver"
11
+ when_to_use: "Ensuring Tauri app quality with comprehensive test coverage for both Rust backend and frontend"
12
+ quick_start: "1. Unit test commands 2. Mock IPC in frontend 3. Integration test with MockRuntime 4. E2E with tauri-driver"
13
+ context_limit: 500
14
+ tags:
15
+ - tauri
16
+ - testing
17
+ - unit-tests
18
+ - integration-tests
19
+ - mocking
20
+ - e2e
21
+ requires_tools: []
22
+ ---
23
+
24
+ # Tauri Testing Strategies
25
+
26
+ ## Unit Testing Commands
27
+
28
+ ```rust
29
+ // src-tauri/src/commands/files.rs
30
+ #[tauri::command]
31
+ pub async fn read_file_content(path: String) -> Result<String, String> {
32
+ tokio::fs::read_to_string(path)
33
+ .await
34
+ .map_err(|e| e.to_string())
35
+ }
36
+
37
+ #[cfg(test)]
38
+ mod tests {
39
+ use super::*;
40
+
41
+ #[tokio::test]
42
+ async fn test_read_file_content() {
43
+ // Create temp file
44
+ let temp_dir = std::env::temp_dir();
45
+ let test_file = temp_dir.join("test.txt");
46
+ tokio::fs::write(&test_file, "test content").await.unwrap();
47
+
48
+ // Test command
49
+ let result = read_file_content(
50
+ test_file.to_string_lossy().to_string()
51
+ ).await;
52
+
53
+ assert!(result.is_ok());
54
+ assert_eq!(result.unwrap(), "test content");
55
+
56
+ // Cleanup
57
+ tokio::fs::remove_file(test_file).await.unwrap();
58
+ }
59
+
60
+ #[tokio::test]
61
+ async fn test_read_nonexistent_file() {
62
+ let result = read_file_content("/nonexistent/file.txt".to_string()).await;
63
+ assert!(result.is_err());
64
+ }
65
+ }
66
+ ```
67
+
68
+ ## Testing with State
69
+
70
+ ```rust
71
+ use std::sync::Arc;
72
+ use tokio::sync::Mutex;
73
+
74
+ #[cfg(test)]
75
+ mod tests {
76
+ use super::*;
77
+
78
+ async fn create_test_state() -> AppState {
79
+ AppState {
80
+ database: Arc::new(Mutex::new(Database::new_in_memory())),
81
+ config: Arc::new(Mutex::new(Config::default())),
82
+ }
83
+ }
84
+
85
+ #[tokio::test]
86
+ async fn test_command_with_state() {
87
+ let state = create_test_state().await;
88
+
89
+ // Mock State wrapper
90
+ struct MockState(AppState);
91
+
92
+ impl<'r> tauri::State<'r, AppState> {
93
+ fn new_mock(state: AppState) -> Self {
94
+ // Use internal test API
95
+ unimplemented!("Use integration test instead")
96
+ }
97
+ }
98
+
99
+ // For unit tests, call inner functions directly
100
+ let result = get_data_internal(&state).await;
101
+ assert!(result.is_ok());
102
+ }
103
+ }
104
+ ```
105
+
106
+ ## Frontend IPC Mocking
107
+
108
+ ```typescript
109
+ // __mocks__/@tauri-apps/api/core.ts
110
+ export const invoke = jest.fn();
111
+
112
+ // Mock setup
113
+ import { invoke } from '@tauri-apps/api/core';
114
+
115
+ beforeEach(() => {
116
+ (invoke as jest.Mock).mockClear();
117
+ });
118
+
119
+ test('calls read_file command', async () => {
120
+ (invoke as jest.Mock).mockResolvedValue('file content');
121
+
122
+ const content = await readFile('test.txt');
123
+
124
+ expect(invoke).toHaveBeenCalledWith('read_file', {
125
+ filename: 'test.txt'
126
+ });
127
+ expect(content).toBe('file content');
128
+ });
129
+
130
+ test('handles command errors', async () => {
131
+ (invoke as jest.Mock).mockRejectedValue('File not found');
132
+
133
+ await expect(readFile('missing.txt')).rejects.toThrow('File not found');
134
+ });
135
+ ```
136
+
137
+ ## Integration Testing
138
+
139
+ ```rust
140
+ // tests/integration_test.rs
141
+ #[cfg(test)]
142
+ mod tests {
143
+ use tauri::test::{mock_builder, MockRuntime, mock_context};
144
+
145
+ #[test]
146
+ fn test_app_creation() {
147
+ let app = mock_builder()
148
+ .invoke_handler(tauri::generate_handler![
149
+ my_command,
150
+ another_command,
151
+ ])
152
+ .build(MockRuntime::default())
153
+ .expect("failed to build app");
154
+
155
+ assert!(app.get_window("main").is_some());
156
+ }
157
+
158
+ #[test]
159
+ fn test_command_invocation() {
160
+ let app = mock_builder()
161
+ .invoke_handler(tauri::generate_handler![test_command])
162
+ .build(MockRuntime::default())
163
+ .expect("failed to build app");
164
+
165
+ // Commands can be tested via window
166
+ let window = app.get_window("main").unwrap();
167
+ // Test window interactions
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## End-to-End Testing with WebDriver
173
+
174
+ ### Setup
175
+
176
+ **Add to Cargo.toml**:
177
+ ```toml
178
+ [dev-dependencies]
179
+ tauri-driver = "0.1"
180
+ ```
181
+
182
+ **Add test runner**:
183
+ ```rust
184
+ // tests/webdriver.rs
185
+ use tauri_driver::test::*;
186
+
187
+ #[test]
188
+ fn run_webdriver_tests() {
189
+ let mut driver = DriverBuilder::native()
190
+ .build()
191
+ .expect("Failed to create driver");
192
+
193
+ // Navigate to app
194
+ driver.goto("tauri://localhost");
195
+
196
+ // Find element and click
197
+ let button = driver.find_element(By::Id("my-button"))
198
+ .expect("Button not found");
199
+ button.click().expect("Failed to click");
200
+
201
+ // Verify result
202
+ let result = driver.find_element(By::Id("result"))
203
+ .expect("Result not found");
204
+ assert_eq!(result.text().unwrap(), "Success");
205
+ }
206
+ ```
207
+
208
+ ## Mock Event System
209
+
210
+ ```typescript
211
+ // __mocks__/@tauri-apps/api/event.ts
212
+ type EventCallback = (event: any) => void;
213
+ const listeners = new Map<string, EventCallback[]>();
214
+
215
+ export const listen = jest.fn(async (event: string, callback: EventCallback) => {
216
+ if (!listeners.has(event)) {
217
+ listeners.set(event, []);
218
+ }
219
+ listeners.get(event)!.push(callback);
220
+
221
+ return jest.fn(() => {
222
+ const callbacks = listeners.get(event);
223
+ if (callbacks) {
224
+ const index = callbacks.indexOf(callback);
225
+ if (index > -1) {
226
+ callbacks.splice(index, 1);
227
+ }
228
+ }
229
+ });
230
+ });
231
+
232
+ export const emit = jest.fn((event: string, payload: any) => {
233
+ const callbacks = listeners.get(event) || [];
234
+ callbacks.forEach(cb => cb({ payload }));
235
+ });
236
+
237
+ // Test usage
238
+ test('handles progress events', async () => {
239
+ const progressHandler = jest.fn();
240
+ const unlisten = await listen('progress', progressHandler);
241
+
242
+ emit('progress', { current: 50, total: 100 });
243
+
244
+ expect(progressHandler).toHaveBeenCalledWith({
245
+ payload: { current: 50, total: 100 }
246
+ });
247
+
248
+ unlisten();
249
+ });
250
+ ```
251
+
252
+ ## Testing Async Commands
253
+
254
+ ```rust
255
+ #[cfg(test)]
256
+ mod tests {
257
+ use super::*;
258
+ use tokio::time::{timeout, Duration};
259
+
260
+ #[tokio::test]
261
+ async fn test_long_operation_completes() {
262
+ let result = timeout(
263
+ Duration::from_secs(5),
264
+ long_running_command()
265
+ ).await;
266
+
267
+ assert!(result.is_ok());
268
+ assert!(result.unwrap().is_ok());
269
+ }
270
+
271
+ #[tokio::test]
272
+ async fn test_operation_with_progress() {
273
+ let (tx, mut rx) = tokio::sync::mpsc::channel(100);
274
+
275
+ tokio::spawn(async move {
276
+ // Simulate command emitting progress
277
+ for i in 0..10 {
278
+ tx.send(i).await.ok();
279
+ }
280
+ });
281
+
282
+ let mut count = 0;
283
+ while let Some(progress) = rx.recv().await {
284
+ assert_eq!(progress, count);
285
+ count += 1;
286
+ }
287
+
288
+ assert_eq!(count, 10);
289
+ }
290
+ }
291
+ ```
292
+
293
+ ## Frontend Component Testing
294
+
295
+ ```typescript
296
+ import { render, screen, waitFor } from '@testing-library/react';
297
+ import '@testing-library/jest-dom';
298
+ import { invoke } from '@tauri-apps/api/core';
299
+ import { DocumentView } from './DocumentView';
300
+
301
+ jest.mock('@tauri-apps/api/core');
302
+
303
+ test('renders document content', async () => {
304
+ (invoke as jest.Mock).mockResolvedValue('Test content');
305
+
306
+ render(<DocumentView filename="test.txt" />);
307
+
308
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
309
+
310
+ await waitFor(() => {
311
+ expect(screen.getByText('Test content')).toBeInTheDocument();
312
+ });
313
+ });
314
+
315
+ test('displays error on failure', async () => {
316
+ (invoke as jest.Mock).mockRejectedValue('File not found');
317
+
318
+ render(<DocumentView filename="missing.txt" />);
319
+
320
+ await waitFor(() => {
321
+ expect(screen.getByText(/error/i)).toBeInTheDocument();
322
+ });
323
+ });
324
+ ```
325
+
326
+ ## Best Practices
327
+
328
+ 1. **Unit test all commands** - Test logic without Tauri runtime
329
+ 2. **Mock IPC in frontend** - Use jest.mock for @tauri-apps/api
330
+ 3. **Test error paths** - Verify error handling works
331
+ 4. **Use integration tests** - For command registration
332
+ 5. **E2E for critical flows** - User workflows with WebDriver
333
+ 6. **Test async operations** - With timeouts and proper await
334
+ 7. **Mock external dependencies** - Databases, APIs, file system
335
+ 8. **Test state management** - Concurrent access, race conditions
336
+ 9. **Coverage targets** - Aim for >80% coverage
337
+ 10. **CI integration** - Run tests on every commit
338
+
339
+ ## Common Pitfalls
340
+
341
+ ❌ **Forgetting async in tests**:
342
+ ```rust
343
+ // WRONG
344
+ #[test]
345
+ fn test_async_command() {
346
+ let result = async_command().await; // Won't compile
347
+ }
348
+
349
+ // CORRECT
350
+ #[tokio::test]
351
+ async fn test_async_command() {
352
+ let result = async_command().await;
353
+ }
354
+ ```
355
+
356
+ ❌ **Not cleaning up temp files**:
357
+ ```rust
358
+ // WRONG - leaves files behind
359
+ #[tokio::test]
360
+ async fn test() {
361
+ tokio::fs::write("test.txt", "content").await.unwrap();
362
+ // Test... but never removes file
363
+ }
364
+
365
+ // CORRECT
366
+ #[tokio::test]
367
+ async fn test() {
368
+ let file = "test.txt";
369
+ tokio::fs::write(file, "content").await.unwrap();
370
+ // Test...
371
+ tokio::fs::remove_file(file).await.unwrap();
372
+ }
373
+ ```
374
+
375
+ ## Summary
376
+
377
+ - **Unit tests** for command logic
378
+ - **Integration tests** with MockRuntime
379
+ - **Mock IPC** in frontend tests
380
+ - **E2E tests** with tauri-driver
381
+ - **Test async** with #[tokio::test]
382
+ - **Mock events** for event testing
383
+ - **Test error paths** always
384
+ - **CI integration** for automation