import { Database } from './client/database.js';
import { FMServerConnection } from './client/filemaker-odata.js';
import { Logger } from './logger.js';
export interface MockRoute {
    /** URL pattern to match against. String matches with `includes()`, RegExp tests the full URL. */
    urlPattern: string | RegExp;
    /** HTTP method to match (case-insensitive). If omitted, matches any method. */
    method?: string;
    /** Response data. Arrays are wrapped in OData `{ value: [...] }` format. Objects are sent as-is. */
    response: unknown;
    /** HTTP status code (default: 200) */
    status?: number;
    /** Response headers */
    headers?: Record<string, string>;
    /** If set, the fetch handler rejects with this error (simulates network failure). */
    throwError?: Error;
}
export interface RequestSpy {
    /** All recorded requests */
    readonly calls: ReadonlyArray<{
        url: string;
        method: string;
        body?: string;
        headers?: Record<string, string>;
    }>;
    /** Clear recorded calls */
    clear(): void;
    /** Get calls matching a URL pattern */
    forUrl(pattern: string | RegExp): ReadonlyArray<{
        url: string;
        method: string;
        body?: string;
    }>;
}
/**
 * A mock FMServerConnection for testing.
 *
 * Wraps a real FMServerConnection with a router-style fetch handler,
 * so the full HTTP parsing pipeline (error classification, OData handling, etc.)
 * is exercised in tests.
 *
 * Routes can be added at construction time or dynamically via `.addRoute()`.
 */
export declare class MockFMServerConnection {
    private readonly routes;
    private readonly connection;
    private readonly _spy?;
    constructor(config?: {
        routes?: MockRoute[];
        baseUrl?: string;
        enableSpy?: boolean;
        logger?: Logger;
    });
    /**
     * Add a route to the mock. Routes added after construction are picked up
     * automatically by subsequent requests. Routes are matched in order,
     * and the first matching route wins.
     */
    addRoute(route: MockRoute): this;
    /**
     * Set multiple routes, replacing any existing routes.
     */
    setRoutes(routes: MockRoute[]): this;
    /**
     * Get the request spy (only available if `enableSpy: true` was passed to constructor).
     */
    get spy(): RequestSpy | undefined;
    /**
     * Create a Database instance, same API as FMServerConnection.database().
     */
    database<IncludeSpecialColumns extends boolean = false>(name: string, config?: {
        normalizeDatabaseName?: boolean;
        useEntityIds?: boolean;
        includeSpecialColumns?: IncludeSpecialColumns;
    }): Database<IncludeSpecialColumns>;
    /**
     * Get the underlying FMServerConnection (for cases that need the real type).
     */
    get asConnection(): FMServerConnection;
}
