0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-12-16 21:56:25 -05:00
verdaccio/test/lib/request.ts

128 lines
3 KiB
TypeScript
Raw Normal View History

import request from '@cypress/request';
import assert from 'assert';
import _ from 'lodash';
import { IRequestPromise } from '../types';
2017-06-30 16:11:12 -05:00
const requestData = Symbol('smart_request_data');
export class PromiseAssert extends Promise<any> implements IRequestPromise {
public constructor(options: any) {
2017-06-30 16:11:12 -05:00
super(options);
}
public status(expected: number) {
2017-06-30 16:11:12 -05:00
const selfData = this[requestData];
return injectResponse(
this,
this.then(function (body) {
try {
assert.equal(selfData.response.statusCode, expected);
} catch (err) {
selfData.error.message = err.message;
throw selfData.error;
}
return body;
})
);
2017-06-30 16:11:12 -05:00
}
public body_ok(expected: any) {
const selfData = this[requestData];
2017-06-30 16:11:12 -05:00
return injectResponse(
this,
this.then(function (body) {
try {
if (_.isRegExp(expected)) {
assert(body.ok.match(expected), "'" + body.ok + "' doesn't match " + expected);
} else {
assert.equal(body.ok, expected);
}
assert.equal(body.error, null);
} catch (err) {
selfData.error.message = err.message;
throw selfData.error;
2017-06-30 16:11:12 -05:00
}
return body;
})
);
2017-06-30 16:11:12 -05:00
}
public body_error(expected: any) {
const selfData = this[requestData];
2017-06-30 16:11:12 -05:00
return injectResponse(
this,
this.then(function (body) {
try {
if (_.isRegExp(expected)) {
assert(body.error.match(expected), body.error + " doesn't match " + expected);
} else {
assert.equal(body.error, expected);
}
assert.equal(body.ok, null);
} catch (err) {
selfData.error.message = err.message;
throw selfData.error;
2017-06-30 16:11:12 -05:00
}
return body;
})
);
2017-06-30 16:11:12 -05:00
}
public request(callback: any) {
2017-06-30 16:11:12 -05:00
callback(this[requestData].request);
return this;
}
public response(cb: any) {
2017-06-30 16:11:12 -05:00
const selfData = this[requestData];
return injectResponse(
this,
this.then(function (body) {
cb(selfData.response);
return body;
})
);
2017-06-30 16:11:12 -05:00
}
public send(data: any) {
2017-06-30 16:11:12 -05:00
this[requestData].request.end(data);
return this;
}
}
function injectResponse(smartObject: any, promise: Promise<any>): Promise<any> {
2017-06-30 16:11:12 -05:00
promise[requestData] = smartObject[requestData];
2017-04-19 14:15:28 -05:00
return promise;
}
function smartRequest(options: any): Promise<any> {
const smartObject: any = {};
2017-06-30 16:11:12 -05:00
smartObject[requestData] = {};
smartObject[requestData].error = Error();
Error.captureStackTrace(smartObject[requestData].error, smartRequest);
const promiseResult: Promise<any> = new PromiseAssert(function (resolve, reject) {
// store request reference on symbol
smartObject[requestData].request = request(options, function (err, res, body) {
2017-06-30 16:11:12 -05:00
if (err) {
return reject(err);
}
2017-06-30 16:11:12 -05:00
// store the response on symbol
smartObject[requestData].response = res;
resolve(body);
});
});
return injectResponse(smartObject, promiseResult);
2017-06-30 16:11:12 -05:00
}
export default smartRequest;