UNPKG

rest-boubou

Version:

RESTful HTTP client library

189 lines (175 loc) 5.82 kB
/* * Copyright 2012-2015 the original author or authors * @license MIT, see LICENSE.txt for details * * @author Jeremy Grelle * @author Scott Andrews */ (function (buster, define) { 'use strict'; var assert, refute, fail, failOnThrow; assert = buster.assertions.assert; refute = buster.assertions.refute; fail = buster.assertions.fail; failOnThrow = buster.assertions.failOnThrow; define('rest/interceptor/timeout-test', function (require) { var timeout, rest, when; timeout = require('rest/interceptor/timeout'); rest = require('rest'); when = require('when'); function hangClient(/* request */) { return when.defer().promise; } function immediateClient(request) { return { request: request }; } function delayedClient(request) { return when({ request: request }).delay(50); } function cancelableClient(request) { /*jshint validthis:true */ var d = when.defer(); request.canceled = false; request.cancel = this.spy(function () { request.canceled = true; d.resolver.reject({ request: request }); }); return d.promise; } buster.testCase('rest/interceptor/timeout', { 'should resolve if client responds immediately': function () { var client, request; client = timeout(immediateClient, { timeout: 20 }); request = {}; return client(request).then(function (response) { assert.same(request, response.request); refute(response.error); return when().delay(40).then(function () { // delay to make sure timeout has fired, but not rejected the response refute(request.canceled); }); }).otherwise(fail); }, 'should resolve if client responds before timeout': function () { var client, request; client = timeout(delayedClient, { timeout: 100 }); request = {}; return client(request).then(function (response) { assert.same(request, response.request); refute(response.error); refute(request.canceled); }).otherwise(fail); }, 'should reject even if client responds after timeout': function () { var client, request; client = timeout(delayedClient, { timeout: 10 }); request = {}; return client(request).then( fail, failOnThrow(function (response) { assert.same(request, response.request); assert.equals('timeout', response.error); assert(request.canceled); }) ); }, 'should reject if client hanges': function () { var client, request; client = timeout(hangClient, { timeout: 50 }); request = {}; return client(request).then( fail, failOnThrow(function (response) { assert.same(request, response.request); assert.equals('timeout', response.error); assert(request.canceled); }) ); }, 'should use request timeout value in perference to interceptor value': function () { var client, request; client = timeout(delayedClient, { timeout: 10 }); request = { timeout: 0 }; return client(request).then(function (response) { assert.same(request, response.request); refute(response.error); refute(request.canceled); }).otherwise(fail); }, 'should not reject without a configured timeout value': function () { var client, request; client = timeout(delayedClient); request = {}; return client(request).then(function (response) { assert.same(request, response.request); refute(response.error); refute(request.canceled); }).otherwise(fail); }, 'should cancel request if client support cancelation': function () { var client, request, response; client = timeout(cancelableClient.bind(this), { timeout: 11 }); request = {}; response = client(request).then( fail, failOnThrow(function (response) { assert.same(request, response.request); assert.equals('timeout', response.error); assert.called(request.cancel); assert(request.canceled); }) ); refute(request.canceled); return response; }, 'should not cancel request if transient config enabled': function () { var client, request, response; client = timeout(cancelableClient.bind(this), { timeout: 11, transient: true }); request = {}; response = client(request).then( fail, failOnThrow(function (response) { assert.same(request, response.request); assert.equals('timeout', response.error); assert.called(request.cancel); refute(request.canceled); }) ); refute(request.canceled); return response; }, 'should use request transient value rather then interceptor': function () { var client, request, response; client = timeout(cancelableClient.bind(this), { timeout: 11, transient: false }); request = { transient: true }; response = client(request).then( fail, failOnThrow(function (response) { assert.same(request, response.request); assert.equals('timeout', response.error); assert.called(request.cancel); refute(request.canceled); }) ); refute(request.canceled); return response; }, 'should have the default client as the parent by default': function () { assert.same(rest, timeout().skip()); }, 'should support interceptor wrapping': function () { assert(typeof timeout().wrap === 'function'); } }); }); }( this.buster || require('buster'), typeof define === 'function' && define.amd ? define : function (id, factory) { var packageName = id.split(/[\/\-]/)[0], pathToRoot = id.replace(/[^\/]+/g, '..'); pathToRoot = pathToRoot.length > 2 ? pathToRoot.substr(3) : pathToRoot; factory(function (moduleId) { return require(moduleId.indexOf(packageName) === 0 ? pathToRoot + moduleId.substr(packageName.length) : moduleId); }); } // Boilerplate for AMD and Node ));