summaryrefslogtreecommitdiffstats
path: root/packages/kadira-flow-router/test/client/router.core.spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/kadira-flow-router/test/client/router.core.spec.js')
-rw-r--r--packages/kadira-flow-router/test/client/router.core.spec.js632
1 files changed, 632 insertions, 0 deletions
diff --git a/packages/kadira-flow-router/test/client/router.core.spec.js b/packages/kadira-flow-router/test/client/router.core.spec.js
new file mode 100644
index 00000000..160c9112
--- /dev/null
+++ b/packages/kadira-flow-router/test/client/router.core.spec.js
@@ -0,0 +1,632 @@
+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);
+ };
+}