@rxx/http
Version:
Http IO module for rxx.
396 lines • 36.6 kB
JavaScript
;
/**
* The MIT License (MIT)
* Copyright (c) Taketoshi Aono
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* @fileoverview
* @author Taketoshi Aono
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var testing_1 = require("@rxx/testing");
var http_handler_1 = require("../http-handler");
var types_1 = require("../types");
var chai_1 = require("chai");
var rxjs_1 = require("rxjs");
describe('HttpHandler', function () {
var initFormResponse;
var initPostResponse;
var initPostErrorResponse;
var initGetResponse;
var initGetErrorResponse;
var STATUS = { OK: 200, BAD_REQUEST: 400 };
var parseRequest = function (req) {
var ret = {};
req.split('&').forEach(function (v) {
var splited = v.split('=');
var v1 = splited[0];
var v2 = splited[1];
ret[v1] = v2 === 'false' ? false : v2 === 'true' ? true : v2;
});
return ret;
};
var server = {
respond: function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var ret;
var _this = this;
return tslib_1.__generator(this, function (_a) {
if (queue.length === 0) {
return [2 /*return*/, new Promise(function (resolve) {
setTimeout(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, server.respond()];
case 1:
_a.sent();
resolve();
return [2 /*return*/];
}
});
}); }, 10);
})];
}
ret = queue.slice();
queue.length = 0;
return [2 /*return*/, new Promise(function (resolve) {
setTimeout(function () {
ret.forEach(function (_a) {
var resolve = _a.resolve, res = _a.res;
return resolve(res);
});
resolve();
}, 500);
})];
});
});
},
};
var queue = [];
beforeEach(function () {
initPostResponse = function (proceed) {
return new http_handler_1.HttpHandler({
response: function (methodInvocation) {
if (proceed) {
return methodInvocation.proceed();
}
},
request: function (methodInvocation) {
var _a = methodInvocation.getArguments()[0], url = _a.url, data = _a.data;
return new Promise(function (resolve) {
var res = new Response(JSON.stringify(data), {
status: STATUS.OK,
headers: {
'Content-type': 'application/json',
},
});
queue.push({ resolve: resolve, res: res });
});
},
});
};
initPostErrorResponse = function (proceed) {
return new http_handler_1.HttpHandler({
response: function (methodInvocation) {
if (proceed) {
return methodInvocation.proceed();
}
},
request: function (methodInvocation) {
var _a = methodInvocation.getArguments()[0], url = _a.url, data = _a.data;
return new Promise(function (_, reject) {
return queue.push({
resolve: reject,
res: new Response(JSON.stringify(data), {
status: STATUS.BAD_REQUEST,
headers: {
'Content-type': 'application/json',
},
}),
});
});
},
});
};
initFormResponse = function (proceed) {
return new http_handler_1.HttpHandler({
response: function (methodInvocation) {
if (proceed) {
return methodInvocation.proceed();
}
},
request: function (methodInvocation) {
var _a = methodInvocation.getArguments()[0], url = _a.url, data = _a.data;
return new Promise(function (resolve) {
return queue.push({
resolve: resolve,
res: new Response(JSON.stringify(data), {
status: STATUS.OK,
headers: {
'Content-type': 'application/json',
},
}),
});
});
},
});
};
initGetResponse = function (proceed, params) {
return new http_handler_1.HttpHandler({
response: function (methodInvocation) {
if (proceed) {
return methodInvocation.proceed();
}
},
request: function (methodInvocation) {
var _a = methodInvocation.getArguments()[0], url = _a.url, data = _a.data;
return new Promise(function (resolve) {
return queue.push({
resolve: resolve,
res: new Response('{"success": true}', {
status: STATUS.OK,
headers: {
'Content-type': 'application/json',
},
}),
});
});
},
});
};
initGetErrorResponse = function (proceed) {
return new http_handler_1.HttpHandler({
response: function (methodInvocation) {
if (proceed) {
return methodInvocation.proceed();
}
},
request: function (methodInvocation) {
var _a = methodInvocation.getArguments()[0], url = _a.url, data = _a.data;
return new Promise(function (_, reject) {
return queue.push({
resolve: reject,
res: new Response('{"success": false}', {
status: STATUS.BAD_REQUEST,
headers: {
'Content-type': 'application/json',
},
}),
});
});
},
});
};
});
afterEach(function () {
queue.length = 0;
});
var waitRequest = function (opt, inst, key) {
var _a;
var subject = new rxjs_1.Subject();
inst.subscribe({ http: (_a = {}, _a[key] = subject, _a) });
subject.next(opt);
};
describe('HttpHandler#get()', function () {
it('Send get request(200)', function (done) {
var handler = initGetResponse(true);
handler.response.for('test').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(true);
chai_1.expect(data.status).to.be.eq(STATUS.OK);
chai_1.expect(data.response).to.be.deep.equal({ success: true });
}, done));
waitRequest({ url: '/test/ok', responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
});
it('Send get request(200, with parameter)', function (done) {
var handler = initGetResponse(true, 'test=1');
handler.response.for('test').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(true);
chai_1.expect(data.status).to.be.eq(STATUS.OK);
chai_1.expect(data.response).to.be.deep.equal({ success: true });
}, done));
waitRequest({ url: '/test/ok', data: { test: 1 }, responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
});
it('Send get request (400)', function (done) {
var handler = initGetErrorResponse(true);
handler.response.for('test').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(false);
chai_1.expect(data.status).to.be.eq(STATUS.BAD_REQUEST);
chai_1.expect(data.error).to.be.deep.equal({ success: false });
}, done));
waitRequest({ url: '/test/ng', responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
});
it('Apply interceptor (200)', function (done) {
var handler = initGetResponse(true);
handler.response.for('test').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(true);
chai_1.expect(data.status).to.be.eq(STATUS.OK);
chai_1.expect(data.response).to.be.deep.equal({ success: true });
}, done));
waitRequest({ url: '/test/ok', responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
});
it('Apply interceptor (400)', function (done) {
var handler = initGetErrorResponse(true);
handler.response.for('test').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(false);
chai_1.expect(data.status).to.be.eq(STATUS.BAD_REQUEST);
chai_1.expect(data.error).to.be.deep.equal({ success: false });
}, done));
waitRequest({ url: '/test/ng', responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
});
it('Apply interceptor and stop process (200)', function () {
var called = false;
var handler = initGetResponse(false);
handler.response.for('test').subscribe(function (res) {
called = true;
});
waitRequest({ url: '/test/ok', responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
chai_1.expect(called).to.be.eq(false);
});
it('Apply interceptor and stop process (400)', function () {
var called = false;
var handler = initGetErrorResponse(false);
handler.response.for('test').subscribe(function (res) {
called = true;
});
waitRequest({ url: '/test/ng', responseType: types_1.ResponseType.JSON }, handler, 'test');
server.respond();
chai_1.expect(called).to.be.eq(false);
});
});
describe('HttpHandler#post()', function () {
it('Send post request.(200)', function (done) {
var handler = initPostResponse(true);
handler.response.for('test-post').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(true);
chai_1.expect(data.status).to.be.eq(STATUS.OK);
chai_1.expect(data.response).to.be.deep.equal({ success: true });
}, done));
waitRequest({
url: '/test/ok',
data: { success: true },
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
});
it('Send post request.(200, form)', function (done) {
var handler = initFormResponse(true);
handler.response.for('test-post').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(true);
chai_1.expect(data.status).to.be.eq(STATUS.OK);
chai_1.expect(data.response).to.be.deep.equal({ success: true });
}, done));
waitRequest({
url: '/test/ok',
data: { success: true },
form: true,
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
});
it('Send post request.(400)', function (done) {
var handler = initPostErrorResponse(true);
handler.response.for('test-post').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(false);
chai_1.expect(data.status).to.be.eq(STATUS.BAD_REQUEST);
chai_1.expect(data.error).to.be.deep.equal({ success: false });
}, done));
waitRequest({
url: '/test/ng',
data: { success: false },
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
});
it('Apply interceptor.(200)', function (done) {
var handler = initPostResponse(true);
handler.response.for('test-post').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(true);
chai_1.expect(data.status).to.be.eq(STATUS.OK);
chai_1.expect(data.response).to.be.deep.equal({ success: true });
}, done));
waitRequest({
url: '/test/ok',
data: { success: true },
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
});
it('Apply interceptor.(400)', function (done) {
var handler = initPostErrorResponse(true);
handler.response.for('test-post').subscribe(testing_1.graceful(function (_a) {
var data = _a.data;
chai_1.expect(data.ok).to.be.eq(false);
chai_1.expect(data.status).to.be.eq(STATUS.BAD_REQUEST);
chai_1.expect(data.error).to.be.deep.equal({ success: false });
}, done));
waitRequest({
url: '/test/ng',
data: { success: false },
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
});
it('Apply interceptor and stop process.(200)', function () {
var called = false;
var handler = initPostResponse(false);
handler.response.for('test-post').subscribe(function (res) {
called = true;
});
waitRequest({
url: '/test/ok',
data: { success: true },
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
chai_1.expect(called).to.be.eq(false);
});
it('Apply interceptor and stop process.(400)', function () {
var called = false;
var handler = initPostErrorResponse(false);
handler.response.for('test-post').subscribe(function (res) {
called = true;
});
waitRequest({
url: '/test/ng',
data: { success: true },
method: types_1.HttpMethod.POST,
responseType: types_1.ResponseType.JSON,
}, handler, 'test-post');
server.respond();
chai_1.expect(called).to.be.eq(false);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvX190ZXN0c19fL2h0dHAtaGFuZGxlci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7OztBQUVILHdDQUF3QztBQUV4QyxnREFBOEM7QUFDOUMsa0NBQThFO0FBRTlFLDZCQUE4QjtBQUM5Qiw2QkFBK0I7QUFFL0IsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUN0QixJQUFJLGdCQUFtRCxDQUFDO0lBQ3hELElBQUksZ0JBQW1ELENBQUM7SUFDeEQsSUFBSSxxQkFBd0QsQ0FBQztJQUM3RCxJQUFJLGVBQW1FLENBQUM7SUFDeEUsSUFBSSxvQkFBdUQsQ0FBQztJQUU1RCxJQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRTdDLElBQU0sWUFBWSxHQUFHLFVBQUMsR0FBVztRQUMvQixJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7WUFDdEIsSUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFD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