import { QueryClient } from '@tanstack/react-query'; import { ReactElement, ReactNode } from 'react'; import { FeatureAccess, FeatureConfig, FeatureRegistryEntry } from '../types'; import { FeatureDIContainer } from '../featureDI'; import { Mock } from 'vitest'; /** * Simple render result type */ export interface RenderResult { element: ReactElement; queryClient: QueryClient; diContainer: FeatureDIContainer; } /** * Create a test query client with sensible defaults */ export declare function createTestQueryClient(options?: { defaultOptions?: { queries?: { retry?: number | boolean; gcTime?: number; staleTime?: number; }; mutations?: { retry?: number | boolean; }; }; }): QueryClient; /** * Props for FeatureTestWrapper */ export interface FeatureTestWrapperProps { children: ReactNode; queryClient?: QueryClient; diContainer?: FeatureDIContainer; initialRouterEntries?: string[]; } /** * Comprehensive test wrapper for feature testing */ export declare function FeatureTestWrapper({ children, queryClient, diContainer, }: FeatureTestWrapperProps): ReactElement; /** * Create a custom render function for a feature */ export declare function createFeatureRenderer(defaultOptions?: Partial): (ui: ReactElement, options?: Partial) => RenderResult; /** * Options for creating a mock feature */ export interface MockFeatureOptions { id?: string; name?: string; description?: string; category?: string; order?: number; access?: Partial; config?: Partial; } /** * Create a mock feature for testing */ export declare function createMockFeature(overrides?: MockFeatureOptions): FeatureRegistryEntry; /** * Create multiple mock features */ export declare function createMockFeatures(count: number, baseOptions?: MockFeatureOptions): FeatureRegistryEntry[]; /** * Base entity interface for mocking */ export interface MockEntityBase { id: string; createdAt: string; updatedAt: string; } /** * Create a mock entity with common fields */ export declare function createMockEntity>(overrides?: T & { id?: string; }): MockEntityBase & T; /** * Create multiple mock entities */ export declare function createMockEntities>(count: number, factory: (index: number) => T): Array; /** * Mock API response wrapper */ export interface MockApiResponse { data: T; status: number; headers?: Record; } /** * Create a mock API response */ export declare function createMockApiResponse(data: T, options?: { status?: number; headers?: Record; }): MockApiResponse; /** * Mock service method type */ type MockFn = Mock | ((...args: unknown[]) => unknown); /** * Create a mock service with typed methods */ export declare function createMockService unknown>>(implementations: Partial<{ [K in keyof T]: MockFn; }>): { [K in keyof T]: Mock; }; /** * Create mock query data for testing */ export declare function createMockQueryData(data: T, options?: { isLoading?: boolean; isFetching?: boolean; error?: Error | null; isError?: boolean; isSuccess?: boolean; }): { data: T | undefined; isLoading: boolean; isFetching: boolean; error: Error | null; isError: boolean; isSuccess: boolean; refetch: Mock; }; /** * Create mock mutation result */ export declare function createMockMutationResult(options?: { isLoading?: boolean; isSuccess?: boolean; isError?: boolean; error?: Error | null; data?: TData; }): { mutate: Mock; mutateAsync: Mock; isLoading: boolean; isPending: boolean; isSuccess: boolean; isError: boolean; error: Error | null; data: TData | undefined; reset: Mock; }; /** * Test fixture for feature integration tests */ export interface FeatureTestFixture { featureId: string; initialData: TData; mockApi: Record; queryClient: QueryClient; diContainer: FeatureDIContainer; } /** * Create a complete test fixture for a feature */ export declare function createFeatureTestFixture(featureId: string, options: { initialData: TData; apiMethods?: string[]; }): FeatureTestFixture; /** * Seed query cache with initial data */ export declare function seedQueryCache(queryClient: QueryClient, queryKey: readonly unknown[], data: T): void; /** * Assert query cache contains expected data */ export declare function assertQueryCache(queryClient: QueryClient, queryKey: readonly unknown[], expectedData: T): void; /** * Clear specific query from cache */ export declare function clearQueryCache(queryClient: QueryClient, queryKey: readonly unknown[]): void; /** * Wait for queries to settle */ export declare function waitForQueries(queryClient: QueryClient): Promise; /** * Create a serializable snapshot of feature state */ export declare function createFeatureSnapshot(queryClient: QueryClient, queryKeys: readonly (readonly unknown[])[]): Record; /** * Compare two feature snapshots */ export declare function compareSnapshots(snapshot1: Record, snapshot2: Record): { added: string[]; removed: string[]; changed: string[]; }; /** * Wait for a condition to be true */ export declare function waitFor(condition: () => boolean | Promise, options?: { timeout?: number; interval?: number; }): Promise; /** * Delay execution for testing async behavior */ export declare function delay(ms: number): Promise; /** * Generate a random ID */ export declare function generateId(prefix?: string): string; /** * Generate a random date within a range */ export declare function generateDate(options?: { min?: Date; max?: Date; }): string; /** * Generate test data with faker-like utilities */ export declare const testData: { id: typeof generateId; date: typeof generateDate; string: (length?: number) => string; number: (min?: number, max?: number) => number; boolean: () => boolean; email: () => string; name: () => string; pick: (array: T[]) => T; array: (length: number, factory: (index: number) => T) => T[]; }; export {};