import { DocumentNode, ExecutionResult } from "graphql";
import { Disposable } from "graphql-ws";
import { ObjMap } from "graphql/jsutils/ObjMap";
import { Subscriber } from "zen-observable-ts";
import { Variables } from "./types";
export declare type WebSocketProtocol = "graphql-transport-ws" | "graphql-ws";
/**
 * The protocol implemented by the library `subscriptions-transport-ws` and
 * that is now considered legacy.
 */
export declare const LEGACY_WEBSOCKET_PROTOCOL = "graphql-ws";
export declare class SuperTestExecutionNextResult<TData> implements PromiseLike<ExecutionResult<TData>> {
    private pop;
    private _asserts;
    constructor(pop: Promise<ExecutionResult<TData>>);
    then<TResult1 = ExecutionResult<TData, ObjMap<unknown>>, TResult2 = never>(onfulfilled?: ((value: ExecutionResult<TData, ObjMap<unknown>>) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
    /**
     * Assert that there is no errors (`.errors` field) in response returned from the GraphQL API.
     */
    expectNoErrors(): this;
    private assert;
}
export declare class SuperTestExecutionStreamingResult<TData> {
    private client;
    private queue;
    constructor(client: Disposable, subscriber: Subscriber<ExecutionResult<TData>>);
    /**
     * Get the next result that the operation is emitting.
     */
    next(): SuperTestExecutionNextResult<TData>;
    /**
     * Flush the pending results from the queue.
     */
    flush(): ExecutionResult<TData>[];
    /**
     * Assert that no more results are pending.
     */
    expectNoPending(): this;
    /**
     * Close the operation and the connection.
     */
    close(): Promise<void>;
}
export declare class SuperTestExecutionStreamingResultPool {
    private _subscriptions;
    endAll(): Promise<void>;
    add(sub: SuperTestExecutionStreamingResult<any>): void;
}
declare type ConnectionParams = {
    [paramName: string]: any;
};
export default class SuperTestWSGraphQL<TData, TVariables extends Variables> implements PromiseLike<SuperTestExecutionStreamingResult<TData>> {
    private _hostname;
    private _pool?;
    private _query?;
    private _operationName?;
    private _variables?;
    private _path;
    private _protocol;
    private _connectionParams?;
    constructor(_hostname: string, _pool?: SuperTestExecutionStreamingResultPool | undefined);
    /**
     *  Send a GraphQL Query Document to the GraphQL server for execution.
     * @param operation - the query to execute as string or `DocumentNode`
     * @param variables - the variables for this query
     */
    subscribe(operation: DocumentNode | string, variables?: TVariables): this;
    /**
     * Send a GraphQL Query Document to the GraphQL server for execution.
     * @param query - the query to execute as string or `DocumentNode`
     * @param variables - the variables for this query
     */
    query(query: DocumentNode | string, variables?: TVariables): this;
    /**
     * Send a GraphQL Query Document to the GraphQL server for execution.
     * @param mutation - the mutation to execute as string or `DocumentNode`
     * @param variables - the variables for this mutation
     */
    mutate(mutation: DocumentNode | string, variables?: TVariables): this;
    /**
     * Send a GraphQL Query Document to the GraphQL server for execution.
     * @param operation - the operation to execute as string or `DocumentNode`
     * @param variables - the variables for this operation
     */
    operation(operation: DocumentNode | string, variables?: TVariables): this;
    /**
     * Set variables.
     * @param - variables
     */
    variables(variables: TVariables): this;
    /**
     * Set the GraphQL endpoint path.
     *
     * @default "/graphql"
     */
    path(path: string): this;
    /**
     * Set the GraphQL WebSocket porotocol.
     * You can set the legacy protocol with the variable `LEGACY_WEBSOCKET_PROTOCOL`.
     */
    protocol(wsProtocol: WebSocketProtocol): this;
    /**
     * Set connection params.
     */
    connectionParams(params: ConnectionParams): this;
    then<TResult1 = SuperTestExecutionStreamingResult<TData>, TResult2 = never>(onfulfilled?: ((value: SuperTestExecutionStreamingResult<TData>) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
}
export {};
