interface ErrorInjection { failAfter(n: number, error?: Error): void; failOn(pattern: RegExp, error?: Error): void; withLatency(minMs: number, maxMs?: number): void; clearInjections(): void; } interface InjectionState { failAfterCount: number | null; failAfterError: Error; operationCount: number; failPatterns: Array<{ pattern: RegExp; error: Error; }>; latency: { min: number; max: number; } | null; } declare function createErrorInjector(): ErrorInjection & { _check(key?: string): Promise; _state: InjectionState; }; interface MockOperation { type: "read" | "write" | "delete" | "list"; key?: string; timestamp: number; } interface MockOperations { operations: MockOperation[]; reads(): MockOperation[]; writes(): MockOperation[]; deletes(): MockOperation[]; reset(): void; } declare function createOperationTracker(): MockOperations & { _record: (type: MockOperation["type"], key?: string) => void; }; interface MockKVEntry { value: string; expiration?: number; metadata?: unknown; } /** * In-memory KVNamespace mock for unit testing. * Map-based storage with expiration support. */ declare function createMockKV(initialData?: Record): KVNamespace & { _store: Map; } & MockOperations & ErrorInjection; declare function createMockD1(initialTables?: Record[]>): D1Database & MockOperations & ErrorInjection; declare function createFailingD1(error: Error | string): D1Database; interface StoredObject { body: ArrayBuffer; customMetadata: Record; httpMetadata: Record; uploaded: Date; size: number; key: string; etag: string; version: string; } /** * In-memory R2Bucket mock for unit testing. */ declare function createMockR2(): R2Bucket & { _store: Map; } & MockOperations & ErrorInjection; interface MockMessage { body: unknown; contentType?: string; } /** * In-memory Queue mock for unit testing. */ declare function createMockQueue(): Queue & { _messages: MockMessage[]; } & MockOperations & ErrorInjection; /** * In-memory DurableObjectStorage mock for unit testing. */ declare function createMockDO(): DurableObjectStorage & { _store: Map; _alarm: number | null; } & MockOperations & ErrorInjection; interface TestEnvConfig { kv?: string[]; d1?: string[]; r2?: string[]; queue?: string[]; do?: string[]; vars?: Record; } /** Maps binding names from each config category to their mock types. */ type EnvBindings = { [K in T["kv"] extends readonly string[] ? T["kv"][number] : never] : KVNamespace } & { [K in T["d1"] extends readonly string[] ? T["d1"][number] : never] : D1Database } & { [K in T["r2"] extends readonly string[] ? T["r2"][number] : never] : R2Bucket } & { [K in T["queue"] extends readonly string[] ? T["queue"][number] : never] : Queue } & { [K in T["do"] extends readonly string[] ? T["do"][number] : never] : DurableObjectStorage } & { [K in keyof T["vars"] & string] : T["vars"] extends Record ? V : never }; /** * One-call environment factory for Cloudflare Workers tests. * Creates named mocks for each binding type and returns a typed env object. * * @param config - Binding names for each category (kv, d1, r2, queue, do) plus plain vars. * @returns An object mapping each binding name to its mock instance. * * @example * ```ts * const env = createTestEnv({ * kv: ['CACHE'] as const, * d1: ['DB'] as const, * vars: { API_URL: 'http://localhost' }, * }) * // env.CACHE is KVNamespace, env.DB is D1Database, env.API_URL is string * ``` */ declare function createTestEnv(config: T): EnvBindings; interface CreateRequestOptions { method?: string; body?: unknown; headers?: Record; } /** * Request factory for Cloudflare Workers tests. * Defaults to GET, http://localhost as base. * Auto-serializes object bodies to JSON with Content-Type header. */ declare function createRequest(path: string, options?: CreateRequestOptions): Request; /** * Mock ExecutionContext for Cloudflare Workers tests. * waitUntil collects promises in _promises for test assertions. * passThroughOnException is a no-op. */ declare function createExecutionContext(): ExecutionContext & { _promises: Promise[]; }; /** * In-memory mocks for Cloudflare Email bindings: `SendEmail` (outbound) * and `ForwardableEmailMessage` (inbound). Mirrors the `createMockKV` / * `createMockQueue` shape. */ interface MockSendEmail { _sent: { from: string; to: string; raw: string; }[]; send(message: { from: string; to: string; raw: ReadableStream | string; }): Promise; } declare function createMockSendEmail(): MockSendEmail; interface MockForwardableEmail { readonly from: string; readonly to: string; readonly headers: Headers; readonly raw: ReadableStream; readonly rawSize: number; _rejected: boolean; _rejectReason?: string; _forwarded: boolean; _forwardedTo?: string; _replied: boolean; setReject(reason: string): void; forward(rcptTo: string, headers?: Headers): Promise; reply(message: { from: string; to: string; raw: ReadableStream | string; }): Promise; } interface MockEmailOptions { from?: string; to?: string; subject?: string; text?: string; headers?: Record; } declare function createMockForwardableEmail(options?: MockEmailOptions): MockForwardableEmail; interface BindingInfo { type: "kv" | "d1" | "r2" | "queue" | "do" | "var"; count?: number; value?: unknown; } interface EnvSnapshot { bindings: Record; summary: { kv: number; d1: number; r2: number; queue: number; do: number; var: number; }; } /** * Inspects each binding in the env object, detects its type * (KV, D1, R2, Queue, DO) by checking for internal properties, * and returns a snapshot with counts. */ declare function snapshotEnv(env: Record): EnvSnapshot; export { snapshotEnv, createTestEnv, createRequest, createOperationTracker, createMockSendEmail, createMockR2, createMockQueue, createMockKV, createMockForwardableEmail, createMockDO, createMockD1, createFailingD1, createExecutionContext, createErrorInjector, MockSendEmail, MockOperations, MockOperation, MockForwardableEmail, MockEmailOptions, InjectionState, ErrorInjection, EnvSnapshot };