 aacb45156b
			
		
	
	aacb45156b
	
	
	
		
			
			- 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>
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| /*
 | |
|   ======== A Handy Little Nodeunit Reference ========
 | |
|   https://github.com/caolan/nodeunit
 | |
| 
 | |
|   Test methods:
 | |
|     test.expect(numAssertions)
 | |
|     test.done()
 | |
|   Test assertions:
 | |
|     test.ok(value, [message])
 | |
|     test.equal(actual, expected, [message])
 | |
|     test.notEqual(actual, expected, [message])
 | |
|     test.deepEqual(actual, expected, [message])
 | |
|     test.notDeepEqual(actual, expected, [message])
 | |
|     test.strictEqual(actual, expected, [message])
 | |
|     test.notStrictEqual(actual, expected, [message])
 | |
|     test.throws(block, [error], [message])
 | |
|     test.doesNotThrow(block, [error], [message])
 | |
|     test.ifError(value)
 | |
| */
 | |
| 
 | |
| var fs = require('fs');
 | |
| var exec = require('child_process').exec;
 | |
| 
 | |
| var _which = require('which').sync;
 | |
| function which(command) {
 | |
|   try {
 | |
|     _which(command);
 | |
|     return command;
 | |
|   } catch (err) {
 | |
|     return false;
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Look for grep first (any OS). If not found (but on Windows) look for find,
 | |
| // which is Windows' horribly crippled grep alternative.
 | |
| var grep = which('grep') || process.platform === 'win32' && which('find');
 | |
| 
 | |
| exports['exit'] = {
 | |
|   setUp: function(done) {
 | |
|     this.origCwd = process.cwd();
 | |
|     process.chdir('test/fixtures');
 | |
|     done();
 | |
|   },
 | |
|   tearDown: function(done) {
 | |
|     process.chdir(this.origCwd);
 | |
|     done();
 | |
|   },
 | |
|   'grep': function(test) {
 | |
|     test.expect(1);
 | |
|     // Many unit tests depend on this.
 | |
|     test.ok(grep, 'A suitable "grep" or "find" program was not found in the PATH.');
 | |
|     test.done();
 | |
|   },
 | |
|   // The rest of the tests are built dynamically, to keep things sane.
 | |
| };
 | |
| 
 | |
| // A few helper functions.
 | |
| function normalizeLineEndings(s) {
 | |
|   return s.replace(/\r?\n/g, '\n');
 | |
| }
 | |
| 
 | |
| // Capture command output, normalizing captured stdout to unix file endings.
 | |
| function run(command, callback) {
 | |
|   exec(command, function(error, stdout) {
 | |
|     callback(error ? error.code : 0, normalizeLineEndings(stdout));
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Read a fixture file, normalizing file contents to unix file endings.
 | |
| function fixture(filename) {
 | |
|   return normalizeLineEndings(String(fs.readFileSync(filename)));
 | |
| }
 | |
| 
 | |
| function buildTests() {
 | |
|   // Build individual unit tests for command output.
 | |
|   var counts = [10, 100, 1000];
 | |
|   var outputs = [' stdout stderr', ' stdout', ' stderr'];
 | |
|   var pipes = ['', ' | ' + grep + ' "std"'];
 | |
|   counts.forEach(function(count) {
 | |
|     outputs.forEach(function(output) {
 | |
|       pipes.forEach(function(pipe) {
 | |
|         var command = 'node log.js 0 ' + count + output + ' 2>&1' + pipe;
 | |
|         exports['exit']['output (' + command + ')'] = function(test) {
 | |
|           test.expect(2);
 | |
|           run(command, function(code, actual) {
 | |
|             var expected = fixture(count + output.replace(/ /g, '-') + '.txt');
 | |
|             // Sometimes, the actual file lines are out of order on Windows.
 | |
|             // But since the point of this lib is to drain the buffer and not
 | |
|             // guarantee output order, we only test the length.
 | |
|             test.equal(actual.length, expected.length, 'should be the same length.');
 | |
|             // The "fail" lines in log.js should NOT be output!
 | |
|             test.ok(actual.indexOf('fail') === -1, 'should not output after exit is called.');
 | |
|             test.done();
 | |
|           });
 | |
|         };
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   // Build individual unit tests for exit codes.
 | |
|   var codes = [0, 1, 123];
 | |
|   codes.forEach(function(code) {
 | |
|     var command = 'node log.js ' + code + ' 10 stdout stderr';
 | |
|     exports['exit']['exit code (' + command + ')'] = function(test) {
 | |
|       test.expect(1);
 | |
|       run(command, function(actual) {
 | |
|         // The specified exit code should be passed through.
 | |
|         test.equal(actual, code, 'should exit with ' + code + ' error code.');
 | |
|         test.done();
 | |
|       });
 | |
|     };
 | |
|   });
 | |
| }
 | |
| 
 | |
| // Don't bother building tests if grep wasn't found, otherwise everything will
 | |
| // fail and the error will get lost.
 | |
| if (grep) {
 | |
|   buildTests();
 | |
| }
 |