@typed/http
Version:
HTTP requests for node and browsers
62 lines • 1.99 kB
JavaScript
import { Disposable } from '@typed/disposable';
import { fromLeft, fromRight, isLeft, Left, Right } from '@typed/either';
import { isPromiseLike } from '@typed/logic';
/**
* Create a test-friendly http environment
* @param testHttp :: (url -> HttpOptions -> Either Error HttpResponse)
* @param timer :: Timer
*/
export function createTestHttpEnv(testHttp) {
const responses = [];
function http(url, options, callbacks) {
const { success, failure } = callbacks;
function getResponse() {
const disposable = Disposable.lazy();
function onResponse(response) {
responses.push(response);
if (isLeft(response)) {
return disposable.addDisposable(failure(fromLeft(response)));
}
disposable.addDisposable(success(fromRight(response)));
}
const response = testHttp(url, options);
if (isPromiseLike(response)) {
response.then(onResponse);
}
else {
onResponse(response);
}
return disposable;
}
return getResponse();
}
return {
http,
getResponses: () => responses.slice(),
};
}
export function createSuccessfulResponse(options = {}) {
return Right.of(createHttpResponse(options));
}
export function createFailedResponse(error) {
return Left.of(error);
}
export function createHttpResponse(options = {}) {
const response = {
status: 200,
statusText: 'OK',
responseText: '',
headers: {},
...options,
};
return response;
}
export function createJsonResponse(jsonReadyValue, options = {}) {
const responseText = JSON.stringify(jsonReadyValue);
return createHttpResponse({
...options,
headers: { 'Content-Type': 'application/json', ...options.headers },
responseText,
});
}
//# sourceMappingURL=createTestHttpEnv.js.map