 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>
		
			
				
	
	
		
			136 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| const urlencoded = require("./urlencoded");
 | |
| 
 | |
| exports.implementation = class URLSearchParamsImpl {
 | |
|   constructor(globalObject, constructorArgs, { doNotStripQMark = false }) {
 | |
|     let init = constructorArgs[0];
 | |
|     this._list = [];
 | |
|     this._url = null;
 | |
| 
 | |
|     if (!doNotStripQMark && typeof init === "string" && init[0] === "?") {
 | |
|       init = init.slice(1);
 | |
|     }
 | |
| 
 | |
|     if (Array.isArray(init)) {
 | |
|       for (const pair of init) {
 | |
|         if (pair.length !== 2) {
 | |
|           throw new TypeError("Failed to construct 'URLSearchParams': parameter 1 sequence's element does not " +
 | |
|                               "contain exactly two elements.");
 | |
|         }
 | |
|         this._list.push([pair[0], pair[1]]);
 | |
|       }
 | |
|     } else if (typeof init === "object" && Object.getPrototypeOf(init) === null) {
 | |
|       for (const name of Object.keys(init)) {
 | |
|         const value = init[name];
 | |
|         this._list.push([name, value]);
 | |
|       }
 | |
|     } else {
 | |
|       this._list = urlencoded.parseUrlencodedString(init);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   _updateSteps() {
 | |
|     if (this._url !== null) {
 | |
|       let serializedQuery = urlencoded.serializeUrlencoded(this._list);
 | |
|       if (serializedQuery === "") {
 | |
|         serializedQuery = null;
 | |
|       }
 | |
| 
 | |
|       this._url._url.query = serializedQuery;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   get size() {
 | |
|     return this._list.length;
 | |
|   }
 | |
| 
 | |
|   append(name, value) {
 | |
|     this._list.push([name, value]);
 | |
|     this._updateSteps();
 | |
|   }
 | |
| 
 | |
|   delete(name, value) {
 | |
|     let i = 0;
 | |
|     while (i < this._list.length) {
 | |
|       if (this._list[i][0] === name && (value === undefined || this._list[i][1] === value)) {
 | |
|         this._list.splice(i, 1);
 | |
|       } else {
 | |
|         i++;
 | |
|       }
 | |
|     }
 | |
|     this._updateSteps();
 | |
|   }
 | |
| 
 | |
|   get(name) {
 | |
|     for (const tuple of this._list) {
 | |
|       if (tuple[0] === name) {
 | |
|         return tuple[1];
 | |
|       }
 | |
|     }
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   getAll(name) {
 | |
|     const output = [];
 | |
|     for (const tuple of this._list) {
 | |
|       if (tuple[0] === name) {
 | |
|         output.push(tuple[1]);
 | |
|       }
 | |
|     }
 | |
|     return output;
 | |
|   }
 | |
| 
 | |
|   has(name, value) {
 | |
|     for (const tuple of this._list) {
 | |
|       if (tuple[0] === name && (value === undefined || tuple[1] === value)) {
 | |
|         return true;
 | |
|       }
 | |
|     }
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   set(name, value) {
 | |
|     let found = false;
 | |
|     let i = 0;
 | |
|     while (i < this._list.length) {
 | |
|       if (this._list[i][0] === name) {
 | |
|         if (found) {
 | |
|           this._list.splice(i, 1);
 | |
|         } else {
 | |
|           found = true;
 | |
|           this._list[i][1] = value;
 | |
|           i++;
 | |
|         }
 | |
|       } else {
 | |
|         i++;
 | |
|       }
 | |
|     }
 | |
|     if (!found) {
 | |
|       this._list.push([name, value]);
 | |
|     }
 | |
|     this._updateSteps();
 | |
|   }
 | |
| 
 | |
|   sort() {
 | |
|     this._list.sort((a, b) => {
 | |
|       if (a[0] < b[0]) {
 | |
|         return -1;
 | |
|       }
 | |
|       if (a[0] > b[0]) {
 | |
|         return 1;
 | |
|       }
 | |
|       return 0;
 | |
|     });
 | |
| 
 | |
|     this._updateSteps();
 | |
|   }
 | |
| 
 | |
|   [Symbol.iterator]() {
 | |
|     return this._list[Symbol.iterator]();
 | |
|   }
 | |
| 
 | |
|   toString() {
 | |
|     return urlencoded.serializeUrlencoded(this._list);
 | |
|   }
 | |
| };
 |