 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>
		
			
				
	
	
		
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
|  Copyright 2012-2015, Yahoo Inc.
 | |
|  Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
 | |
|  */
 | |
| 'use strict';
 | |
| 
 | |
| const percent = require('./percent');
 | |
| const dataProperties = require('./data-properties');
 | |
| 
 | |
| function blankSummary() {
 | |
|     const empty = () => ({
 | |
|         total: 0,
 | |
|         covered: 0,
 | |
|         skipped: 0,
 | |
|         pct: 'Unknown'
 | |
|     });
 | |
| 
 | |
|     return {
 | |
|         lines: empty(),
 | |
|         statements: empty(),
 | |
|         functions: empty(),
 | |
|         branches: empty(),
 | |
|         branchesTrue: empty()
 | |
|     };
 | |
| }
 | |
| 
 | |
| // asserts that a data object "looks like" a summary coverage object
 | |
| function assertValidSummary(obj) {
 | |
|     const valid =
 | |
|         obj && obj.lines && obj.statements && obj.functions && obj.branches;
 | |
|     if (!valid) {
 | |
|         throw new Error(
 | |
|             'Invalid summary coverage object, missing keys, found:' +
 | |
|                 Object.keys(obj).join(',')
 | |
|         );
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * CoverageSummary provides a summary of code coverage . It exposes 4 properties,
 | |
|  * `lines`, `statements`, `branches`, and `functions`. Each of these properties
 | |
|  * is an object that has 4 keys `total`, `covered`, `skipped` and `pct`.
 | |
|  * `pct` is a percentage number (0-100).
 | |
|  */
 | |
| class CoverageSummary {
 | |
|     /**
 | |
|      * @constructor
 | |
|      * @param {Object|CoverageSummary} [obj=undefined] an optional data object or
 | |
|      * another coverage summary to initialize this object with.
 | |
|      */
 | |
|     constructor(obj) {
 | |
|         if (!obj) {
 | |
|             this.data = blankSummary();
 | |
|         } else if (obj instanceof CoverageSummary) {
 | |
|             this.data = obj.data;
 | |
|         } else {
 | |
|             this.data = obj;
 | |
|         }
 | |
|         assertValidSummary(this.data);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * merges a second summary coverage object into this one
 | |
|      * @param {CoverageSummary} obj - another coverage summary object
 | |
|      */
 | |
|     merge(obj) {
 | |
|         const keys = [
 | |
|             'lines',
 | |
|             'statements',
 | |
|             'branches',
 | |
|             'functions',
 | |
|             'branchesTrue'
 | |
|         ];
 | |
|         keys.forEach(key => {
 | |
|             if (obj[key]) {
 | |
|                 this[key].total += obj[key].total;
 | |
|                 this[key].covered += obj[key].covered;
 | |
|                 this[key].skipped += obj[key].skipped;
 | |
|                 this[key].pct = percent(this[key].covered, this[key].total);
 | |
|             }
 | |
|         });
 | |
| 
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * returns a POJO that is JSON serializable. May be used to get the raw
 | |
|      * summary object.
 | |
|      */
 | |
|     toJSON() {
 | |
|         return this.data;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * return true if summary has no lines of code
 | |
|      */
 | |
|     isEmpty() {
 | |
|         return this.lines.total === 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| dataProperties(CoverageSummary, [
 | |
|     'lines',
 | |
|     'statements',
 | |
|     'functions',
 | |
|     'branches',
 | |
|     'branchesTrue'
 | |
| ]);
 | |
| 
 | |
| module.exports = {
 | |
|     CoverageSummary
 | |
| };
 |