The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
wekan/packages/kadira-flow-router/test/client/router.core.spec.js

632 lines
15 KiB

Router = FlowRouter.Router;
Tinytest.addAsync('Client - Router - define and go to route', function (test, next) {
var rand = Random.id();
var rendered = 0;
FlowRouter.route('/' + rand, {
action: function(_params) {
rendered++;
}
});
FlowRouter.go('/' + rand);
setTimeout(function() {
test.equal(rendered, 1);
setTimeout(next, 100);
}, 100);
});
Tinytest.addAsync('Client - Router - define and go to route with fields',
function (test, next) {
var rand = Random.id();
var pathDef = "/" + rand + "/:key";
var rendered = 0;
FlowRouter.route(pathDef, {
action: function(params) {
test.equal(params.key, "abc +@%");
rendered++;
}
});
FlowRouter.go(pathDef, {key: "abc +@%"});
setTimeout(function() {
test.equal(rendered, 1);
setTimeout(next, 100);
}, 100);
});
Tinytest.addAsync('Client - Router - parse params and query', function (test, next) {
var rand = Random.id();
var rendered = 0;
var params = null;
FlowRouter.route('/' + rand + '/:foo', {
action: function(_params) {
rendered++;
params = _params;
}
});
FlowRouter.go('/' + rand + '/bar');
setTimeout(function() {
test.equal(rendered, 1);
test.equal(params.foo, 'bar');
setTimeout(next, 100);
}, 100);
});
Tinytest.addAsync('Client - Router - redirect using FlowRouter.go', function (test, next) {
var rand = Random.id(), rand2 = Random.id();
var log = [];
var paths = ['/' + rand2, '/' + rand];
var done = false;
FlowRouter.route(paths[0], {
action: function(_params) {
log.push(1);
FlowRouter.go(paths[1]);
}
});
FlowRouter.route(paths[1], {
action: function(_params) {
log.push(2);
}
});
FlowRouter.go(paths[0]);
setTimeout(function() {
test.equal(log, [1, 2]);
done = true;
next();
}, 100);
});
Tinytest.addAsync('Client - Router - get current route path', function (test, next) {
var value = Random.id();
var randomValue = Random.id();
var pathDef = "/" + randomValue + '/:_id';
var path = "/" + randomValue + "/" + value;
var detectedValue = null;
FlowRouter.route(pathDef, {
action: function(params) {
detectedValue = params._id;
}
});
FlowRouter.go(path);
Meteor.setTimeout(function() {
test.equal(detectedValue, value);
test.equal(FlowRouter.current().path, path);
next();
}, 50);
});
Tinytest.addAsync('Client - Router - subscribe to global subs', function (test, next) {
var rand = Random.id();
FlowRouter.route('/' + rand);
FlowRouter.subscriptions = function (path) {
test.equal(path, '/' + rand);
this.register('baz', Meteor.subscribe('baz'));
};
FlowRouter.go('/' + rand);
setTimeout(function() {
test.isTrue(!!GetSub('baz'));
FlowRouter.subscriptions = Function.prototype;
next();
}, 100);
});
Tinytest.addAsync('Client - Router - setParams - generic', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "/:cat/:id";
var paramsList = [];
FlowRouter.route(pathDef, {
action: function(params) {
paramsList.push(params);
}
});
FlowRouter.go(pathDef, {cat: "meteor", id: "200"});
setTimeout(function() {
// return done();
var success = FlowRouter.setParams({id: "700"});
test.isTrue(success);
setTimeout(validate, 50);
}, 50);
function validate() {
test.equal(paramsList.length, 2);
test.equal(_.pick(paramsList[0], "id", "cat"), {cat: "meteor", id: "200"});
test.equal(_.pick(paramsList[1], "id", "cat"), {cat: "meteor", id: "700"});
done();
}
});
Tinytest.addAsync('Client - Router - setParams - preserve query strings', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "/:cat/:id";
var paramsList = [];
var queryParamsList = [];
FlowRouter.route(pathDef, {
action: function(params, queryParams) {
paramsList.push(params);
queryParamsList.push(queryParams);
}
});
FlowRouter.go(pathDef, {cat: "meteor", id: "200 +% / ad"}, {aa: "20 +%"});
setTimeout(function() {
// return done();
var success = FlowRouter.setParams({id: "700 +% / ad"});
test.isTrue(success);
setTimeout(validate, 50);
}, 50);
function validate() {
test.equal(paramsList.length, 2);
test.equal(queryParamsList.length, 2);
test.equal(_.pick(paramsList[0], "id", "cat"), {cat: "meteor", id: "200 +% / ad"});
test.equal(_.pick(paramsList[1], "id", "cat"), {cat: "meteor", id: "700 +% / ad"});
test.equal(queryParamsList, [{aa: "20 +%"}, {aa: "20 +%"}]);
done();
}
});
Tinytest.add('Client - Router - setParams - no route selected', function (test) {
var originalRoute = FlowRouter._current.route;
FlowRouter._current.route = undefined;
var success = FlowRouter.setParams({id: "800"});
test.isFalse(success);
FlowRouter._current.route = originalRoute;
});
Tinytest.addAsync('Client - Router - setQueryParams - using check', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "";
var queryParamsList = [];
FlowRouter.route(pathDef, {
action: function(params, queryParams) {
queryParamsList.push(queryParams);
}
});
FlowRouter.go(pathDef, {}, {cat: "meteor", id: "200"});
setTimeout(function() {
check(FlowRouter.current().queryParams, {cat: String, id: String});
done();
}, 50);
});
Tinytest.addAsync('Client - Router - setQueryParams - generic', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "";
var queryParamsList = [];
FlowRouter.route(pathDef, {
action: function(params, queryParams) {
queryParamsList.push(queryParams);
}
});
FlowRouter.go(pathDef, {}, {cat: "meteor", id: "200"});
setTimeout(function() {
// return done();
var success = FlowRouter.setQueryParams({id: "700"});
test.isTrue(success);
setTimeout(validate, 50);
}, 50);
function validate() {
test.equal(queryParamsList.length, 2);
test.equal(_.pick(queryParamsList[0], "id", "cat"), {cat: "meteor", id: "200"});
test.equal(_.pick(queryParamsList[1], "id", "cat"), {cat: "meteor", id: "700"});
done();
}
});
Tinytest.addAsync('Client - Router - setQueryParams - remove query param null', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "";
var queryParamsList = [];
FlowRouter.route(pathDef, {
action: function(params, queryParams) {
queryParamsList.push(queryParams);
}
});
FlowRouter.go(pathDef, {}, {cat: "meteor", id: "200"});
setTimeout(function() {
var success = FlowRouter.setQueryParams({id: "700", cat: null});
test.isTrue(success);
setTimeout(validate, 50);
}, 50);
function validate() {
test.equal(queryParamsList.length, 2);
test.equal(_.pick(queryParamsList[0], "id", "cat"), {cat: "meteor", id: "200"});
test.equal(queryParamsList[1], {id: "700"});
done();
}
});
Tinytest.addAsync('Client - Router - setQueryParams - remove query param undefined', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "";
var queryParamsList = [];
FlowRouter.route(pathDef, {
action: function(params, queryParams) {
queryParamsList.push(queryParams);
}
});
FlowRouter.go(pathDef, {}, {cat: "meteor", id: "200"});
setTimeout(function() {
var success = FlowRouter.setQueryParams({id: "700", cat: undefined});
test.isTrue(success);
setTimeout(validate, 50);
}, 50);
function validate() {
test.equal(queryParamsList.length, 2);
test.equal(_.pick(queryParamsList[0], "id", "cat"), {cat: "meteor", id: "200"});
test.equal(queryParamsList[1], {id: "700"});
done();
}
});
Tinytest.addAsync('Client - Router - setQueryParams - preserve params', function (test, done) {
var randomKey = Random.id();
var pathDef = "/" + randomKey + "/:abc";
var queryParamsList = [];
var paramsList = [];
FlowRouter.route(pathDef, {
action: function(params, queryParams) {
paramsList.push(params);
queryParamsList.push(queryParams);
}
});
FlowRouter.go(pathDef, {abc: "20"}, {cat: "meteor", id: "200"});
setTimeout(function() {
// return done();
var success = FlowRouter.setQueryParams({id: "700"});
test.isTrue(success);
setTimeout(validate, 50);
}, 50);
function validate() {
test.equal(queryParamsList.length, 2);
test.equal(queryParamsList, [
{cat: "meteor", id: "200"}, {cat: "meteor", id: "700"}
]);
test.equal(paramsList.length, 2);
test.equal(_.pick(paramsList[0], "abc"), {abc: "20"});
test.equal(_.pick(paramsList[1], "abc"), {abc: "20"});
done();
}
});
Tinytest.add('Client - Router - setQueryParams - no route selected', function (test) {
var originalRoute = FlowRouter._current.route;
FlowRouter._current.route = undefined;
var success = FlowRouter.setQueryParams({id: "800"});
test.isFalse(success);
FlowRouter._current.route = originalRoute;
});
Tinytest.addAsync('Client - Router - notFound', function (test, done) {
var data = [];
FlowRouter.notFound = {
subscriptions: function() {
data.push("subscriptions");
},
action: function() {
data.push("action");
}
};
FlowRouter.go("/" + Random.id());
setTimeout(function() {
test.equal(data, ["subscriptions", "action"]);
done();
}, 50);
});
Tinytest.addAsync('Client - Router - withReplaceState - enabled',
function (test, done) {
var pathDef = "/" + Random.id() + "/:id";
var originalRedirect = FlowRouter._page.replace;
var callCount = 0;
FlowRouter._page.replace = function(path) {
callCount++;
originalRedirect.call(FlowRouter._page, path);
};
FlowRouter.route(pathDef, {
name: name,
action: function(params) {
test.equal(params.id, "awesome");
test.equal(callCount, 1);
FlowRouter._page.replace = originalRedirect;
// We don't use Meteor.defer here since it carries
// Meteor.Environment vars too
// Which breaks our test below
setTimeout(done, 0);
}
});
FlowRouter.withReplaceState(function() {
FlowRouter.go(pathDef, {id: "awesome"});
});
});
Tinytest.addAsync('Client - Router - withReplaceState - disabled',
function (test, done) {
var pathDef = "/" + Random.id() + "/:id";
var originalRedirect = FlowRouter._page.replace;
var callCount = 0;
FlowRouter._page.replace = function(path) {
callCount++;
originalRedirect.call(FlowRouter._page, path);
};
FlowRouter.route(pathDef, {
name: name,
action: function(params) {
test.equal(params.id, "awesome");
test.equal(callCount, 0);
FlowRouter._page.replace = originalRedirect;
Meteor.defer(done);
}
});
FlowRouter.go(pathDef, {id: "awesome"});
});
Tinytest.addAsync('Client - Router - withTrailingSlash - enabled', function (test, next) {
var rand = Random.id();
var rendered = 0;
FlowRouter.route('/' + rand, {
action: function(_params) {
rendered++;
}
});
FlowRouter.withTrailingSlash(function() {
FlowRouter.go('/' + rand);
});
setTimeout(function() {
test.equal(rendered, 1);
test.equal(_.last(location.href), '/');
setTimeout(next, 100);
}, 100);
});
Tinytest.addAsync('Client - Router - idempotent routing - action',
function (test, done) {
var rand = Random.id();
var pathDef = "/" + rand;
var rendered = 0;
FlowRouter.route(pathDef, {
action: function(params) {
rendered++;
}
});
FlowRouter.go(pathDef);
Meteor.defer(function() {
FlowRouter.go(pathDef);
Meteor.defer(function() {
test.equal(rendered, 1);
done();
});
});
});
Tinytest.addAsync('Client - Router - idempotent routing - triggers',
function (test, next) {
var rand = Random.id();
var pathDef = "/" + rand;
var runnedTriggers = 0;
var done = false;
var triggerFns = [function(params) {
if (done) return;
runnedTriggers++;
}];
FlowRouter.triggers.enter(triggerFns);
FlowRouter.route(pathDef, {
triggersEnter: triggerFns,
triggersExit: triggerFns
});
FlowRouter.go(pathDef);
FlowRouter.triggers.exit(triggerFns);
Meteor.defer(function() {
FlowRouter.go(pathDef);
Meteor.defer(function() {
test.equal(runnedTriggers, 2);
done = true;
next();
});
});
});
Tinytest.addAsync('Client - Router - reload - action',
function (test, done) {
var rand = Random.id();
var pathDef = "/" + rand;
var rendered = 0;
FlowRouter.route(pathDef, {
action: function(params) {
rendered++;
}
});
FlowRouter.go(pathDef);
Meteor.defer(function() {
FlowRouter.reload();
Meteor.defer(function() {
test.equal(rendered, 2);
done();
});
});
});
Tinytest.addAsync('Client - Router - reload - triggers',
function (test, next) {
var rand = Random.id();
var pathDef = "/" + rand;
var runnedTriggers = 0;
var done = false;
var triggerFns = [function(params) {
if (done) return;
runnedTriggers++;
}];
FlowRouter.triggers.enter(triggerFns);
FlowRouter.route(pathDef, {
triggersEnter: triggerFns,
triggersExit: triggerFns
});
FlowRouter.go(pathDef);
FlowRouter.triggers.exit(triggerFns);
Meteor.defer(function() {
FlowRouter.reload();
Meteor.defer(function() {
test.equal(runnedTriggers, 6);
done = true;
next();
});
});
});
Tinytest.addAsync(
'Client - Router - wait - before initialize',
function(test, done) {
FlowRouter._initialized = false;
FlowRouter.wait();
test.equal(FlowRouter._askedToWait, true);
FlowRouter._initialized = true;
FlowRouter._askedToWait = false;
done();
});
Tinytest.addAsync(
'Client - Router - wait - after initialized',
function(test, done) {
try {
FlowRouter.wait();
} catch(ex) {
test.isTrue(/can't wait/.test(ex.message));
done();
}
});
Tinytest.addAsync(
'Client - Router - initialize - after initialized',
function(test, done) {
try {
FlowRouter.initialize();
} catch(ex) {
test.isTrue(/already initialized/.test(ex.message));
done();
}
});
Tinytest.addAsync(
'Client - Router - base path - url updated',
function(test, done) {
var simulatedBasePath = '/flow';
var rand = Random.id();
FlowRouter.route('/' + rand, { action: function() {} });
setBasePath(simulatedBasePath);
FlowRouter.go('/' + rand);
setTimeout(function() {
test.equal(location.pathname, simulatedBasePath + '/' + rand);
resetBasePath();
done();
}, 100);
});
Tinytest.addAsync(
'Client - Router - base path - route action called',
function(test, done) {
var simulatedBasePath = '/flow';
var rand = Random.id();
FlowRouter.route('/' + rand, {
action: function() {
resetBasePath();
done();
}
});
setBasePath(simulatedBasePath);
FlowRouter.go('/' + rand);
});
Tinytest.add(
'Client - Router - base path - path generation',
function(test, done) {
_.each(['/flow', '/flow/', 'flow/', 'flow'], function(simulatedBasePath) {
var rand = Random.id();
setBasePath(simulatedBasePath);
test.equal(FlowRouter.path('/' + rand), '/flow/' + rand);
});
resetBasePath();
});
function setBasePath(path) {
FlowRouter._initialized = false;
FlowRouter._basePath = path;
FlowRouter.initialize();
}
var defaultBasePath = FlowRouter._basePath;
function resetBasePath() {
setBasePath(defaultBasePath);
}
function bind(obj, method) {
return function() {
obj[method].apply(obj, arguments);
};
}