UNPKG

@kalxjs/core

Version:

A modern JavaScript framework for building user interfaces with reactive state, composition API, and built-in performance optimizations

349 lines (319 loc) 7.28 kB
/** * Test Framework Presets * Jest and Vitest configuration presets * * @module @kalxjs/testing/test-presets */ /** * Jest preset for KALXJS */ export const jestPreset = { testEnvironment: 'jsdom', testMatch: [ '**/__tests__/**/*.(test|spec).[jt]s?(x)', '**/?(*.)+(test|spec).[jt]s?(x)', ], transform: { '^.+\\.klx$': '<rootDir>/node_modules/@kalxjs/jest-transformer', '^.+\\.[jt]sx?$': 'babel-jest', }, moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'klx', 'json'], moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1', '\\.(css|less|scss|sass)$': 'identity-obj-proxy', }, setupFilesAfterEnv: ['<rootDir>/jest.setup.js'], collectCoverageFrom: [ 'src/**/*.{js,jsx,ts,tsx,klx}', '!src/**/*.d.ts', '!src/**/*.spec.{js,jsx,ts,tsx}', '!src/**/*.test.{js,jsx,ts,tsx}', ], coverageThreshold: { global: { branches: 70, functions: 70, lines: 70, statements: 70, }, }, globals: { __DEV__: true, }, }; /** * Vitest preset for KALXJS */ export const vitestPreset = { test: { environment: 'jsdom', include: [ '**/__tests__/**/*.(test|spec).[jt]s?(x)', '**/?(*.)+(test|spec).[jt]s?(x)', ], globals: true, setupFiles: ['./vitest.setup.js'], coverage: { provider: 'c8', reporter: ['text', 'json', 'html'], include: ['src/**/*.{js,jsx,ts,tsx,klx}'], exclude: [ 'src/**/*.d.ts', 'src/**/*.spec.{js,jsx,ts,tsx}', 'src/**/*.test.{js,jsx,ts,tsx}', ], thresholds: { branches: 70, functions: 70, lines: 70, statements: 70, }, }, }, resolve: { alias: { '@': './src', }, }, }; /** * Create Jest setup file content */ export function createJestSetup() { return ` // Jest setup for KALXJS import '@testing-library/jest-dom'; import { enableAutoUnmount } from '@kalxjs/core/testing'; // Auto unmount components after each test enableAutoUnmount(afterEach); // Mock browser APIs global.IntersectionObserver = class IntersectionObserver { observe() {} unobserve() {} disconnect() {} }; global.ResizeObserver = class ResizeObserver { observe() {} unobserve() {} disconnect() {} }; // Mock matchMedia Object.defineProperty(window, 'matchMedia', { writable: true, value: jest.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), }); // Mock scrollTo window.scrollTo = jest.fn(); // Suppress console warnings in tests const originalWarn = console.warn; console.warn = (...args) => { // Filter out expected warnings const message = args[0]; if (typeof message === 'string' && message.includes('act()')) { return; } originalWarn(...args); }; `.trim(); } /** * Create Vitest setup file content */ export function createVitestSetup() { return ` // Vitest setup for KALXJS import { expect } from 'vitest'; import { enableAutoUnmount } from '@kalxjs/core/testing'; // Auto unmount components after each test enableAutoUnmount(afterEach); // Mock browser APIs global.IntersectionObserver = class IntersectionObserver { observe() {} unobserve() {} disconnect() {} }; global.ResizeObserver = class ResizeObserver { observe() {} unobserve() {} disconnect() {} }; // Mock matchMedia Object.defineProperty(window, 'matchMedia', { writable: true, value: vi.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, addListener: vi.fn(), removeListener: vi.fn(), addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })), }); // Mock scrollTo window.scrollTo = vi.fn(); `.trim(); } /** * Create test utilities helper file */ export function createTestUtils() { return ` /** * Test utilities for KALXJS applications */ import { mount, shallowMount, nextTick, flushPromises, } from '@kalxjs/core/testing'; import { createMockRouter, createMockStore, createMockAPI, createMockFn, } from '@kalxjs/core/testing/mocks'; import { click, type, clear, selectOptions, hover, keyboard, tab, } from '@kalxjs/core/testing/user-events'; import { waitFor, waitForElement, waitForElementToBeRemoved, waitForDOMUpdate, act, } from '@kalxjs/core/testing/async-utilities'; // Re-export everything export { // Component testing mount, shallowMount, nextTick, flushPromises, // Mocks createMockRouter, createMockStore, createMockAPI, createMockFn, // User events click, type, clear, selectOptions, hover, keyboard, tab, // Async utilities waitFor, waitForElement, waitForElementToBeRemoved, waitForDOMUpdate, act, }; /** * Create test wrapper with common utilities */ export function createTestWrapper(options = {}) { const { router = createMockRouter(), store = createMockStore(), api = createMockAPI(), } = options; return { router, store, api, mount: (component, mountOptions = {}) => { return mount(component, { ...mountOptions, global: { ...mountOptions.global, plugins: [ ...(mountOptions.global?.plugins || []), { install: (app) => { app.config.globalProperties.$router = router; app.config.globalProperties.$store = store; app.config.globalProperties.$api = api; }}, ], }, }); }, }; } /** * Create test component with common setup */ export function setupTest(component, options = {}) { const wrapper = createTestWrapper(options); const mounted = wrapper.mount(component, options.mountOptions); return { ...wrapper, wrapper: mounted, unmount: () => mounted.unmount(), }; } `.trim(); } /** * E2E testing configuration */ export const e2ePresets = { playwright: { use: { baseURL: 'http://localhost:3000', screenshot: 'only-on-failure', video: 'retain-on-failure', }, webServer: { command: 'npm run dev', port: 3000, reuseExistingServer: true, }, }, cypress: { baseUrl: 'http://localhost:3000', viewportWidth: 1280, viewportHeight: 720, video: false, screenshotOnRunFailure: true, defaultCommandTimeout: 10000, requestTimeout: 10000, responseTimeout: 10000, }, }; /** * Coverage configuration */ export const coverageConfig = { statements: 70, branches: 70, functions: 70, lines: 70, exclude: [ '**/*.test.{js,jsx,ts,tsx}', '**/*.spec.{js,jsx,ts,tsx}', '**/__tests__/**', '**/__mocks__/**', '**/node_modules/**', '**/dist/**', '**/coverage/**', ], };