Set up comprehensive frontend testing infrastructure
- Install Jest for unit testing with React Testing Library - Install Playwright for end-to-end testing - Configure Jest with proper TypeScript support and module mapping - Create test setup files and utilities for both unit and e2e tests Components: * Jest configuration with coverage thresholds * Playwright configuration with browser automation * Unit tests for LoginForm, AuthContext, and useSocketIO hook * E2E tests for authentication, dashboard, and agents workflows * GitHub Actions workflow for automated testing * Mock data and API utilities for consistent testing * Test documentation with best practices Testing features: - Unit tests with 70% coverage threshold - E2E tests with API mocking and user journey testing - CI/CD integration for automated test runs - Cross-browser testing support with Playwright - Authentication system testing end-to-end 🚀 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							
								
								
									
										113
									
								
								frontend/node_modules/jake/test/integration/jakelib/concurrent.jake.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								frontend/node_modules/jake/test/integration/jakelib/concurrent.jake.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
|  | ||||
| namespace('concurrent', function () { | ||||
|   task('A', function () { | ||||
|     console.log('Started A'); | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         console.log('Finished A'); | ||||
|         resolve(); | ||||
|       }, 200); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('B', function () { | ||||
|     console.log('Started B'); | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         console.log('Finished B'); | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('C', function () { | ||||
|     console.log('Started C'); | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         console.log('Finished C'); | ||||
|         resolve(); | ||||
|       }, 100); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('D', function () { | ||||
|     console.log('Started D'); | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         console.log('Finished D'); | ||||
|         resolve(); | ||||
|       }, 300); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('Ba', ['A'], function () { | ||||
|     console.log('Started Ba'); | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         console.log('Finished Ba'); | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('Afail', function () { | ||||
|     console.log('Started failing task'); | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         console.log('Failing B with error'); | ||||
|         throw new Error('I failed'); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('simple1', ['A','B'], {concurrency: 2}, function () { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('simple2', ['C','D'], {concurrency: 2}, function () { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('seqconcurrent', ['simple1','simple2'], function () { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('concurrentconcurrent', ['simple1','simple2'], {concurrency: 2}, function () { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('subdep', ['A','Ba'], {concurrency: 2}, function () { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   task('fail', ['A', 'B', 'Afail'], {concurrency: 3}, function () { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(); | ||||
|       }, 50); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
| }); | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 anthonyrawlins
					anthonyrawlins