import { when } from 'jest-when'; import { NetworkResponse } from '../src/types'; interface XhrMock { readyState: number status: number responseText: string open: jest.Mock onreadystatechange: jest.Mock send: jest.Mock setRequestHeader: jest.Mock } interface ProcessRequestResponse { result: NetworkResponse mock: XhrMock } export default class MockBuilder { mock: XhrMock constructor() { this.mock = { readyState: 4, responseText: '', status: 0, open: jest.fn(), onreadystatechange: jest.fn(), send: jest.fn(), setRequestHeader: jest.fn(), }; } getXMLHttpRequest(): jest.Mock { const constructr = jest.fn(); when(constructr).calledWith().mockReturnValue(this.mock); return constructr; } status(s: number): MockBuilder { this.mock.status = s; return this; } response(r: unknown): MockBuilder { this.mock.responseText = JSON.stringify(r); return this; } readyStateChange(state = 4): MockBuilder { this.mock.readyState = state; this.mock.onreadystatechange(); return this; } async processRequest(promise: Promise): Promise { this.readyStateChange(); const result = await promise as NetworkResponse; const { mock } = this; return { result, mock }; } }