mirror of
https://gitlab.silvrtree.co.uk/martind2000/frontexpress.git
synced 2025-02-10 17:49:16 +00:00
better usage of settings
This commit is contained in:
parent
117e5c6974
commit
bf423fb19c
@ -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
1
lib/methods.js
Normal file
@ -0,0 +1 @@
|
||||
export default ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'];
|
120
lib/requester.js
120
lib/requester.js
@ -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:''}`;
|
||||
}
|
||||
}
|
@ -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
87
lib/settings.js
Normal 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];
|
||||
}
|
||||
};
|
@ -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",
|
||||
|
@ -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) => {};
|
||||
|
31
test/method-transformer-test.js
Normal file
31
test/method-transformer-test.js
Normal 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);
|
||||
});
|
||||
});
|
@ -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
|
||||
|
@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -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()));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user