 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>
		
			
				
	
	
		
			397 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			397 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Context } from "vm";
 | |
| import { LegacyFakeTimers, ModernFakeTimers } from "@jest/fake-timers";
 | |
| import { Circus, Config, Global } from "@jest/types";
 | |
| import { Mocked, ModuleMocker } from "jest-mock";
 | |
| 
 | |
| //#region src/index.d.ts
 | |
| 
 | |
| type EnvironmentContext = {
 | |
|   console: Console;
 | |
|   docblockPragmas: Record<string, string | Array<string>>;
 | |
|   testPath: string;
 | |
| };
 | |
| type ModuleWrapper = (this: Module['exports'], module: Module, exports: Module['exports'], require: Module['require'], __dirname: string, __filename: Module['filename'], jest?: Jest, ...sandboxInjectedGlobals: Array<Global.Global[keyof Global.Global]>) => unknown;
 | |
| interface JestImportMeta extends ImportMeta {
 | |
|   jest: Jest;
 | |
| }
 | |
| interface JestEnvironmentConfig {
 | |
|   projectConfig: Config.ProjectConfig;
 | |
|   globalConfig: Config.GlobalConfig;
 | |
| }
 | |
| declare class JestEnvironment<Timer = unknown> {
 | |
|   constructor(config: JestEnvironmentConfig, context: EnvironmentContext);
 | |
|   global: Global.Global;
 | |
|   fakeTimers: LegacyFakeTimers<Timer> | null;
 | |
|   fakeTimersModern: ModernFakeTimers | null;
 | |
|   moduleMocker: ModuleMocker | null;
 | |
|   getVmContext(): Context | null;
 | |
|   setup(): Promise<void>;
 | |
|   teardown(): Promise<void>;
 | |
|   handleTestEvent?: Circus.EventHandler;
 | |
|   exportConditions?: () => Array<string>;
 | |
| }
 | |
| type Module = NodeModule;
 | |
