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:
		
							
								
								
									
										47
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/LinearCongruential.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/LinearCongruential.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| var MULTIPLIER = 0x000343fd; | ||||
| var INCREMENT = 0x00269ec3; | ||||
| var MASK = 0xffffffff; | ||||
| var MASK_2 = (1 << 31) - 1; | ||||
| var computeNextSeed = function (seed) { | ||||
|     return (seed * MULTIPLIER + INCREMENT) & MASK; | ||||
| }; | ||||
| var computeValueFromNextSeed = function (nextseed) { | ||||
|     return (nextseed & MASK_2) >> 16; | ||||
| }; | ||||
| var LinearCongruential32 = (function () { | ||||
|     function LinearCongruential32(seed) { | ||||
|         this.seed = seed; | ||||
|     } | ||||
|     LinearCongruential32.prototype.clone = function () { | ||||
|         return new LinearCongruential32(this.seed); | ||||
|     }; | ||||
|     LinearCongruential32.prototype.next = function () { | ||||
|         var nextRng = new LinearCongruential32(this.seed); | ||||
|         var out = nextRng.unsafeNext(); | ||||
|         return [out, nextRng]; | ||||
|     }; | ||||
|     LinearCongruential32.prototype.unsafeNext = function () { | ||||
|         var s1 = computeNextSeed(this.seed); | ||||
|         var v1 = computeValueFromNextSeed(s1); | ||||
|         var s2 = computeNextSeed(s1); | ||||
|         var v2 = computeValueFromNextSeed(s2); | ||||
|         this.seed = computeNextSeed(s2); | ||||
|         var v3 = computeValueFromNextSeed(this.seed); | ||||
|         var vnext = v3 + ((v2 + (v1 << 15)) << 15); | ||||
|         return vnext | 0; | ||||
|     }; | ||||
|     LinearCongruential32.prototype.getState = function () { | ||||
|         return [this.seed]; | ||||
|     }; | ||||
|     return LinearCongruential32; | ||||
| }()); | ||||
| function fromState(state) { | ||||
|     var valid = state.length === 1; | ||||
|     if (!valid) { | ||||
|         throw new Error('The state must have been produced by a congruential32 RandomGenerator'); | ||||
|     } | ||||
|     return new LinearCongruential32(state[0]); | ||||
| } | ||||
| export var congruential32 = Object.assign(function (seed) { | ||||
|     return new LinearCongruential32(seed); | ||||
| }, { fromState: fromState }); | ||||
							
								
								
									
										107
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/MersenneTwister.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/MersenneTwister.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| var __read = (this && this.__read) || function (o, n) { | ||||
|     var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||||
|     if (!m) return o; | ||||
|     var i = m.call(o), r, ar = [], e; | ||||
|     try { | ||||
|         while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); | ||||
|     } | ||||
|     catch (error) { e = { error: error }; } | ||||
|     finally { | ||||
|         try { | ||||
|             if (r && !r.done && (m = i["return"])) m.call(i); | ||||
|         } | ||||
|         finally { if (e) throw e.error; } | ||||
|     } | ||||
|     return ar; | ||||
| }; | ||||
| var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | ||||
|     if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { | ||||
|         if (ar || !(i in from)) { | ||||
|             if (!ar) ar = Array.prototype.slice.call(from, 0, i); | ||||
|             ar[i] = from[i]; | ||||
|         } | ||||
|     } | ||||
|     return to.concat(ar || Array.prototype.slice.call(from)); | ||||
| }; | ||||
| var MersenneTwister = (function () { | ||||
|     function MersenneTwister(states, index) { | ||||
|         this.states = states; | ||||
|         this.index = index; | ||||
|     } | ||||
|     MersenneTwister.twist = function (prev) { | ||||
|         var mt = prev.slice(); | ||||
|         for (var idx = 0; idx !== MersenneTwister.N - MersenneTwister.M; ++idx) { | ||||
|             var y_1 = (mt[idx] & MersenneTwister.MASK_UPPER) + (mt[idx + 1] & MersenneTwister.MASK_LOWER); | ||||
|             mt[idx] = mt[idx + MersenneTwister.M] ^ (y_1 >>> 1) ^ (-(y_1 & 1) & MersenneTwister.A); | ||||
|         } | ||||
|         for (var idx = MersenneTwister.N - MersenneTwister.M; idx !== MersenneTwister.N - 1; ++idx) { | ||||
|             var y_2 = (mt[idx] & MersenneTwister.MASK_UPPER) + (mt[idx + 1] & MersenneTwister.MASK_LOWER); | ||||
|             mt[idx] = mt[idx + MersenneTwister.M - MersenneTwister.N] ^ (y_2 >>> 1) ^ (-(y_2 & 1) & MersenneTwister.A); | ||||
|         } | ||||
|         var y = (mt[MersenneTwister.N - 1] & MersenneTwister.MASK_UPPER) + (mt[0] & MersenneTwister.MASK_LOWER); | ||||
|         mt[MersenneTwister.N - 1] = mt[MersenneTwister.M - 1] ^ (y >>> 1) ^ (-(y & 1) & MersenneTwister.A); | ||||
|         return mt; | ||||
|     }; | ||||
|     MersenneTwister.seeded = function (seed) { | ||||
|         var out = Array(MersenneTwister.N); | ||||
|         out[0] = seed; | ||||
|         for (var idx = 1; idx !== MersenneTwister.N; ++idx) { | ||||
|             var xored = out[idx - 1] ^ (out[idx - 1] >>> 30); | ||||
|             out[idx] = (Math.imul(MersenneTwister.F, xored) + idx) | 0; | ||||
|         } | ||||
|         return out; | ||||
|     }; | ||||
|     MersenneTwister.from = function (seed) { | ||||
|         return new MersenneTwister(MersenneTwister.twist(MersenneTwister.seeded(seed)), 0); | ||||
|     }; | ||||
|     MersenneTwister.prototype.clone = function () { | ||||
|         return new MersenneTwister(this.states, this.index); | ||||
|     }; | ||||
|     MersenneTwister.prototype.next = function () { | ||||
|         var nextRng = new MersenneTwister(this.states, this.index); | ||||
|         var out = nextRng.unsafeNext(); | ||||
|         return [out, nextRng]; | ||||
|     }; | ||||
|     MersenneTwister.prototype.unsafeNext = function () { | ||||
|         var y = this.states[this.index]; | ||||
|         y ^= this.states[this.index] >>> MersenneTwister.U; | ||||
|         y ^= (y << MersenneTwister.S) & MersenneTwister.B; | ||||
|         y ^= (y << MersenneTwister.T) & MersenneTwister.C; | ||||
|         y ^= y >>> MersenneTwister.L; | ||||
|         if (++this.index >= MersenneTwister.N) { | ||||
|             this.states = MersenneTwister.twist(this.states); | ||||
|             this.index = 0; | ||||
|         } | ||||
|         return y; | ||||
|     }; | ||||
|     MersenneTwister.prototype.getState = function () { | ||||
|         return __spreadArray([this.index], __read(this.states), false); | ||||
|     }; | ||||
|     MersenneTwister.fromState = function (state) { | ||||
|         var valid = state.length === MersenneTwister.N + 1 && state[0] >= 0 && state[0] < MersenneTwister.N; | ||||
|         if (!valid) { | ||||
|             throw new Error('The state must have been produced by a mersenne RandomGenerator'); | ||||
|         } | ||||
|         return new MersenneTwister(state.slice(1), state[0]); | ||||
|     }; | ||||
|     MersenneTwister.N = 624; | ||||
|     MersenneTwister.M = 397; | ||||
|     MersenneTwister.R = 31; | ||||
|     MersenneTwister.A = 0x9908b0df; | ||||
|     MersenneTwister.F = 1812433253; | ||||
|     MersenneTwister.U = 11; | ||||
|     MersenneTwister.S = 7; | ||||
|     MersenneTwister.B = 0x9d2c5680; | ||||
|     MersenneTwister.T = 15; | ||||
|     MersenneTwister.C = 0xefc60000; | ||||
|     MersenneTwister.L = 18; | ||||
|     MersenneTwister.MASK_LOWER = Math.pow(2, MersenneTwister.R) - 1; | ||||
|     MersenneTwister.MASK_UPPER = Math.pow(2, MersenneTwister.R); | ||||
|     return MersenneTwister; | ||||
| }()); | ||||
| function fromState(state) { | ||||
|     return MersenneTwister.fromState(state); | ||||
| } | ||||
| export var mersenne = Object.assign(function (seed) { | ||||
|     return MersenneTwister.from(seed); | ||||
| }, { fromState: fromState }); | ||||
							
								
								
									
										69
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/XorShift.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/XorShift.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| var XorShift128Plus = (function () { | ||||
|     function XorShift128Plus(s01, s00, s11, s10) { | ||||
|         this.s01 = s01; | ||||
|         this.s00 = s00; | ||||
|         this.s11 = s11; | ||||
|         this.s10 = s10; | ||||
|     } | ||||
|     XorShift128Plus.prototype.clone = function () { | ||||
|         return new XorShift128Plus(this.s01, this.s00, this.s11, this.s10); | ||||
|     }; | ||||
|     XorShift128Plus.prototype.next = function () { | ||||
|         var nextRng = new XorShift128Plus(this.s01, this.s00, this.s11, this.s10); | ||||
|         var out = nextRng.unsafeNext(); | ||||
|         return [out, nextRng]; | ||||
|     }; | ||||
|     XorShift128Plus.prototype.unsafeNext = function () { | ||||
|         var a0 = this.s00 ^ (this.s00 << 23); | ||||
|         var a1 = this.s01 ^ ((this.s01 << 23) | (this.s00 >>> 9)); | ||||
|         var b0 = a0 ^ this.s10 ^ ((a0 >>> 18) | (a1 << 14)) ^ ((this.s10 >>> 5) | (this.s11 << 27)); | ||||
|         var b1 = a1 ^ this.s11 ^ (a1 >>> 18) ^ (this.s11 >>> 5); | ||||
|         var out = (this.s00 + this.s10) | 0; | ||||
|         this.s01 = this.s11; | ||||
|         this.s00 = this.s10; | ||||
|         this.s11 = b1; | ||||
|         this.s10 = b0; | ||||
|         return out; | ||||
|     }; | ||||
|     XorShift128Plus.prototype.jump = function () { | ||||
|         var nextRng = new XorShift128Plus(this.s01, this.s00, this.s11, this.s10); | ||||
|         nextRng.unsafeJump(); | ||||
|         return nextRng; | ||||
|     }; | ||||
|     XorShift128Plus.prototype.unsafeJump = function () { | ||||
|         var ns01 = 0; | ||||
|         var ns00 = 0; | ||||
|         var ns11 = 0; | ||||
|         var ns10 = 0; | ||||
|         var jump = [0x635d2dff, 0x8a5cd789, 0x5c472f96, 0x121fd215]; | ||||
|         for (var i = 0; i !== 4; ++i) { | ||||
|             for (var mask = 1; mask; mask <<= 1) { | ||||
|                 if (jump[i] & mask) { | ||||
|                     ns01 ^= this.s01; | ||||
|                     ns00 ^= this.s00; | ||||
|                     ns11 ^= this.s11; | ||||
|                     ns10 ^= this.s10; | ||||
|                 } | ||||
|                 this.unsafeNext(); | ||||
|             } | ||||
|         } | ||||
|         this.s01 = ns01; | ||||
|         this.s00 = ns00; | ||||
|         this.s11 = ns11; | ||||
|         this.s10 = ns10; | ||||
|     }; | ||||
|     XorShift128Plus.prototype.getState = function () { | ||||
|         return [this.s01, this.s00, this.s11, this.s10]; | ||||
|     }; | ||||
|     return XorShift128Plus; | ||||
| }()); | ||||
| function fromState(state) { | ||||
|     var valid = state.length === 4; | ||||
|     if (!valid) { | ||||
|         throw new Error('The state must have been produced by a xorshift128plus RandomGenerator'); | ||||
|     } | ||||
|     return new XorShift128Plus(state[0], state[1], state[2], state[3]); | ||||
| } | ||||
| export var xorshift128plus = Object.assign(function (seed) { | ||||
|     return new XorShift128Plus(-1, ~seed, seed | 0, 0); | ||||
| }, { fromState: fromState }); | ||||
							
								
								
									
										69
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/XoroShiro.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								frontend/node_modules/pure-rand/lib/esm/generator/XoroShiro.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| var XoroShiro128Plus = (function () { | ||||
|     function XoroShiro128Plus(s01, s00, s11, s10) { | ||||
|         this.s01 = s01; | ||||
|         this.s00 = s00; | ||||
|         this.s11 = s11; | ||||
|         this.s10 = s10; | ||||
|     } | ||||
|     XoroShiro128Plus.prototype.clone = function () { | ||||
|         return new XoroShiro128Plus(this.s01, this.s00, this.s11, this.s10); | ||||
|     }; | ||||
|     XoroShiro128Plus.prototype.next = function () { | ||||
|         var nextRng = new XoroShiro128Plus(this.s01, this.s00, this.s11, this.s10); | ||||
|         var out = nextRng.unsafeNext(); | ||||
|         return [out, nextRng]; | ||||
|     }; | ||||
|     XoroShiro128Plus.prototype.unsafeNext = function () { | ||||
|         var out = (this.s00 + this.s10) | 0; | ||||
|         var a0 = this.s10 ^ this.s00; | ||||
|         var a1 = this.s11 ^ this.s01; | ||||
|         var s00 = this.s00; | ||||
|         var s01 = this.s01; | ||||
|         this.s00 = (s00 << 24) ^ (s01 >>> 8) ^ a0 ^ (a0 << 16); | ||||
|         this.s01 = (s01 << 24) ^ (s00 >>> 8) ^ a1 ^ ((a1 << 16) | (a0 >>> 16)); | ||||
|         this.s10 = (a1 << 5) ^ (a0 >>> 27); | ||||
|         this.s11 = (a0 << 5) ^ (a1 >>> 27); | ||||
|         return out; | ||||
|     }; | ||||
|     XoroShiro128Plus.prototype.jump = function () { | ||||
|         var nextRng = new XoroShiro128Plus(this.s01, this.s00, this.s11, this.s10); | ||||
|         nextRng.unsafeJump(); | ||||
|         return nextRng; | ||||
|     }; | ||||
|     XoroShiro128Plus.prototype.unsafeJump = function () { | ||||
|         var ns01 = 0; | ||||
|         var ns00 = 0; | ||||
|         var ns11 = 0; | ||||
|         var ns10 = 0; | ||||
|         var jump = [0xd8f554a5, 0xdf900294, 0x4b3201fc, 0x170865df]; | ||||
|         for (var i = 0; i !== 4; ++i) { | ||||
|             for (var mask = 1; mask; mask <<= 1) { | ||||
|                 if (jump[i] & mask) { | ||||
|                     ns01 ^= this.s01; | ||||
|                     ns00 ^= this.s00; | ||||
|                     ns11 ^= this.s11; | ||||
|                     ns10 ^= this.s10; | ||||
|                 } | ||||
|                 this.unsafeNext(); | ||||
|             } | ||||
|         } | ||||
|         this.s01 = ns01; | ||||
|         this.s00 = ns00; | ||||
|         this.s11 = ns11; | ||||
|         this.s10 = ns10; | ||||
|     }; | ||||
|     XoroShiro128Plus.prototype.getState = function () { | ||||
|         return [this.s01, this.s00, this.s11, this.s10]; | ||||
|     }; | ||||
|     return XoroShiro128Plus; | ||||
| }()); | ||||
| function fromState(state) { | ||||
|     var valid = state.length === 4; | ||||
|     if (!valid) { | ||||
|         throw new Error('The state must have been produced by a xoroshiro128plus RandomGenerator'); | ||||
|     } | ||||
|     return new XoroShiro128Plus(state[0], state[1], state[2], state[3]); | ||||
| } | ||||
| export var xoroshiro128plus = Object.assign(function (seed) { | ||||
|     return new XoroShiro128Plus(-1, ~seed, seed | 0, 0); | ||||
| }, { fromState: fromState }); | ||||
		Reference in New Issue
	
	Block a user
	 anthonyrawlins
					anthonyrawlins