tachi
Version:
Node.js MVC framework for seriously rapid application development.
160 lines (126 loc) • 4.91 kB
JavaScript
describe('patternParser', function() {
var patternParser;
beforeEach(function() {
patternParser = require('../../RouteParser/patternParser');
});
describe('#getParameters()', function() {
it('should return no parameters from a blank route.', function() {
var parameters = patternParser.getParameters('/');
parameters.should.eql([]);
});
it('should return no parameters from no route.', function() {
var parameters = patternParser.getParameters('');
parameters.should.eql([]);
});
it('should return no parameters from a non-parameterised route.', function() {
var parameters = patternParser.getParameters('/test');
parameters.should.eql([]);
});
it('should split a single parameter from a simple route.', function() {
var parameters = patternParser.getParameters('/{test}');
parameters.should.eql(['test']);
});
it('should split a single parameter from a simple route that ends with a /.', function() {
var parameters = patternParser.getParameters('/{test}/');
parameters.should.eql(['test']);
});
it('should split a single parameter from a simple route with a constant.', function() {
var parameters = patternParser.getParameters('/{test}-something');
parameters.should.eql(['test']);
});
it('should split multiple parameters from a complex route.', function() {
var parameters = patternParser.getParameters('/{test}/{test2}/');
parameters.should.eql(['test', 'test2']);
});
it('should split multiple parameters from a complex route with a constant.', function() {
var parameters = patternParser.getParameters('/{test}-test/test2-{test2}/test3');
parameters.should.eql(['test', 'test2']);
});
it('should not grab parameters from a route without closed brackets.', function() {
var parameters = patternParser.getParameters('/{test');
parameters.should.eql([]);
});
it('should be greedy when parsing mis-matched brackets.', function() {
var parameters = patternParser.getParameters('/{test/{test2}/');
parameters.should.eql(['test/{test2']);
});
it('should allow multiple parameters to be named the same.', function() {
// This case is useless, but not prevented.
var parameters = patternParser.getParameters('/{test}/{test}/');
parameters.should.eql(['test', 'test']);
});
});
describe('#generateParseFunction()', function() {
var TestCase = function(pattern, url, expectedResult) {
return {
pattern: pattern,
url: url,
expectedResult: expectedResult
};
};
[
// The gerated function doesn't currently allow for matches where a trailing / is missing.
TestCase('/{test}/', '/test'),
TestCase('/hello{test}/', '/blah/'),
TestCase('/hello{test}/{test2}/', '/blah/test2/'),
TestCase('/{test}/{test2}/', '/no-pe/'),
].forEach(function(testCase) {
it('should return false when a route doesn\'t match the URL. (' + testCase.pattern + ', ' + testCase.url + ')', function() {
var parseFunction = patternParser.generateParseFunction(testCase.pattern);
var parameters = parseFunction(testCase.url);
parameters.should.eql(false);
});
});
[
TestCase('/', '/', {}),
TestCase('/', '/test', {}),
TestCase('/{test}/', '/test/', {
test: 'test'
}),
// It's not recommended to use greedy patterns, but you can.
TestCase('/{test}/{test2}', '/testOne/testTwo', {
test: 'testOne',
test2: 'testTwo'
}),
TestCase('/{test}/{test2}/', '/testOne/testTwo/', {
test: 'testOne',
test2: 'testTwo'
})
].forEach(function(testCase) {
it('should return a function that resolves the expected parameters. (' + testCase.pattern + ', ' + testCase.url + ')', function() {
var parseFunction = patternParser.generateParseFunction(testCase.pattern);
var parameters = parseFunction(testCase.url);
parameters.should.eql(testCase.expectedResult);
});
});
});
describe('public interface', function() {
it('should parse a route that is provided as a string.', function() {
var result = patternParser('/{test}/');
result.should.have.property('func');
result.data.should.eql({});
result._parameters.should.eql(['test']);
});
it('should parse a route that is provided as an object.', function() {
var result = patternParser({
url: '/{test}/'
});
result.should.have.property('func');
result.data.should.eql({});
result._parameters.should.eql(['test']);
});
it('should return any passed data as pre-set data.', function() {
var result = patternParser({
url: '/{test}/',
data: {
testData: 'test'
}
});
result.should.have.property('func');
result.data.should.eql({
testData: 'test'
});
result._parameters.should.eql(['test']);
});
});
});