| interface Jest {
 | |
|   /**
 | |
|    * Advances all timers by `msToRun` milliseconds. All pending "macro-tasks"
 | |
|    * that have been queued via `setTimeout()` or `setInterval()`, and would be
 | |
|    * executed within this time frame will be executed.
 | |
|    */
 | |
|   advanceTimersByTime(msToRun: number): void;
 | |
|   /**
 | |
|    * Advances all timers by `msToRun` milliseconds, firing callbacks if necessary.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   advanceTimersByTimeAsync(msToRun: number): Promise<void>;
 | |
|   /**
 | |
|    * Advances all timers by the needed milliseconds to execute callbacks currently scheduled with `requestAnimationFrame`.
 | |
|    * `advanceTimersToNextFrame()` is a helpful way to execute code that is scheduled using `requestAnimationFrame`.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   advanceTimersToNextFrame(): void;
 | |
|   /**
 | |
|    * Advances all timers by the needed milliseconds so that only the next
 | |
|    * timeouts/intervals will run. Optionally, you can provide steps, so it will
 | |
|    * run steps amount of next timeouts/intervals.
 | |
|    */
 | |
|   advanceTimersToNextTimer(steps?: number): void;
 | |
|   /**
 | |
|    * Advances the clock to the moment of the first scheduled timer, firing it.
 | |
|    * Optionally, you can provide steps, so it will run steps amount of
 | |
|    * next timeouts/intervals.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   advanceTimersToNextTimerAsync(steps?: number): Promise<void>;
 | |
|   /**
 | |
|    * Disables automatic mocking in the module loader.
 | |
|    */
 | |
|   autoMockOff(): Jest;
 | |
|   /**
 | |
|    * Enables automatic mocking in the module loader.
 | |
|    */
 | |
|   autoMockOn(): Jest;
 | |
|   /**
 | |
|    * Clears the `mock.calls`, `mock.instances`, `mock.contexts` and `mock.results` properties of
 | |
|    * all mocks. Equivalent to calling `.mockClear()` on every mocked function.
 | |
|    */
 | |
|   clearAllMocks(): Jest;
 | |
|   /**
 | |
|    * Removes any pending timers from the timer system. If any timers have been
 | |
|    * scheduled, they will be cleared and will never have the opportunity to
 | |
|    * execute in the future.
 | |
|    */
 | |
|   clearAllTimers(): void;
 | |
|   /**
 | |
|    * Given the name of a module, use the automatic mocking system to generate a
 | |
|    * mocked version of the module for you.
 | |
|    *
 | |
|    * This is useful when you want to create a manual mock that extends the
 | |
|    * automatic mock's behavior.
 | |
|    */
 | |
|   createMockFromModule<T = unknown>(moduleName: string): Mocked<T>;
 | |
|   /**
 | |
|    * Indicates that the module system should never return a mocked version of
 | |
|    * the specified module and its dependencies.
 | |
|    */
 | |
|   deepUnmock(moduleName: string): Jest;
 | |
|   /**
 | |
|    * Disables automatic mocking in the module loader.
 | |
|    *
 | |
|    * After this method is called, all `require()`s will return the real
 | |
|    * versions of each module (rather than a mocked version).
 | |
|    */
 | |
|   disableAutomock(): Jest;
 | |
|   /**
 | |
|    * When using `babel-jest`, calls to `jest.mock()` will automatically be hoisted
 | |
|    * to the top of the code block. Use this method if you want to explicitly
 | |
|    * avoid this behavior.
 | |
|    */
 | |
|   doMock<T = unknown>(moduleName: string, moduleFactory?: () => T, options?: {
 | |
|     virtual?: boolean;
 | |
|   }): Jest;
 | |
|   /**
 | |
|    * When using `babel-jest`, calls to `jest.unmock()` will automatically be hoisted
 | |
|    * to the top of the code block. Use this method if you want to explicitly
 | |
|    * avoid this behavior.
 | |
|    */
 | |
|   dontMock(moduleName: string): Jest;
 | |
|   /**
 | |
|    * Enables automatic mocking in the module loader.
 | |
|    */
 | |
|   enableAutomock(): Jest;
 | |
|   /**
 | |
|    * Creates a mock function. Optionally takes a mock implementation.
 | |
|    */
 | |
|   fn: ModuleMocker['fn'];
 | |
|   /**
 | |
|    * When mocking time, `Date.now()` will also be mocked. If you for some reason
 | |
|    * need access to the real current time, you can invoke this function.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   getRealSystemTime(): number;
 | |
|   /**
 | |
|    * Retrieves the seed value. It will be randomly generated for each test run
 | |
|    * or can be manually set via the `--seed` CLI argument.
 | |
|    */
 | |
|   getSeed(): number;
 | |
|   /**
 | |
|    * Returns the number of fake timers still left to run.
 | |
|    */
 | |
|   getTimerCount(): number;
 | |
|   /**
 | |
|    * Returns `true` if test environment has been torn down.
 | |
|    *
 | |
|    * @example
 | |
|    * ```js
 | |
|    * if (jest.isEnvironmentTornDown()) {
 | |
|    *   // The Jest environment has been torn down, so stop doing work
 | |
|    *   return;
 | |
|    * }
 | |
|    * ```
 | |
|    */
 | |
|   isEnvironmentTornDown(): boolean;
 | |
|   /**
 | |
|    * Determines if the given function is a mocked function.
 | |
|    */
 | |
|   isMockFunction: ModuleMocker['isMockFunction'];
 | |
|   /**
 | |
|    * `jest.isolateModules()` goes a step further than `jest.resetModules()` and
 | |
|    * creates a sandbox registry for the modules that are loaded inside the callback
 | |
|    * function. This is useful to isolate specific modules for every test so that
 | |
|    * local module state doesn't conflict between tests.
 | |
|    */
 | |
|   isolateModules(fn: () => void): Jest;
 | |
|   /**
 | |
|    * `jest.isolateModulesAsync()` is the equivalent of `jest.isolateModules()`, but for
 | |
|    * async functions to be wrapped. The caller is expected to `await` the completion of
 | |
|    * `isolateModulesAsync`.
 | |
|    */
 | |
|   isolateModulesAsync(fn: () => Promise<void>): Promise<void>;
 | |
|   /**
 | |
|    * Mocks a module with an auto-mocked version when it is being required.
 | |
|    */
 | |
|   mock<T = unknown>(moduleName: string, moduleFactory?: () => T, options?: {
 | |
|     virtual?: boolean;
 | |
|   }): Jest;
 | |
|   /**
 | |
|    * Mocks a module with the provided module factory when it is being imported.
 | |
|    */
 | |
|   unstable_mockModule<T = unknown>(moduleName: string, moduleFactory: () => T | Promise<T>, options?: {
 | |
|     virtual?: boolean;
 | |
|   }): Jest;
 | |
|   /**
 | |
|    * Wraps types of the `source` object and its deep members with type definitions
 | |
|    * of Jest mock function. Pass `{shallow: true}` option to disable the deeply
 | |
|    * mocked behavior.
 | |
|    */
 | |
|   mocked: ModuleMocker['mocked'];
 | |
|   /**
 | |
|    * Returns the current time in ms of the fake timer clock.
 | |
|    */
 | |
|   now(): number;
 | |
|   /**
 | |
|    * Registers a callback function that is invoked whenever a mock is generated for a module.
 | |
|    * This callback is passed the module path and the newly created mock object, and must return
 | |
|    * the (potentially modified) mock object.
 | |
|    *
 | |
|    * If multiple callbacks are registered, they will be called in the order they were added.
 | |
|    * Each callback receives the result of the previous callback as the `moduleMock` parameter,
 | |
|    * making it possible to apply sequential transformations.
 | |
|    */
 | |
|   onGenerateMock<T>(cb: (modulePath: string, moduleMock: T) => T): Jest;
 | |
|   /**
 | |
|    * Replaces property on an object with another value.
 | |
|    *
 | |
|    * @remarks
 | |
|    * For mocking functions or 'get' or 'set' accessors, use `jest.spyOn()` instead.
 | |
|    */
 | |
|   replaceProperty: ModuleMocker['replaceProperty'];
 | |
|   /**
 | |
|    * Returns the actual module instead of a mock, bypassing all checks on
 | |
|    * whether the module should receive a mock implementation or not.
 | |
|    *
 | |
|    * @example
 | |
|    * ```js
 | |
|    * jest.mock('../myModule', () => {
 | |
|    *   // Require the original module to not be mocked...
 | |
|    *   const originalModule = jest.requireActual('../myModule');
 | |
|    *
 | |
|    *   return {
 | |
|    *     __esModule: true, // Use it when dealing with esModules
 | |
|    *     ...originalModule,
 | |
|    *     getRandom: jest.fn().mockReturnValue(10),
 | |
|    *   };
 | |
|    * });
 | |
|    *
 | |
|    * const getRandom = require('../myModule').getRandom;
 | |
|    *
 | |
|    * getRandom(); // Always returns 10
 | |
|    * ```
 | |
|    */
 | |
|   requireActual<T = unknown>(moduleName: string): T;
 | |
|   /**
 | |
|    * Returns a mock module instead of the actual module, bypassing all checks
 | |
|    * on whether the module should be required normally or not.
 | |
|    */
 | |
|   requireMock<T = unknown>(moduleName: string): T;
 | |
|   /**
 | |
|    * Resets the state of all mocks. Equivalent to calling `.mockReset()` on
 | |
|    * every mocked function.
 | |
|    */
 | |
|   resetAllMocks(): Jest;
 | |
|   /**
 | |
|    * Resets the module registry - the cache of all required modules. This is
 | |
|    * useful to isolate modules where local state might conflict between tests.
 | |
|    */
 | |
|   resetModules(): Jest;
 | |
|   /**
 | |
|    * Restores all mocks and replaced properties back to their original value.
 | |
|    * Equivalent to calling `.mockRestore()` on every mocked function
 | |
|    * and `.restore()` on every replaced property.
 | |
|    *
 | |
|    * Beware that `jest.restoreAllMocks()` only works when the mock was created
 | |
|    * with `jest.spyOn()`; other mocks will require you to manually restore them.
 | |
|    */
 | |
|   restoreAllMocks(): Jest;
 | |
|   /**
 | |
|    * Runs failed tests n-times until they pass or until the max number of
 | |
|    * retries is exhausted.
 | |
|    *
 | |
|    * If `logErrorsBeforeRetry` is enabled, Jest will log the error(s) that caused
 | |
|    * the test to fail to the console, providing visibility on why a retry occurred.
 | |
|    * retries is exhausted.
 | |
|    *
 | |
|    * `waitBeforeRetry` is the number of milliseconds to wait before retrying
 | |
|    *
 | |
|    * `retryImmediately` is the flag to retry the failed test immediately after
 | |
|    *  failure
 | |
|    *
 | |
|    * @remarks
 | |
|    * Only available with `jest-circus` runner.
 | |
|    */
 | |
|   retryTimes(numRetries: number, options?: {
 | |
|     logErrorsBeforeRetry?: boolean;
 | |
|     retryImmediately?: boolean;
 | |
|     waitBeforeRetry?: number;
 | |
|   }): Jest;
 | |
|   /**
 | |
|    * Exhausts tasks queued by `setImmediate()`.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Only available when using legacy fake timers implementation.
 | |
|    */
 | |
|   runAllImmediates(): void;
 | |
|   /**
 | |
|    * Exhausts the micro-task queue (usually interfaced in node via
 | |
|    * `process.nextTick()`).
 | |
|    */
 | |
|   runAllTicks(): void;
 | |
|   /**
 | |
|    * Exhausts the macro-task queue (i.e., all tasks queued by `setTimeout()`
 | |
|    * and `setInterval()`).
 | |
|    */
 | |
|   runAllTimers(): void;
 | |
|   /**
 | |
|    * Exhausts the macro-task queue (i.e., all tasks queued by `setTimeout()`
 | |
|    * and `setInterval()`).
 | |
|    *
 | |
|    * @remarks
 | |
|    * If new timers are added while it is executing they will be run as well.
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   runAllTimersAsync(): Promise<void>;
 | |
|   /**
 | |
|    * Executes only the macro-tasks that are currently pending (i.e., only the
 | |
|    * tasks that have been queued by `setTimeout()` or `setInterval()` up to this
 | |
|    * point). If any of the currently pending macro-tasks schedule new
 | |
|    * macro-tasks, those new tasks will not be executed by this call.
 | |
|    */
 | |
|   runOnlyPendingTimers(): void;
 | |
|   /**
 | |
|    * Executes only the macro-tasks that are currently pending (i.e., only the
 | |
|    * tasks that have been queued by `setTimeout()` or `setInterval()` up to this
 | |
|    * point). If any of the currently pending macro-tasks schedule new
 | |
|    * macro-tasks, those new tasks will not be executed by this call.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   runOnlyPendingTimersAsync(): Promise<void>;
 | |
|   /**
 | |
|    * Explicitly supplies the mock object that the module system should return
 | |
|    * for the specified module.
 | |
|    *
 | |
|    * @remarks
 | |
|    * It is recommended to use `jest.mock()` instead. The `jest.mock()` API's second
 | |
|    * argument is a module factory instead of the expected exported module object.
 | |
|    */
 | |
|   setMock(moduleName: string, moduleExports: unknown): Jest;
 | |
|   /**
 | |
|    * Set the current system time used by fake timers. Simulates a user changing
 | |
|    * the system clock while your program is running. It affects the current time,
 | |
|    * but it does not in itself cause e.g. timers to fire; they will fire exactly
 | |
|    * as they would have done without the call to `jest.setSystemTime()`.
 | |
|    *
 | |
|    * @remarks
 | |
|    * Not available when using legacy fake timers implementation.
 | |
|    */
 | |
|   setSystemTime(now?: number | Date): void;
 | |
|   /**
 | |
|    * Set the default timeout interval for tests and before/after hooks in
 | |
|    * milliseconds.
 | |
|    *
 | |
|    * @remarks
 | |
|    * The default timeout interval is 5 seconds if this method is not called.
 | |
|    */
 | |
|   setTimeout(timeout: number): Jest;
 | |
|   /**
 | |
|    * Creates a mock function similar to `jest.fn()` but also tracks calls to
 | |
|    * `object[methodName]`.
 | |
|    *
 | |
|    * Optional third argument of `accessType` can be either 'get' or 'set', which
 | |
|    * proves to be useful when you want to spy on a getter or a setter, respectively.
 | |
|    *
 | |
|    * @remarks
 | |
|    * By default, `jest.spyOn()` also calls the spied method. This is different
 | |
|    * behavior from most other test libraries.
 | |
|    */
 | |
|   spyOn: ModuleMocker['spyOn'];
 | |
|   /**
 | |
|    * Indicates that the module system should never return a mocked version of
 | |
|    * the specified module from `require()` (e.g. that it should always return the
 | |
|    * real module).
 | |
|    */
 | |
|   unmock(moduleName: string): Jest;
 | |
|   /**
 | |
|    * Indicates that the module system should never return a mocked version of
 | |
|    * the specified module when it is being imported (e.g. that it should always
 | |
|    * return the real module).
 | |
|    */
 | |
|   unstable_unmockModule(moduleName: string): Jest;
 | |
|   /**
 | |
|    * Instructs Jest to use fake versions of the global date, performance,
 | |
|    * time and timer APIs. Fake timers implementation is backed by
 | |
|    * [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers).
 | |
|    *
 | |
|    * @remarks
 | |
|    * Calling `jest.useFakeTimers()` once again in the same test file would reinstall
 | |
|    * fake timers using the provided options.
 | |
|    */
 | |
|   useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig | Config.LegacyFakeTimersConfig): Jest;
 | |
|   /**
 | |
|    * Instructs Jest to restore the original implementations of the global date,
 | |
|    * performance, time and timer APIs.
 | |
|    */
 | |
|   useRealTimers(): Jest;
 | |
| }
 | |
| //#endregion
 | |
| export { EnvironmentContext, Jest, JestEnvironment, JestEnvironmentConfig, JestImportMeta, Module, ModuleWrapper }; |