UNPKG

@rxx/http

Version:
396 lines 36.6 kB
"use strict"; /** * 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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