better usage of settings

This commit is contained in:
Camel Aissani 2016-07-14 15:14:16 +02:00
parent 117e5c6974
commit bf423fb19c
11 changed files with 308 additions and 229 deletions

View File

@ -1,26 +1,19 @@
import HTTP_METHODS from './methods';
import Settings from './settings';
import Router, {Route} from './router';
import Middleware from './middleware';
import Requester, {HTTP_METHODS} from './requester';
export default class Application {
constructor() {
this.routers = [];
this.requester = new Requester();
this.DOMLoading = false;
this.settingsDef = {
'http-requester': (requester) => {this.requester = requester;}
};
this.settings = new Settings();
}
////////////////////////////////////////////////////////
// Setting
// Settings
set(name, value) {
const settingFn = this.settingsDef[name];
if (!settingFn) {
throw new ReferenceError(`unsupported setting ${name}`);
}
settingFn(value);
this.settings.set(name, value);
}
////////////////////////////////////////////////////////
@ -86,7 +79,7 @@ export default class Application {
} else {
middleware = which;
router = new Router(baseUri);
for (const method of Object.keys(HTTP_METHODS)) {
for (const method of HTTP_METHODS) {
router[method.toLowerCase()](middleware);
}
}
@ -174,6 +167,14 @@ export default class Application {
///////////////////////////////////////////////////////
// Ajax request
_fetch({method, uri, headers, data}, resolve, reject) {
const httpMethodTransformer = this.get(`http ${method} transformer`);
if (httpMethodTransformer) {
uri = httpMethodTransformer.uri ? httpMethodTransformer.uri({uri, headers, data}) : uri;
headers = httpMethodTransformer.headers ? httpMethodTransformer.headers({uri, headers, data}) : headers;
data = httpMethodTransformer.data ? httpMethodTransformer.data({uri, headers, data}) : data;
}
// calls middleware exited method
this._callMiddlewareExited();
@ -184,7 +185,7 @@ export default class Application {
this._callMiddlewareEntered(currentRoutes, {method, uri, headers, data});
// invokes http request
this.requester.fetch({uri, method},
this.settings.get('http requester').fetch({method, uri, headers, data},
(request, response) => {
this._callMiddlewareUpdated(currentRoutes, request, response);
if (resolve) {
@ -200,12 +201,21 @@ export default class Application {
}
}
Object.keys(HTTP_METHODS).reduce((reqProto, method) => {
HTTP_METHODS.reduce((reqProto, method) => {
// Middleware methods
const middlewareMethodeName = method.toLowerCase();
reqProto[middlewareMethodeName] = function(...args) {
if (args.length === 0) {
throw new TypeError(`${middlewareMethodeName} method takes at least a middleware`);
const middlewareMethodName = method.toLowerCase();
reqProto[middlewareMethodName] = function(...args) {
if (middlewareMethodName === 'get') {
if (args.length === 0) {
throw new TypeError(`${middlewareMethodName} method takes at least a string or a middleware`);
} else if (args.length === 1) {
const [name] = args;
if (typeof name === 'string') {
return this.settings.get(name);
}
}
} else if (args.length === 0) {
throw new TypeError(`${middlewareMethodName} method takes at least a middleware`);
}
let baseUri, middleware, which;
@ -217,12 +227,12 @@ Object.keys(HTTP_METHODS).reduce((reqProto, method) => {
}
if (!(which instanceof Middleware) && (typeof which !== 'function')) {
throw new TypeError(`${middlewareMethodeName} method takes at least a middleware`);
throw new TypeError(`${middlewareMethodName} method takes at least a middleware`);
}
const router = new Router();
middleware = which;
router[middlewareMethodeName](baseUri, middleware);
router[middlewareMethodName](baseUri, middleware);
this.routers.push(router);
};

1
lib/methods.js Normal file
View File

@ -0,0 +1 @@
export default ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'];

View File

@ -1,76 +1,6 @@
export const HTTP_METHODS = {
'GET': {
uri({uri, headers, data}) {
if (!data) {
return uri;
}
let anchor = '';
let uriWithoutAnchor = uri;
const hashIndex = uri.indexOf('#');
if (hashIndex >=1) {
uriWithoutAnchor = uri.slice(0, hashIndex);
anchor = uri.slice(hashIndex, uri.length);
}
uriWithoutAnchor = Object.keys(data).reduce((gUri, d, index) => {
if (index === 0 && gUri.indexOf('?') === -1) {
gUri += '?';
} else {
gUri += '&';
}
gUri += `${d}=${data[d]}`;
return gUri;
}, uriWithoutAnchor);
return uriWithoutAnchor + anchor;
},
data({uri, headers, data}) {
return undefined;
}
},
'POST': {
headers({uri, headers, data}) {
const postHeaders = {};
postHeaders['Content-type'] = 'application/x-www-form-urlencoded';
if (headers) {
Object.keys(headers).reduce((phds, headKey) => {
phds[headKey] = headers[headKey];
return phds;
}, postHeaders);
}
return postHeaders;
},
data({uri, headers, data}) {
if (!data) {
return data;
}
return Object.keys(data).reduce((newData, d, index) => {
if (index !== 0) {
newData += '&';
}
newData += `${d}=${data[d]}`;
return newData;
}, '');
}
},
'PUT': {
//TODO
},
'DELETE': {
//TODO
}
// non exhaustive list
};
export default class Requester {
fetch({method, uri, headers, data}, resolve, reject) {
const transformer = HTTP_METHODS[method];
uri = transformer.uri ? transformer.uri({uri, headers, data}) : uri;
headers = transformer.headers ? transformer.headers({uri, headers, data}) : headers;
data = transformer.data ? transformer.data({uri, headers, data}) : data;
const success = (responseText) => {
resolve(
{method, uri, headers, data},
@ -114,30 +44,36 @@ export default class Requester {
}
_analyzeErrors(response) {
let error = '';
if (response.status === 0) {
error = 'Server access problem. Check your network connection';
} else if (response.status === 401) {
error = 'Your session has expired, Please reconnect. [code: 401]';
} else if (response.status === 404) {
error = 'Page not found on server. [code: 404]';
} else if (response.status === 500) {
error = 'Internal server error. [code: 500]';
} else if (response.errorThrown) {
// manage exceptions
if (response.errorThrown) {
if (response.errorThrown.name === 'SyntaxError') {
error = 'Problem during data decoding [JSON]';
} else if (response.errorThrown.name === 'TimeoutError') {
error = 'Server is taking too long to reply';
} else if (response.errorThrown.name === 'AbortError') {
error = 'Request cancelled on server';
} else if (response.errorThrown.name === 'NetworkError') {
error = 'A network error occurred';
} else {
error = `${response.errorThrown.name} ${response.errorThrown.message}`;
return 'Problem during data decoding [JSON]';
}
} else {
error = `Unknown error. ${response.statusText?response.statusText:''}`;
if (response.errorThrown.name === 'TimeoutError') {
return 'Server is taking too long to reply';
}
if (response.errorThrown.name === 'AbortError') {
return 'Request cancelled on server';
}
if (response.errorThrown.name === 'NetworkError') {
return 'A network error occurred';
}
throw response.errorThrown;
}
return error;
// manage status
if (response.status === 0) {
return 'Server access problem. Check your network connection';
}
if (response.status === 401) {
return 'Your session has expired, Please reconnect. [code: 401]';
}
if (response.status === 404) {
return 'Page not found on server. [code: 404]';
}
if (response.status === 500) {
return 'Internal server error. [code: 500]';
}
return `Unknown error. ${response.statusText?response.statusText:''}`;
}
}

View File

@ -1,4 +1,4 @@
import {HTTP_METHODS} from './requester';
import HTTP_METHODS from './methods';
import Middleware from './middleware';
class Route {
@ -138,14 +138,14 @@ export default class Router {
throw new TypeError('use all method takes at least a middleware');
}
for (const method of Object.keys(HTTP_METHODS)) {
for (const method of HTTP_METHODS) {
this[method.toLowerCase()](...args);
}
return this;
}
}
for (const method of Object.keys(HTTP_METHODS)) {
for (const method of HTTP_METHODS) {
const methodName = method.toLowerCase();
Router.prototype[methodName] = function(...args) {
if (args.length === 0) {

87
lib/settings.js Normal file
View File

@ -0,0 +1,87 @@
import Requester from './requester';
export default class {
constructor() {
// default settings
this.settings = {
'http requester': new Requester(),
'http GET transformer': {
uri({uri, headers, data}) {
if (!data) {
return uri;
}
let anchor = '';
let uriWithoutAnchor = uri;
const hashIndex = uri.indexOf('#');
if (hashIndex >=1) {
uriWithoutAnchor = uri.slice(0, hashIndex);
anchor = uri.slice(hashIndex, uri.length);
}
uriWithoutAnchor = Object.keys(data).reduce((gUri, d, index) => {
if (index === 0 && gUri.indexOf('?') === -1) {
gUri += '?';
} else {
gUri += '&';
}
gUri += `${d}=${data[d]}`;
return gUri;
}, uriWithoutAnchor);
return uriWithoutAnchor + anchor;
},
data({uri, headers, data}) {
return undefined;
}
},
'http POST transformer': {
headers({uri, headers, data}) {
const postHeaders = {};
postHeaders['Content-type'] = 'application/x-www-form-urlencoded';
if (headers) {
Object.keys(headers).reduce((phds, headKey) => {
phds[headKey] = headers[headKey];
return phds;
}, postHeaders);
}
return postHeaders;
},
data({uri, headers, data}) {
if (!data) {
return data;
}
return Object.keys(data).reduce((newData, d, index) => {
if (index !== 0) {
newData += '&';
}
newData += `${d}=${data[d]}`;
return newData;
}, '');
}
}
};
this.rules = {
'http requester': (requester) => {
if(typeof requester.fetch !== 'function') {
throw new TypeError('setting http requester has no fetch method');
}
}
};
}
set(name, value) {
const checkRules = this.rules[name];
if (checkRules) {
checkRules(value);
}
this.settings[name] = value;
}
get(name) {
return this.settings[name];
}
};

View File

@ -37,7 +37,6 @@
"chai": "^3.5.0",
"eslint": "^2.11.0",
"eslint-loader": "^1.3.0",
"fake-xml-http-request": "^1.4.0",
"istanbul": "^0.4.3",
"mocha": "^2.5.3",
"rimraf": "^2.5.2",

View File

@ -102,17 +102,23 @@ describe('Application', () => {
});
});
describe('set method', () => {
it('unsupported setting', () => {
describe('set/get setting method', () => {
it('custom setting', () => {
const app = frontexpress();
chai.expect(() => app.set('blabla', 'value')).to.throw(ReferenceError);
app.set('blabla', 'value');
assert(app.get('blabla') === 'value');
});
it('supported setting', () => {
it('core setting', () => {
const requester = new Requester();
const app = frontexpress();
app.set('http-requester', requester);
assert(app.requester === requester);
app.set('http requester', requester);
assert(app.get('http requester') === requester);
});
it('bad core setting', () => {
const app = frontexpress();
chai.expect(() => (app.set('http requester', 'not an object with fetch function'))).to.throw(TypeError);
});
});
@ -129,25 +135,25 @@ describe('Application', () => {
it('no arguments', () => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
assert.throws(app.use, TypeError);
});
it('bad arguments', () => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
chai.expect(() => app.use('eee')).to.throw(TypeError);
});
it('mixing uri and regexp', () => {
let router = frontexpress.Router('/subroute');
let app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
chai.expect(() => app.use(/route/, router)).to.throw(TypeError);
router = frontexpress.Router(/subroute/);
app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
chai.expect(() => app.use('/route', router)).to.throw(TypeError);
});
@ -155,7 +161,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use((request, response, next) => {spy();});
app.httpGet('/', (request, response) => {
@ -172,7 +178,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use('/route1', (request, response, next) => {spy();});
app.httpGet('/route1', (request, response) => {
@ -197,7 +203,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use((request, response, next) => {spy();});
app.httpGet('/', null, (request, response) => {
@ -212,7 +218,7 @@ describe('Application', () => {
const spy = sinon.spy(middleware, 'updated');
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use(middleware);
app.httpGet('/', (request, response) => {
@ -230,7 +236,7 @@ describe('Application', () => {
const spy = sinon.spy(middleware, 'updated');
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use('/route1', middleware);
app.httpGet('/route1', (request, response) => {
@ -256,7 +262,7 @@ describe('Application', () => {
const spy = sinon.spy(middleware, 'failed');
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use(middleware);
app.httpGet('/', null, (request, response) => {
@ -274,7 +280,7 @@ describe('Application', () => {
.post((request, response, next) => {spy();});
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use(router);
app.httpGet('/', (request, response) => {
@ -295,7 +301,7 @@ describe('Application', () => {
.post((request, response, next) => {spy();});
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use('/route1', router);
app.httpGet('/route1', (request, response) => {
@ -313,7 +319,7 @@ describe('Application', () => {
const spy = sinon.spy(middleware, 'updated');
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
const router = frontexpress.Router();
router.get('/subroute1', middleware);
@ -345,7 +351,7 @@ describe('Application', () => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use(/^\/route1/, router1);
app.use(/^\/route2/, router2);
@ -379,14 +385,13 @@ describe('Application', () => {
it('no arguments', () => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
assert.throws(app.get, TypeError);
});
it('bad arguments', () => {
const app = frontexpress();
app.set('http-requester', requester);
chai.expect(() => app.get('eee')).to.throw(TypeError);
app.set('http requester', requester);
chai.expect(() => app.get(frontexpress.Router())).to.throw(TypeError);
chai.expect(() => app.get('/route1', frontexpress.Router())).to.throw(TypeError);
});
@ -395,7 +400,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.get((request, respons, next) => {spy();});
app.httpGet('/', (request, response) => {
@ -412,7 +417,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.get('/route1', (request, response, next) => {spy();});
app.httpGet('/route1', (request, response) => {
@ -430,7 +435,7 @@ describe('Application', () => {
const spy = sinon.spy(middleware, 'updated');
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.get(middleware);
app.httpGet('/', (request, response) => {
@ -448,7 +453,7 @@ describe('Application', () => {
const spy = sinon.spy(middleware, 'updated');
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.get(middleware);
app.httpGet('/route1', (request, response) => {
@ -462,6 +467,24 @@ describe('Application', () => {
});
});
describe('post method', () => {
beforeEach(()=>{
requester = new Requester();
sinon.stub(requester, 'fetch', ({uri, method, headers, data}, resolve, reject) => {
resolve(
{uri, method, headers, data},
{status: 200, statusText: 'OK', responseText:''}
);
});
});
it('no arguments', () => {
const app = frontexpress();
app.set('http requester', requester);
assert.throws(app.post, TypeError);
});
});
describe('route method', () => {
beforeEach(()=>{
requester = new Requester();
@ -477,7 +500,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route().get((request, response, next) => {spy();});
app.httpGet('/', (request, response) => {
@ -494,7 +517,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route('/').get((request, response, next) => {spy();});
app.httpGet('/', (request, response) => {
@ -511,7 +534,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route('/route1').get((request, response, next) => {spy();});
app.httpGet('/route1', (request, response) => {
@ -528,7 +551,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route().get('/subroute1', (request, response, next) => {spy();});
app.httpGet('/subroute1', (request, response) => {
@ -544,7 +567,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route('/').get('/subroute1', (request, response, next) => {spy();});
app.httpGet('/subroute1', (request, response) => {
@ -560,7 +583,7 @@ describe('Application', () => {
const spy = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route('/route1').get('/subroute1', (request, response, next) => {spy();});
app.httpGet('/route1/subroute1', (request, response) => {
@ -586,7 +609,7 @@ describe('Application', () => {
it('http GET request', (done) => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
const getMiddleware = frontexpress.Middleware('get middleware');
const spy_get_entered = sinon.spy(getMiddleware, 'entered');
@ -614,7 +637,7 @@ describe('Application', () => {
it('http GET followed by http POST requests', (done) => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
const allMiddleware = frontexpress.Middleware('all middleware');
const spy_all_entered = sinon.spy(allMiddleware, 'entered');
@ -697,7 +720,7 @@ describe('Application', () => {
);
});
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
const getMiddleware = frontexpress.Middleware('get middleware');
const spy_get_failed = sinon.spy(getMiddleware, 'failed');
@ -716,7 +739,7 @@ describe('Application', () => {
it('next method', (done) => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
const m1 = frontexpress.Middleware('m1');
const m2 = frontexpress.Middleware('m2');
@ -750,7 +773,7 @@ describe('Application', () => {
it('next method', (done) => {
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
const m1 = (req, res, next) => {next();};
const m2 = (req, res, next) => {};

View File

@ -0,0 +1,31 @@
/*eslint-env mocha*/
import {assert} from 'chai';
import Settings from '../lib/settings';
describe('HTTP_METHODS', () => {
const settings = new Settings();
it('GET method simple uri', () => {
const uriFn = settings.get('http GET transformer').uri;
const dataFn = settings.get('http GET transformer').data;
assert(uriFn({uri: '/route', data:{a:'b', c:'d'}}) === '/route?a=b&c=d');
assert(dataFn({uri: '/route', data:{a:'b', c:'d'}}) === undefined);
});
it('GET method uri with query string', () => {
const uriFn = settings.get('http GET transformer').uri;
const dataFn = settings.get('http GET transformer').data;
assert(uriFn({uri: '/route?x=y&z=a', data:{a:'b', c:'d'}}) === '/route?x=y&z=a&a=b&c=d');
assert(dataFn({uri: '/route?x=y&z=a', data:{a:'b', c:'d'}}) === undefined);
});
it('GET method uri with query string and anchor', () => {
const uriFn = settings.get('http GET transformer').uri;
const dataFn = settings.get('http GET transformer').data;
assert(uriFn({uri: '/route?x=y&z=a#anchor1', data:{a:'b', c:'d'}}) === '/route?x=y&z=a&a=b&c=d#anchor1');
assert(dataFn({uri: '/route?x=y&z=a#anchor1', data:{a:'b', c:'d'}}) === undefined);
});
});

View File

@ -50,7 +50,7 @@ describe('Test sample from README', () => {
const h3 = (req, res, next) => { spy_log('h3!'); next(); };
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.get('/example/a', h1);
app.get('/example/a', h2);
@ -77,7 +77,7 @@ describe('Test sample from README', () => {
const spy_log = sinon.spy();
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.route('/book')
.get((req, res) => { spy_log('Get a random book');})
@ -128,7 +128,7 @@ describe('Test sample from README', () => {
});
const app = frontexpress();
app.set('http-requester', requester);
app.set('http requester', requester);
app.use('/birds', router);
// make an ajax request on /birds

View File

@ -1,35 +1,8 @@
/*eslint-env mocha*/
/*global global*/
import {assert} from 'chai';
import chai, {assert} from 'chai';
import sinon from 'sinon';
import FakeXMLHttpRequest from 'fake-xml-http-request';
import Requester, {HTTP_METHODS} from '../lib/requester';
describe('HTTP_METHODS', () => {
it('GET method simple uri', () => {
const uriFn = HTTP_METHODS['GET'].uri;
const dataFn = HTTP_METHODS['GET'].data;
assert(uriFn({uri: '/route', data:{a:'b', c:'d'}}) === '/route?a=b&c=d');
assert(dataFn({uri: '/route', data:{a:'b', c:'d'}}) === undefined);
});
it('GET method uri with query string', () => {
const uriFn = HTTP_METHODS['GET'].uri;
const dataFn = HTTP_METHODS['GET'].data;
assert(uriFn({uri: '/route?x=y&z=a', data:{a:'b', c:'d'}}) === '/route?x=y&z=a&a=b&c=d');
assert(dataFn({uri: '/route?x=y&z=a', data:{a:'b', c:'d'}}) === undefined);
});
it('GET method uri with query string and anchor', () => {
const uriFn = HTTP_METHODS['GET'].uri;
const dataFn = HTTP_METHODS['GET'].data;
assert(uriFn({uri: '/route?x=y&z=a#anchor1', data:{a:'b', c:'d'}}) === '/route?x=y&z=a&a=b&c=d#anchor1');
assert(dataFn({uri: '/route?x=y&z=a#anchor1', data:{a:'b', c:'d'}}) === undefined);
});
});
import Requester from '../lib/requester';
describe('Requester', () => {
function xHttpWillRespond(xhttp, readyState, status, statusText, responseText) {
@ -51,13 +24,17 @@ describe('Requester', () => {
function xHttpWillThrow(xhttp, sendErrorName, openErrorName) {
const stub_send = sinon.stub(xhttp, 'send', function() {
if (sendErrorName) {
throw {name: sendErrorName};
const e = new Error(sendErrorName);
e.name = sendErrorName;
throw e;
}
});
const stub_open = sinon.stub(xhttp, 'open', function() {
if (openErrorName) {
throw {name: openErrorName};
const e = new Error(openErrorName);
e.name = openErrorName;
throw e;
}
});
@ -67,8 +44,11 @@ describe('Requester', () => {
let xhttp;
beforeEach(() => {
// Stub XMLHttpRequest
xhttp = new FakeXMLHttpRequest();
xhttp = {
setRequestHeader(){},
open(){},
send(){}
};
global.XMLHttpRequest = () => {
return xhttp;
};
@ -79,15 +59,27 @@ describe('Requester', () => {
it('with data', (done) => {
const requester = new Requester();
const {stub_open, stub_send} = xHttpWillRespond(xhttp, 4, 200, '', '<p>content!</p>');
xHttpWillRespond(xhttp, 4, 200, '', '<p>content!</p>');
requester.fetch({method: 'GET', uri:'/route1', data:{p1: 'a', p2: 'b', p3: 'c'}},
(request, response) => {
assert(request.uri === '/route1?p1=a&p2=b&p3=c');
assert(request.method === 'GET');
assert(request.uri === '/route1');
assert(request.data !== undefined);
assert(request.data.p1 === 'a');
assert(request.data.p2 === 'b');
assert(request.data.p3 === 'c');
assert(response.status === 200);
assert(response.statusText === 'OK');
assert(response.responseText === '<p>content!</p>');
assert(response.errorThrown === undefined);
assert(response.errors === undefined);
done();
},
(err) => {
done(err);
(request, response) => {
done(response.error);
});
});
@ -101,8 +93,8 @@ describe('Requester', () => {
assert(stub_send.calledOnce);
assert(stub_open.calledBefore(stub_send));
assert(request.uri === '/route1');
assert(request.method === 'GET');
assert(request.uri === '/route1');
assert(request.data === undefined);
assert(response.status === 200);
@ -113,8 +105,8 @@ describe('Requester', () => {
done();
},
(error) => {
done(error);
(request, response) => {
done(response.error);
});
});
});
@ -126,7 +118,7 @@ describe('Requester', () => {
const {stub_open, stub_send, stub_setRequestHeader} = xHttpWillRespond(xhttp, 4, 200, '', '<p>content!</p>');
requester.fetch({method: 'POST', uri:'/route1', data:{p1: 'a', p2: 'b', p3: 'c'}},
requester.fetch({method: 'POST', uri:'/route1', headers:{'head1':'value1'}, data:{p1: 'a', p2: 'b', p3: 'c'}},
(request, response) => {
assert(stub_open.calledOnce);
assert(stub_setRequestHeader.calledOnce);
@ -135,13 +127,23 @@ describe('Requester', () => {
assert(stub_setRequestHeader.calledAfter(stub_open));
assert(stub_setRequestHeader.calledBefore(stub_send));
assert(request.method === 'POST');
assert(request.uri === '/route1');
assert(request.headers['Content-type'] === 'application/x-www-form-urlencoded');
assert(request.data === 'p1=a&p2=b&p3=c');
assert(request.data !== undefined);
assert(request.data.p1 === 'a');
assert(request.data.p2 === 'b');
assert(request.data.p3 === 'c');
assert(response.status === 200);
assert(response.statusText === 'OK');
assert(response.responseText === '<p>content!</p>');
assert(response.errorThrown === undefined);
assert(response.errors === undefined);
done();
},
(err) => {
done(err);
(request, response) => {
done(response.error);
});
});
@ -153,19 +155,18 @@ describe('Requester', () => {
requester.fetch({method: 'POST', uri:'/route1'},
(request, response) => {
assert(stub_open.calledOnce);
assert(stub_setRequestHeader.calledOnce);
assert(stub_setRequestHeader.callCount === 0);
assert(stub_send.calledOnce);
assert(stub_open.calledBefore(stub_send));
assert(stub_setRequestHeader.calledAfter(stub_open));
assert(stub_setRequestHeader.calledBefore(stub_send));
assert(request.method === 'POST');
assert(request.uri === '/route1');
assert(request.headers['Content-type'] === 'application/x-www-form-urlencoded');
assert(request.data === undefined);
done();
},
(err) => {
done(err);
(request, response) => {
done(response.error);
});
});
@ -177,20 +178,20 @@ describe('Requester', () => {
requester.fetch({method: 'POST', uri:'/route1', headers: {'Accept-Charset': 'utf-8'}},
(request, response) => {
assert(stub_open.calledOnce);
assert(stub_setRequestHeader.calledTwice);
assert(stub_setRequestHeader.calledOnce);
assert(stub_send.calledOnce);
assert(stub_open.calledBefore(stub_send));
assert(stub_setRequestHeader.calledAfter(stub_open));
assert(stub_setRequestHeader.calledBefore(stub_send));
assert(request.method === 'POST');
assert(request.uri === '/route1');
assert(request.headers['Content-type'] === 'application/x-www-form-urlencoded');
assert(request.headers['Accept-Charset'] === 'utf-8');
assert(request.data === undefined);
done();
},
(err) => {
done(err);
(request, response) => {
done(response.error);
});
});
});
@ -377,24 +378,15 @@ describe('Requester', () => {
});
});
it('request returns unknown error', (done) => {
it('request returns unknown error', () => {
const requester = new Requester();
const {stub_open, stub_send} = xHttpWillThrow(xhttp, 'BlaBlaError');
requester.fetch({method: 'GET', uri:'/route1'}, null,
(request, response) => {
assert(stub_send.calledOnce);
assert(stub_open.calledOnce);
chai.expect(() => {
requester.fetch({method: 'GET', uri:'/route1'});
}).to.throw(/BlaBlaError/);
assert(response.status === undefined);
assert(response.statusText === undefined);
assert(response.responseText === undefined);
assert(response.errorThrown.name === 'BlaBlaError');
assert(response.errors.length !== 0);
done();
});
});
});
});

View File

@ -2,7 +2,7 @@
import chai, {assert} from 'chai';
import sinon from 'sinon';
import frontexpress from '../lib/frontexpress';
import {HTTP_METHODS} from '../lib/requester';
import HTTP_METHODS from '../lib/methods';
describe('Router', () => {
@ -207,7 +207,7 @@ describe('Router', () => {
const middleware = frontexpress.Middleware();
const spied_methods = [];
for (const method of Object.keys(HTTP_METHODS)) {
for (const method of HTTP_METHODS) {
spied_methods.push(sinon.spy(router, method.toLowerCase()));
}
@ -223,7 +223,7 @@ describe('Router', () => {
const middleware = frontexpress.Middleware();
const spied_methods = [];
for (const method of Object.keys(HTTP_METHODS)) {
for (const method of HTTP_METHODS) {
spied_methods.push(sinon.spy(router, method.toLowerCase()));
}