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:
22
frontend/node_modules/@jest/environment-jsdom-abstract/LICENSE
generated
vendored
Normal file
22
frontend/node_modules/@jest/environment-jsdom-abstract/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
Copyright Contributors to the Jest project.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
31
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.d.mts
generated
vendored
Normal file
31
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.d.mts
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
import { LegacyFakeTimers, ModernFakeTimers } from "@jest/fake-timers";
|
||||
import { ModuleMocker } from "jest-mock";
|
||||
import { Context } from "vm";
|
||||
import * as jsdom from "jsdom";
|
||||
import { EnvironmentContext, JestEnvironment, JestEnvironmentConfig } from "@jest/environment";
|
||||
import { Global } from "@jest/types";
|
||||
|
||||
//#region src/index.d.ts
|
||||
|
||||
type Win = Window & Global.Global & {
|
||||
Error: {
|
||||
stackTraceLimit: number;
|
||||
};
|
||||
};
|
||||
declare abstract class BaseJSDOMEnvironment implements JestEnvironment<number> {
|
||||
dom: jsdom.JSDOM | null;
|
||||
fakeTimers: LegacyFakeTimers<number> | null;
|
||||
fakeTimersModern: ModernFakeTimers | null;
|
||||
global: Win;
|
||||
private errorEventListener;
|
||||
moduleMocker: ModuleMocker | null;
|
||||
customExportConditions: string[];
|
||||
private readonly _configuredExportConditions?;
|
||||
protected constructor(config: JestEnvironmentConfig, context: EnvironmentContext, jsdomModule: typeof jsdom);
|
||||
setup(): Promise<void>;
|
||||
teardown(): Promise<void>;
|
||||
exportConditions(): Array<string>;
|
||||
getVmContext(): Context | null;
|
||||
}
|
||||
//#endregion
|
||||
export { BaseJSDOMEnvironment as default };
|
||||
47
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.d.ts
generated
vendored
Normal file
47
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import {Context} from 'vm';
|
||||
import * as jsdom from 'jsdom';
|
||||
import {
|
||||
EnvironmentContext,
|
||||
JestEnvironment,
|
||||
JestEnvironmentConfig,
|
||||
} from '@jest/environment';
|
||||
import {LegacyFakeTimers, ModernFakeTimers} from '@jest/fake-timers';
|
||||
import {Global as Global_2} from '@jest/types';
|
||||
import {ModuleMocker} from 'jest-mock';
|
||||
|
||||
declare abstract class BaseJSDOMEnvironment implements JestEnvironment<number> {
|
||||
dom: jsdom.JSDOM | null;
|
||||
fakeTimers: LegacyFakeTimers<number> | null;
|
||||
fakeTimersModern: ModernFakeTimers | null;
|
||||
global: Win;
|
||||
private errorEventListener;
|
||||
moduleMocker: ModuleMocker | null;
|
||||
customExportConditions: Array<string>;
|
||||
private readonly _configuredExportConditions?;
|
||||
protected constructor(
|
||||
config: JestEnvironmentConfig,
|
||||
context: EnvironmentContext,
|
||||
jsdomModule: typeof jsdom,
|
||||
);
|
||||
setup(): Promise<void>;
|
||||
teardown(): Promise<void>;
|
||||
exportConditions(): Array<string>;
|
||||
getVmContext(): Context | null;
|
||||
}
|
||||
export default BaseJSDOMEnvironment;
|
||||
|
||||
declare type Win = Window &
|
||||
Global_2.Global & {
|
||||
Error: {
|
||||
stackTraceLimit: number;
|
||||
};
|
||||
};
|
||||
|
||||
export {};
|
||||
194
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.js
generated
vendored
Normal file
194
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.js
generated
vendored
Normal file
@@ -0,0 +1,194 @@
|
||||
/*!
|
||||
* /**
|
||||
* * Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* *
|
||||
* * This source code is licensed under the MIT license found in the
|
||||
* * LICENSE file in the root directory of this source tree.
|
||||
* * /
|
||||
*/
|
||||
/******/ (() => { // webpackBootstrap
|
||||
/******/ "use strict";
|
||||
var __webpack_exports__ = {};
|
||||
// This entry needs to be wrapped in an IIFE because it uses a non-standard name for the exports (exports).
|
||||
(() => {
|
||||
var exports = __webpack_exports__;
|
||||
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({
|
||||
value: true
|
||||
}));
|
||||
exports["default"] = void 0;
|
||||
function _fakeTimers() {
|
||||
const data = require("@jest/fake-timers");
|
||||
_fakeTimers = function () {
|
||||
return data;
|
||||
};
|
||||
return data;
|
||||
}
|
||||
function _jestMock() {
|
||||
const data = require("jest-mock");
|
||||
_jestMock = function () {
|
||||
return data;
|
||||
};
|
||||
return data;
|
||||
}
|
||||
function _jestUtil() {
|
||||
const data = require("jest-util");
|
||||
_jestUtil = function () {
|
||||
return data;
|
||||
};
|
||||
return data;
|
||||
}
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// The `Window` interface does not have an `Error.stackTraceLimit` property, but
|
||||
// `JSDOMEnvironment` assumes it is there.
|
||||
|
||||
function isString(value) {
|
||||
return typeof value === 'string';
|
||||
}
|
||||
class BaseJSDOMEnvironment {
|
||||
dom;
|
||||
fakeTimers;
|
||||
fakeTimersModern;
|
||||
global;
|
||||
errorEventListener;
|
||||
moduleMocker;
|
||||
customExportConditions = ['browser'];
|
||||
_configuredExportConditions;
|
||||
constructor(config, context, jsdomModule) {
|
||||
const {
|
||||
projectConfig
|
||||
} = config;
|
||||
const {
|
||||
JSDOM,
|
||||
ResourceLoader,
|
||||
VirtualConsole
|
||||
} = jsdomModule;
|
||||
const virtualConsole = new VirtualConsole();
|
||||
virtualConsole.sendTo(context.console, {
|
||||
omitJSDOMErrors: true
|
||||
});
|
||||
virtualConsole.on('jsdomError', error => {
|
||||
context.console.error(error);
|
||||
});
|
||||
this.dom = new JSDOM(typeof projectConfig.testEnvironmentOptions.html === 'string' ? projectConfig.testEnvironmentOptions.html : '<!DOCTYPE html>', {
|
||||
pretendToBeVisual: true,
|
||||
resources: typeof projectConfig.testEnvironmentOptions.userAgent === 'string' ? new ResourceLoader({
|
||||
userAgent: projectConfig.testEnvironmentOptions.userAgent
|
||||
}) : undefined,
|
||||
runScripts: 'dangerously',
|
||||
url: 'http://localhost/',
|
||||
virtualConsole,
|
||||
...projectConfig.testEnvironmentOptions
|
||||
});
|
||||
const global = this.global = this.dom.window;
|
||||
if (global == null) {
|
||||
throw new Error('JSDOM did not return a Window object');
|
||||
}
|
||||
|
||||
// TODO: remove at some point - for "universal" code (code should use `globalThis`)
|
||||
global.global = global;
|
||||
|
||||
// Node's error-message stack size is limited at 10, but it's pretty useful
|
||||
// to see more than that when a test fails.
|
||||
this.global.Error.stackTraceLimit = 100;
|
||||
(0, _jestUtil().installCommonGlobals)(global, projectConfig.globals);
|
||||
|
||||
// TODO: remove this ASAP, but it currently causes tests to run really slow
|
||||
global.Buffer = Buffer;
|
||||
|
||||
// Report uncaught errors.
|
||||
this.errorEventListener = event => {
|
||||
if (userErrorListenerCount === 0 && event.error != null) {
|
||||
process.emit('uncaughtException', event.error);
|
||||
}
|
||||
};
|
||||
global.addEventListener('error', this.errorEventListener);
|
||||
|
||||
// However, don't report them as uncaught if the user listens to 'error' event.
|
||||
// In that case, we assume the might have custom error handling logic.
|
||||
const originalAddListener = global.addEventListener.bind(global);
|
||||
const originalRemoveListener = global.removeEventListener.bind(global);
|
||||
let userErrorListenerCount = 0;
|
||||
global.addEventListener = function (...args) {
|
||||
if (args[0] === 'error') {
|
||||
userErrorListenerCount++;
|
||||
}
|
||||
return originalAddListener.apply(this, args);
|
||||
};
|
||||
global.removeEventListener = function (...args) {
|
||||
if (args[0] === 'error') {
|
||||
userErrorListenerCount--;
|
||||
}
|
||||
return originalRemoveListener.apply(this, args);
|
||||
};
|
||||
if ('customExportConditions' in projectConfig.testEnvironmentOptions) {
|
||||
const {
|
||||
customExportConditions
|
||||
} = projectConfig.testEnvironmentOptions;
|
||||
if (Array.isArray(customExportConditions) && customExportConditions.every(isString)) {
|
||||
this._configuredExportConditions = customExportConditions;
|
||||
} else {
|
||||
throw new Error('Custom export conditions specified but they are not an array of strings');
|
||||
}
|
||||
}
|
||||
this.moduleMocker = new (_jestMock().ModuleMocker)(global);
|
||||
this.fakeTimers = new (_fakeTimers().LegacyFakeTimers)({
|
||||
config: projectConfig,
|
||||
global: global,
|
||||
moduleMocker: this.moduleMocker,
|
||||
timerConfig: {
|
||||
idToRef: id => id,
|
||||
refToId: ref => ref
|
||||
}
|
||||
});
|
||||
this.fakeTimersModern = new (_fakeTimers().ModernFakeTimers)({
|
||||
config: projectConfig,
|
||||
global: global
|
||||
});
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||
async setup() {}
|
||||
async teardown() {
|
||||
if (this.fakeTimers) {
|
||||
this.fakeTimers.dispose();
|
||||
}
|
||||
if (this.fakeTimersModern) {
|
||||
this.fakeTimersModern.dispose();
|
||||
}
|
||||
if (this.global != null) {
|
||||
if (this.errorEventListener) {
|
||||
this.global.removeEventListener('error', this.errorEventListener);
|
||||
}
|
||||
this.global.close();
|
||||
}
|
||||
this.errorEventListener = null;
|
||||
// @ts-expect-error: this.global not allowed to be `null`
|
||||
this.global = null;
|
||||
this.dom = null;
|
||||
this.fakeTimers = null;
|
||||
this.fakeTimersModern = null;
|
||||
}
|
||||
exportConditions() {
|
||||
return this._configuredExportConditions ?? this.customExportConditions;
|
||||
}
|
||||
getVmContext() {
|
||||
if (this.dom) {
|
||||
return this.dom.getInternalVMContext();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
exports["default"] = BaseJSDOMEnvironment;
|
||||
})();
|
||||
|
||||
module.exports = __webpack_exports__;
|
||||
/******/ })()
|
||||
;
|
||||
3
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.mjs
generated
vendored
Normal file
3
frontend/node_modules/@jest/environment-jsdom-abstract/build/index.mjs
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import cjsModule from './index.js';
|
||||
|
||||
export default cjsModule.default;
|
||||
49
frontend/node_modules/@jest/environment-jsdom-abstract/package.json
generated
vendored
Normal file
49
frontend/node_modules/@jest/environment-jsdom-abstract/package.json
generated
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"name": "@jest/environment-jsdom-abstract",
|
||||
"version": "30.0.4",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jestjs/jest.git",
|
||||
"directory": "packages/jest-environment-jsdom-abstract"
|
||||
},
|
||||
"license": "MIT",
|
||||
"main": "./build/index.js",
|
||||
"types": "./build/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./build/index.d.ts",
|
||||
"require": "./build/index.js",
|
||||
"import": "./build/index.mjs",
|
||||
"default": "./build/index.js"
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@jest/environment": "30.0.4",
|
||||
"@jest/fake-timers": "30.0.4",
|
||||
"@jest/types": "30.0.1",
|
||||
"@types/jsdom": "^21.1.7",
|
||||
"@types/node": "*",
|
||||
"jest-mock": "30.0.2",
|
||||
"jest-util": "30.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jsdom": "^26.1.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"canvas": "^3.0.0",
|
||||
"jsdom": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"canvas": {
|
||||
"optional": true
|
||||
}
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"gitHead": "f4296d2bc85c1405f84ddf613a25d0bc3766b7e5"
|
||||
}
|
||||
Reference in New Issue
Block a user