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:
72
frontend/node_modules/@testing-library/user-event/dist/esm/pointer/index.js
generated
vendored
Normal file
72
frontend/node_modules/@testing-library/user-event/dist/esm/pointer/index.js
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
import '../utils/dataTransfer/Clipboard.js';
|
||||
import { setLevelRef, ApiLevel } from '../utils/misc/level.js';
|
||||
import { wait } from '../utils/misc/wait.js';
|
||||
import { parseKeyDef } from './parseKeyDef.js';
|
||||
|
||||
async function pointer(input) {
|
||||
const { pointerMap } = this.config;
|
||||
const actions = [];
|
||||
(Array.isArray(input) ? input : [
|
||||
input
|
||||
]).forEach((actionInput)=>{
|
||||
if (typeof actionInput === 'string') {
|
||||
actions.push(...parseKeyDef(pointerMap, actionInput));
|
||||
} else if ('keys' in actionInput) {
|
||||
actions.push(...parseKeyDef(pointerMap, actionInput.keys).map((i)=>({
|
||||
...actionInput,
|
||||
...i
|
||||
})));
|
||||
} else {
|
||||
actions.push(actionInput);
|
||||
}
|
||||
});
|
||||
for(let i = 0; i < actions.length; i++){
|
||||
await wait(this.config);
|
||||
await pointerAction(this, actions[i]);
|
||||
}
|
||||
this.system.pointer.resetClickCount();
|
||||
}
|
||||
async function pointerAction(instance, action) {
|
||||
var _previousPosition_caret, _previousPosition_caret1;
|
||||
const pointerName = 'pointerName' in action && action.pointerName ? action.pointerName : 'keyDef' in action ? instance.system.pointer.getPointerName(action.keyDef) : 'mouse';
|
||||
const previousPosition = instance.system.pointer.getPreviousPosition(pointerName);
|
||||
var _action_target, _action_coords, _action_node, _action_offset;
|
||||
const position = {
|
||||
target: (_action_target = action.target) !== null && _action_target !== undefined ? _action_target : getPrevTarget(instance, previousPosition),
|
||||
coords: (_action_coords = action.coords) !== null && _action_coords !== undefined ? _action_coords : previousPosition === null || previousPosition === undefined ? undefined : previousPosition.coords,
|
||||
caret: {
|
||||
node: (_action_node = action.node) !== null && _action_node !== undefined ? _action_node : hasCaretPosition(action) ? undefined : previousPosition === null || previousPosition === undefined ? undefined : (_previousPosition_caret = previousPosition.caret) === null || _previousPosition_caret === undefined ? undefined : _previousPosition_caret.node,
|
||||
offset: (_action_offset = action.offset) !== null && _action_offset !== undefined ? _action_offset : hasCaretPosition(action) ? undefined : previousPosition === null || previousPosition === undefined ? undefined : (_previousPosition_caret1 = previousPosition.caret) === null || _previousPosition_caret1 === undefined ? undefined : _previousPosition_caret1.offset
|
||||
}
|
||||
};
|
||||
if ('keyDef' in action) {
|
||||
if (instance.system.pointer.isKeyPressed(action.keyDef)) {
|
||||
setLevelRef(instance, ApiLevel.Trigger);
|
||||
await instance.system.pointer.release(instance, action.keyDef, position);
|
||||
}
|
||||
if (!action.releasePrevious) {
|
||||
setLevelRef(instance, ApiLevel.Trigger);
|
||||
await instance.system.pointer.press(instance, action.keyDef, position);
|
||||
if (action.releaseSelf) {
|
||||
setLevelRef(instance, ApiLevel.Trigger);
|
||||
await instance.system.pointer.release(instance, action.keyDef, position);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
setLevelRef(instance, ApiLevel.Trigger);
|
||||
await instance.system.pointer.move(instance, pointerName, position);
|
||||
}
|
||||
}
|
||||
function hasCaretPosition(action) {
|
||||
var _action_target, _ref;
|
||||
return !!((_ref = (_action_target = action.target) !== null && _action_target !== undefined ? _action_target : action.node) !== null && _ref !== undefined ? _ref : action.offset !== undefined);
|
||||
}
|
||||
function getPrevTarget(instance, position) {
|
||||
if (!position) {
|
||||
throw new Error('This pointer has no previous position. Provide a target property!');
|
||||
}
|
||||
var _position_target;
|
||||
return (_position_target = position.target) !== null && _position_target !== undefined ? _position_target : instance.config.document.body;
|
||||
}
|
||||
|
||||
export { pointer };
|
||||
31
frontend/node_modules/@testing-library/user-event/dist/esm/pointer/keyMap.js
generated
vendored
Normal file
31
frontend/node_modules/@testing-library/user-event/dist/esm/pointer/keyMap.js
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
const defaultKeyMap = [
|
||||
{
|
||||
name: 'MouseLeft',
|
||||
pointerType: 'mouse',
|
||||
button: 'primary'
|
||||
},
|
||||
{
|
||||
name: 'MouseRight',
|
||||
pointerType: 'mouse',
|
||||
button: 'secondary'
|
||||
},
|
||||
{
|
||||
name: 'MouseMiddle',
|
||||
pointerType: 'mouse',
|
||||
button: 'auxiliary'
|
||||
},
|
||||
{
|
||||
name: 'TouchA',
|
||||
pointerType: 'touch'
|
||||
},
|
||||
{
|
||||
name: 'TouchB',
|
||||
pointerType: 'touch'
|
||||
},
|
||||
{
|
||||
name: 'TouchC',
|
||||
pointerType: 'touch'
|
||||
}
|
||||
];
|
||||
|
||||
export { defaultKeyMap };
|
||||
21
frontend/node_modules/@testing-library/user-event/dist/esm/pointer/parseKeyDef.js
generated
vendored
Normal file
21
frontend/node_modules/@testing-library/user-event/dist/esm/pointer/parseKeyDef.js
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
import '../utils/dataTransfer/Clipboard.js';
|
||||
import { readNextDescriptor } from '../utils/keyDef/readNextDescriptor.js';
|
||||
|
||||
function parseKeyDef(pointerMap, keys) {
|
||||
const defs = [];
|
||||
do {
|
||||
const { descriptor, consumedLength, releasePrevious, releaseSelf = true } = readNextDescriptor(keys, 'pointer');
|
||||
const keyDef = pointerMap.find((p)=>p.name === descriptor);
|
||||
if (keyDef) {
|
||||
defs.push({
|
||||
keyDef,
|
||||
releasePrevious,
|
||||
releaseSelf
|
||||
});
|
||||
}
|
||||
keys = keys.slice(consumedLength);
|
||||
}while (keys)
|
||||
return defs;
|
||||
}
|
||||
|
||||
export { parseKeyDef };
|
||||
Reference in New Issue
Block a user