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:
		
							
								
								
									
										41
									
								
								frontend/node_modules/merge-stream/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								frontend/node_modules/merge-stream/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const { PassThrough } = require('stream'); | ||||
|  | ||||
| module.exports = function (/*streams...*/) { | ||||
|   var sources = [] | ||||
|   var output  = new PassThrough({objectMode: true}) | ||||
|  | ||||
|   output.setMaxListeners(0) | ||||
|  | ||||
|   output.add = add | ||||
|   output.isEmpty = isEmpty | ||||
|  | ||||
|   output.on('unpipe', remove) | ||||
|  | ||||
|   Array.prototype.slice.call(arguments).forEach(add) | ||||
|  | ||||
|   return output | ||||
|  | ||||
|   function add (source) { | ||||
|     if (Array.isArray(source)) { | ||||
|       source.forEach(add) | ||||
|       return this | ||||
|     } | ||||
|  | ||||
|     sources.push(source); | ||||
|     source.once('end', remove.bind(null, source)) | ||||
|     source.once('error', output.emit.bind(output, 'error')) | ||||
|     source.pipe(output, {end: false}) | ||||
|     return this | ||||
|   } | ||||
|  | ||||
|   function isEmpty () { | ||||
|     return sources.length == 0; | ||||
|   } | ||||
|  | ||||
|   function remove (source) { | ||||
|     sources = sources.filter(function (it) { return it !== source }) | ||||
|     if (!sources.length && output.readable) { output.end() } | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 anthonyrawlins
					anthonyrawlins