angie
Version:
Angie: A Module-Based NodeJS Web Application Framework in ES6
341 lines (316 loc) • 11.3 kB
JavaScript
// Test Modules
import { assert, expect } from 'chai';
import simple, { mock, spy } from 'simple-mock';
// System Modules
import { Form } from 'multiparty';
// Angie Modules
const TEST_ENV = global.TEST_ENV || 'src',
$Routes = require(`../../../${TEST_ENV}/factories/routes`),
$Responses = require(`../../../${TEST_ENV}/services/$Response`),
$Request = require(`../../../${TEST_ENV}/services/$Request`),
$Util = require(`../../../${TEST_ENV}/util/util`).default;
describe('$Request', function() {
const noop = () => false;
let req = {
url: 'http://localhost:3000/test.html?id=1'
};
describe('constructor', function() {
let request;
beforeEach(function() {
mock($Routes, 'fetch', () => ({
routes: 'test',
otherwise: 'test'
}));
});
afterEach(simple.restore);
it('test constructor declarations', function() {
request = new $Request(req);
expect(request.url).to.eq(req.url);
expect(request.path).to.eq('/test.html');
expect(request.query).to.deep.eq({ id: '1' });
expect(request.routes).to.eq('test');
expect(request.otherwise).to.eq('test');
});
});
describe('$redirect', function() {
let RedirectResponseMock,
head,
writeSync;
beforeEach(function() {
writeSync = spy();
head = spy(function() {
return { writeSync };
});
RedirectResponseMock = mock(
$Responses,
'RedirectResponse',
function() {
return { head };
}
);
});
afterEach(simple.restore);
it('test $redirect', function() {
new $Request(req).$redirect('test');
expect(RedirectResponseMock.calls[0].args[0]).to.eq('test');
assert(head.called);
assert(writeSync.called);
});
});
describe('$$route', function() {
let request,
head,
write,
$isRoutedAssetResourceResponseMock;
beforeEach(function() {
write = spy();
head = spy(function() {
return { write };
});
$isRoutedAssetResourceResponseMock = mock(
$Responses.AssetResponse,
'$isRoutedAssetResourceResponse',
() => false
);
});
afterEach(simple.restore);
describe('test UnknownResponse', function() {
beforeEach(function() {
request = new $Request(req);
mock(
$Responses,
'UnknownResponse',
function() {
return { head };
}
);
});
it('test no found route, no asset, no otherwise', function() {
request.$$route();
assert($Responses.UnknownResponse.called);
assert(head.called);
assert(write.called);
});
});
describe('test RedirectResponse', function() {
let writeSync;
beforeEach(function() {
mock($Routes, 'fetch', () => ({
otherwise: 'test',
routes: {}
}));
request = new $Request(req);
writeSync = spy();
head.returnWith({ writeSync });
mock(
$Responses,
'RedirectResponse',
function() {
return { head };
}
);
});
afterEach(simple.restore);
it('test no found route, no asset with otherwise', function() {
request.$$route();
assert($Responses.RedirectResponse.called);
assert(head.called);
assert(writeSync.called);
});
});
describe('test AssetResponse', function() {
beforeEach(function() {
$isRoutedAssetResourceResponseMock.returnWith(true);
mock($Routes, 'fetch', () => ({ routes: {} }));
request = new $Request(req);
mock(
$Responses.AssetResponse.prototype,
'constructor',
function() {
return { head };
}
);
});
afterEach(simple.restore);
xit('test no found route, asset', function() {
request.$$route();
expect(
$isRoutedAssetResourceResponseMock.calls[0].args[0]
).to.eq('/test.html');
assert($Responses.AssetResponse.called);
assert(head.called);
assert(write.called);
});
});
describe('test ControllerTemplateResponse', function() {
beforeEach(function() {
mock($Routes, 'fetch', () => ({
otherwise: 'test',
routes: {
'/test': {
template: 'test'
},
regExp: {
'/([A-Za-z]+)/': {
template: 'test'
}
}
}
}));
mock($Routes, '$$parseURLParams', noop);
mock($Util, '_extend', noop);
request = new $Request(req);
mock(
$Responses,
'ControllerTemplateResponse',
function() {
return { head };
}
);
});
afterEach(simple.restore);
it('test found route', function() {
request.$$route();
assert($Responses.ControllerTemplateResponse.called);
assert(head.called);
assert(write.called);
});
it('test regExp route', function() {
request.$$route();
assert($Util._extend.called);
assert($Routes.$$parseURLParams.called);
});
});
describe('test ControllerTemplatePathResponse', function() {
beforeEach(function() {
mock($Routes, 'fetch', () => ({
otherwise: 'test',
routes: {
'/test': {
templatePath: 'test.html'
},
regExp: {}
}
}));
request = new $Request(req);
request.path = '/test';
mock(
$Responses,
'ControllerTemplatePathResponse',
function() {
return { head };
}
);
});
afterEach(simple.restore);
it('test found route', function() {
request.$$route();
assert($Responses.ControllerTemplatePathResponse.called);
assert(head.called);
assert(write.called);
});
});
describe('test ErrorResponse', function() {
beforeEach(function() {
mock($Routes, 'fetch', () => ({
otherwise: 'test',
routes: {
'/test': {
template: 'test'
}
}
}));
request = new $Request(req);
request.path = '/test';
mock(
$Responses,
'ControllerTemplatePathResponse',
function() {
throw new Error();
}
);
mock(
$Responses,
'ErrorResponse',
function() {
return { head };
}
);
});
afterEach(simple.restore);
it('test error', function() {
request.$$route();
assert($Responses.ErrorResponse.called);
assert(head.called);
assert(write.called);
});
});
});
describe('$$data', function() {
let destroy,
request,
data,
end,
formMock,
test;
beforeEach(function() {
destroy = spy();
req.connection = { destroy };
request = new $Request(req);
request.$$request.on = function(s, fn) {
if (s === 'data') {
data = fn;
} else {
end = fn;
}
};
test = { test: 'test' };
formMock = mock(Form.prototype, 'parse', function(_, fn) {
return fn(null, test, test);
});
spy(Promise, 'all');
});
it('test $$data with raw data, errors', function() {
formMock.callFn(function() {
throw new Error();
});
request.$$data();
expect(data).to.be.a.function;
expect(end).to.be.a.function;
let d = '_'.repeat(1E6 + 1);
expect(data.bind(null, d)).to.throw();
end();
expect(req.body).to.eq(d);
expect(req.formData).to.deep.eq({});
expect(req.files).to.deep.eq({});
expect(Promise.all.called);
});
it('test $$data with Array raw data, no errors', function() {
formMock.callFn(function(_, fn) {
return fn(null, { test: [ 'test' ] }, test);
});
request.$$data();
expect(data).to.be.a.function;
expect(end).to.be.a.function;
let d = '_'.repeat(1E6 + 1);
expect(data.bind(null, d)).to.throw();
end();
expect(req.body).to.eq(d);
expect(req.formData).to.deep.eq(test);
expect(req.files).to.deep.eq(test);
expect(Promise.all.called);
});
it('test $$data with raw data, no errors', function() {
request.$$data();
expect(data).to.be.a.function;
expect(end).to.be.a.function;
let d = '_'.repeat(1E6 + 1);
expect(data.bind(null, d)).to.throw();
end();
expect(req.body).to.eq(d);
expect(req.formData).to.deep.eq(test);
expect(req.files).to.deep.eq(test);
expect(Promise.all.called);
});
});
});