Index: third_party/pkg/route_hierarchical/test/client_test.dart |
diff --git a/third_party/pkg/route_hierarchical/test/client_test.dart b/third_party/pkg/route_hierarchical/test/client_test.dart |
deleted file mode 100644 |
index fc63fe750c0d4109d1fab8a114e5685f26ba5886..0000000000000000000000000000000000000000 |
--- a/third_party/pkg/route_hierarchical/test/client_test.dart |
+++ /dev/null |
@@ -1,1025 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library route.client_test; |
- |
-import 'dart:async'; |
-import 'dart:html'; |
- |
-import 'package:unittest/unittest.dart'; |
-import 'package:mock/mock.dart'; |
-import 'package:route_hierarchical/client.dart'; |
-import 'package:route_hierarchical/url_pattern.dart'; |
- |
-import 'util/mocks.dart'; |
- |
-main() { |
- unittestConfiguration.timeout = new Duration(seconds: 1); |
- |
- test('paths are routed to routes added with addRoute', () { |
- var router = new Router(); |
- router.root.addRoute( |
- name: 'foo', |
- path: '/foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/foo'); |
- expect(router.root.findRoute('foo').isActive, isTrue); |
- })); |
- return router.route('/foo'); |
- }); |
- |
- group('use a longer path first', () { |
- |
- test('add a longer path first', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foobar', |
- path: '/foo/bar', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/foo/bar'); |
- expect(router.root.findRoute('foobar').isActive, isTrue); |
- })) |
- ..addRoute( |
- name: 'foo', |
- path: '/foo', |
- enter: (e) => fail('should invoke /foo/bar')); |
- return router.route('/foo/bar'); |
- }); |
- |
- test('add a longer path last', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/foo', |
- enter: (e) => fail('should invoke /foo/bar')) |
- ..addRoute( |
- name: 'foobar', |
- path: '/foo/bar', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/foo/bar'); |
- expect(router.root.findRoute('foobar').isActive, isTrue); |
- })); |
- return router.route('/foo/bar'); |
- }); |
- |
- test('add paths with a param', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/foo', |
- enter: (e) => fail('should invoke /foo/bar')) |
- ..addRoute( |
- name: 'fooparam', |
- path: '/foo/:param', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/foo/bar'); |
- expect(router.root.findRoute('fooparam').isActive, isTrue); |
- })); |
- return router.route('/foo/bar'); |
- }); |
- |
- test('add paths with a parametalized parent', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'paramaddress', |
- path: '/:zzzzzz/address', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/foo/address'); |
- expect(router.root.findRoute('paramaddress').isActive, isTrue); |
- })) |
- ..addRoute( |
- name: 'param_add', |
- path: '/:aaaaaa/add', |
- enter: (e) => fail('should invoke /foo/address')); |
- return router.route('/foo/address'); |
- }); |
- |
- test('add paths with a first param and one without', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'fooparam', |
- path: '/:param/foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/bar/foo'); |
- expect(router.root.findRoute('fooparam').isActive, isTrue); |
- })) |
- ..addRoute( |
- name: 'bar', |
- path: '/bar', |
- enter: (e) => fail('should enter fooparam')); |
- return router.route('/bar/foo'); |
- }); |
- |
- test('add paths with a first param and one without 2', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'paramfoo', |
- path: '/:param/foo', |
- enter: (e) => fail('should enter barfoo')) |
- ..addRoute( |
- name: 'barfoo', |
- path: '/bar/foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/bar/foo'); |
- expect(router.root.findRoute('barfoo').isActive, isTrue); |
- })) |
- ; |
- return router.route('/bar/foo'); |
- }); |
- |
- test('add paths with a second param and one without', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'bazparamfoo', |
- path: '/baz/:param/foo', |
- enter: (e) => fail('should enter bazbarfoo')) |
- ..addRoute( |
- name: 'bazbarfoo', |
- path: '/baz/bar/foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/baz/bar/foo'); |
- expect(router.root.findRoute('bazbarfoo').isActive, isTrue); |
- })) |
- ; |
- return router.route('/baz/bar/foo'); |
- }); |
- |
- test('add paths with a first param and a second param', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'parambarfoo', |
- path: '/:param/bar/foo', |
- enter: (e) => fail('should enter bazparamfoo')) |
- ..addRoute( |
- name: 'bazparamfoo', |
- path: '/baz/:param/foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/baz/bar/foo'); |
- expect(router.root.findRoute('bazparamfoo').isActive, isTrue); |
- })) |
- ; |
- return router.route('/baz/bar/foo'); |
- }); |
- |
- test('add paths with two params and a param', () { |
- Router router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'param1param2foo', |
- path: '/:param1/:param2/foo', |
- enter: (e) => fail('should enter bazparamfoo')) |
- ..addRoute( |
- name: 'param1barfoo', |
- path: '/:param1/bar/foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, '/baz/bar/foo'); |
- expect(router.root.findRoute('param1barfoo').isActive, isTrue); |
- })) |
- ; |
- return router.route('/baz/bar/foo'); |
- }); |
- }); |
- |
- group('hierarchical routing', () { |
- |
- void _testParentChild( |
- Pattern parentPath, |
- Pattern childPath, |
- String expectedParentPath, |
- String expectedChildPath, |
- String testPath) { |
- var router = new Router(); |
- router.root.addRoute( |
- name: 'parent', |
- path: parentPath, |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, expectedParentPath); |
- expect(e.route, isNotNull); |
- expect(e.route.name, 'parent'); |
- }), |
- mount: (Route child) { |
- child.addRoute( |
- name: 'child', |
- path: childPath, |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, expectedChildPath); |
- })); |
- }); |
- router.route(testPath); |
- } |
- |
- test('child router with UrlPattern', () { |
- _testParentChild( |
- new UrlPattern(r'/foo/(\w+)'), |
- new UrlPattern(r'/bar'), |
- '/foo/abc', |
- '/bar', |
- '/foo/abc/bar'); |
- }); |
- |
- test('child router with Strings', () { |
- _testParentChild( |
- '/foo', |
- '/bar', |
- '/foo', |
- '/bar', |
- '/foo/bar'); |
- }); |
- |
- }); |
- |
- group('leave', () { |
- |
- test('should leave previous route and enter new', () { |
- var counters = <String, int>{ |
- 'fooPreEnter': 0, |
- 'fooEnter': 0, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0, |
- 'bazPreEnter': 0, |
- 'bazEnter': 0, |
- 'bazLeave': 0 |
- }; |
- var router = new Router(); |
- router.root |
- ..addRoute(path: '/foo', |
- name: 'foo', |
- preEnter: (_) => counters['fooPreEnter']++, |
- enter: (_) => counters['fooEnter']++, |
- leave: (_) => counters['fooLeave']++, |
- mount: (Route route) => route |
- ..addRoute(path: '/bar', |
- name: 'bar', |
- preEnter: (_) => counters['barPreEnter']++, |
- enter: (_) => counters['barEnter']++, |
- leave: (_) => counters['barLeave']++) |
- ..addRoute(path: '/baz', |
- name: 'baz', |
- preEnter: (_) => counters['bazPreEnter']++, |
- enter: (_) => counters['bazEnter']++, |
- leave: (_) => counters['bazLeave']++)); |
- |
- expect(counters, { |
- 'fooPreEnter': 0, |
- 'fooEnter': 0, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0, |
- 'bazPreEnter': 0, |
- 'bazEnter': 0, |
- 'bazLeave': 0 |
- }); |
- |
- router.route('/foo/bar').then(expectAsync((_) { |
- expect(counters, { |
- 'fooPreEnter': 1, |
- 'fooEnter': 1, |
- 'fooLeave': 0, |
- 'barPreEnter': 1, |
- 'barEnter': 1, |
- 'barLeave': 0, |
- 'bazPreEnter': 0, |
- 'bazEnter': 0, |
- 'bazLeave': 0 |
- }); |
- |
- router.route('/foo/baz').then(expectAsync((_) { |
- expect(counters, { |
- 'fooPreEnter': 1, |
- 'fooEnter': 1, |
- 'fooLeave': 0, |
- 'barPreEnter': 1, |
- 'barEnter': 1, |
- 'barLeave': 1, |
- 'bazPreEnter': 1, |
- 'bazEnter': 1, |
- 'bazLeave': 0 |
- }); |
- })); |
- })); |
- }); |
- |
- void _testAllowLeave(bool allowLeave) { |
- var completer = new Completer<bool>(); |
- bool barEntered = false; |
- bool bazEntered = false; |
- |
- var router = new Router(); |
- router.root |
- ..addRoute(name: 'foo', path: '/foo', |
- mount: (Route child) => child |
- ..addRoute(name: 'bar', path: '/bar', |
- enter: (RouteEnterEvent e) => barEntered = true, |
- leave: (RouteLeaveEvent e) => e.allowLeave(completer.future)) |
- ..addRoute(name: 'baz', path: '/baz', |
- enter: (RouteEnterEvent e) => bazEntered = true)); |
- |
- router.route('/foo/bar').then(expectAsync((_) { |
- expect(barEntered, true); |
- expect(bazEntered, false); |
- router.route('/foo/baz').then(expectAsync((_) { |
- expect(bazEntered, allowLeave); |
- })); |
- completer.complete(allowLeave); |
- })); |
- } |
- |
- test('should allow navigation', () { |
- _testAllowLeave(true); |
- }); |
- |
- test('should veto navigation', () { |
- _testAllowLeave(false); |
- }); |
- }); |
- |
- group('preEnter', () { |
- |
- void _testAllowEnter(bool allowEnter) { |
- var completer = new Completer<bool>(); |
- bool barEntered = false; |
- |
- var router = new Router(); |
- router.root |
- ..addRoute(name: 'foo', path: '/foo', |
- mount: (Route child) => child |
- ..addRoute(name: 'bar', path: '/bar', |
- enter: (RouteEnterEvent e) => barEntered = true, |
- preEnter: (RoutePreEnterEvent e) => |
- e.allowEnter(completer.future))); |
- |
- router.route('/foo/bar').then(expectAsync((_) { |
- expect(barEntered, allowEnter); |
- })); |
- completer.complete(allowEnter); |
- } |
- |
- test('should allow navigation', () { |
- _testAllowEnter(true); |
- }); |
- |
- test('should veto navigation', () { |
- _testAllowEnter(false); |
- }); |
- |
- test('should allow prevent leaving on parameter changes', () { |
- var counters = <String, int>{ |
- 'fooPreEnter': 0, |
- 'fooEnter': 0, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0 |
- }; |
- var router = new Router(); |
- router.root |
- ..addRoute(path: r'/foo/:param', |
- name: 'foo', |
- preEnter: (_) => counters['fooPreEnter']++, |
- enter: (_) => counters['fooEnter']++, |
- leave: (_) => counters['fooLeave']++, |
- dontLeaveOnParamChanges: true) |
- ..addRoute(path: '/bar', |
- name: 'bar', |
- preEnter: (_) => counters['barPreEnter']++, |
- enter: (_) => counters['barEnter']++, |
- leave: (_) => counters['barLeave']++); |
- |
- expect(counters, { |
- 'fooPreEnter': 0, |
- 'fooEnter': 0, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0 |
- }); |
- |
- router.route('/foo/bar').then(expectAsync((_) { |
- expect(counters, { |
- 'fooPreEnter': 1, |
- 'fooEnter': 1, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0 |
- }); |
- |
- router.route('/foo/bar').then(expectAsync((_) { |
- expect(counters, { |
- 'fooPreEnter': 1, |
- 'fooEnter': 1, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0 |
- }); |
- |
- router.route('/foo/baz').then(expectAsync((_) { |
- expect(counters, { |
- 'fooPreEnter': 2, |
- 'fooEnter': 2, |
- 'fooLeave': 0, |
- 'barPreEnter': 0, |
- 'barEnter': 0, |
- 'barLeave': 0 |
- }); |
- |
- router.route('/bar').then(expectAsync((_) { |
- expect(counters, { |
- 'fooPreEnter': 2, |
- 'fooEnter': 2, |
- 'fooLeave': 1, |
- 'barPreEnter': 1, |
- 'barEnter': 1, |
- 'barLeave': 0 |
- }); |
- })); |
- })); |
- })); |
- })); |
- }); |
- }); |
- |
- group('Default route', () { |
- |
- void _testHeadTail(String path, String expectFoo, String expectBar) { |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/foo', |
- defaultRoute: true, |
- enter: expectAsync((RouteEvent e) { |
- expect(e.path, expectFoo); |
- }), |
- mount: (child) => child |
- ..addRoute( |
- name: 'bar', |
- path: '/bar', |
- defaultRoute: true, |
- enter: expectAsync((RouteEvent e) => |
- expect(e.path, expectBar)))); |
- |
- router.route(path); |
- } |
- |
- test('should calculate head/tail of empty route', () { |
- _testHeadTail('', '', ''); |
- }); |
- |
- test('should calculate head/tail of partial route', () { |
- _testHeadTail('/foo', '/foo', ''); |
- }); |
- |
- test('should calculate head/tail of a route', () { |
- _testHeadTail('/foo/bar', '/foo', '/bar'); |
- }); |
- |
- test('should calculate head/tail of an invalid parent route', () { |
- _testHeadTail('/garbage/bar', '', ''); |
- }); |
- |
- test('should calculate head/tail of an invalid child route', () { |
- _testHeadTail('/foo/garbage', '/foo', ''); |
- }); |
- |
- test('should follow default routes', () { |
- var counters = <String, int>{ |
- 'list_entered': 0, |
- 'article_123_entered': 0, |
- 'article_123_view_entered': 0, |
- 'article_123_edit_entered': 0 |
- }; |
- |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'articles', |
- path: '/articles', |
- defaultRoute: true, |
- enter: (_) => counters['list_entered']++) |
- ..addRoute( |
- name: 'article', |
- path: '/article/123', |
- enter: (_) => counters['article_123_entered']++, |
- mount: (Route child) => child |
- ..addRoute( |
- name: 'viewArticles', |
- path: '/view', |
- defaultRoute: true, |
- enter: (_) => counters['article_123_view_entered']++) |
- ..addRoute( |
- name: 'editArticles', |
- path: '/edit', |
- enter: (_) => counters['article_123_edit_entered']++)); |
- |
- router.route('').then((_) { |
- expect(counters, { |
- 'list_entered': 1, // default to list |
- 'article_123_entered': 0, |
- 'article_123_view_entered': 0, |
- 'article_123_edit_entered': 0 |
- }); |
- router.route('/articles').then((_) { |
- expect(counters, { |
- 'list_entered': 2, |
- 'article_123_entered': 0, |
- 'article_123_view_entered': 0, |
- 'article_123_edit_entered': 0 |
- }); |
- router.route('/article/123').then((_) { |
- expect(counters, { |
- 'list_entered': 2, |
- 'article_123_entered': 1, |
- 'article_123_view_entered': 1, // default to view |
- 'article_123_edit_entered': 0 |
- }); |
- router.route('/article/123/view').then((_) { |
- expect(counters, { |
- 'list_entered': 2, |
- 'article_123_entered': 1, |
- 'article_123_view_entered': 2, |
- 'article_123_edit_entered': 0 |
- }); |
- router.route('/article/123/edit').then((_) { |
- expect(counters, { |
- 'list_entered': 2, |
- 'article_123_entered': 1, |
- 'article_123_view_entered': 2, |
- 'article_123_edit_entered': 1 |
- }); |
- }); |
- }); |
- }); |
- }); |
- }); |
- }); |
- |
- }); |
- |
- group('go', () { |
- |
- test('shoud use location.assign/.replace when useFragment=true', () { |
- var mockWindow = new MockWindow(); |
- var router = new Router(useFragment: true, windowImpl: mockWindow); |
- router.root.addRoute(name: 'articles', path: '/articles'); |
- |
- router.go('articles', {}).then(expectAsync((_) { |
- var mockLocation = mockWindow.location; |
- |
- mockLocation.getLogs(callsTo('assign', anything)) |
- .verify(happenedExactly(1)); |
- expect(mockLocation.getLogs(callsTo('assign', anything)).last.args, |
- ['#/articles']); |
- mockLocation.getLogs(callsTo('replace', anything)) |
- .verify(happenedExactly(0)); |
- |
- router.go('articles', {}, replace: true).then(expectAsync((_) { |
- mockLocation.getLogs(callsTo('replace', anything)) |
- .verify(happenedExactly(1)); |
- expect(mockLocation.getLogs(callsTo('replace', anything)).last.args, |
- ['#/articles']); |
- mockLocation.getLogs(callsTo('assign', anything)) |
- .verify(happenedExactly(1)); |
- })); |
- })); |
- }); |
- |
- test('shoud use history.push/.replaceState when useFragment=false', () { |
- var mockWindow = new MockWindow(); |
- var router = new Router(useFragment: false, windowImpl: mockWindow); |
- router.root.addRoute(name: 'articles', path: '/articles'); |
- |
- router.go('articles', {}).then(expectAsync((_) { |
- var mockHistory = mockWindow.history; |
- |
- mockHistory.getLogs(callsTo('pushState', anything)) |
- .verify(happenedExactly(1)); |
- expect(mockHistory.getLogs(callsTo('pushState', anything)).last.args, |
- [null, '', '/articles']); |
- mockHistory.getLogs(callsTo('replaceState', anything)) |
- .verify(happenedExactly(0)); |
- |
- router.go('articles', {}, replace: true).then(expectAsync((_) { |
- mockHistory.getLogs(callsTo('replaceState', anything)) |
- .verify(happenedExactly(1)); |
- expect(mockHistory.getLogs(callsTo('replaceState', anything)).last.args, |
- [null, '', '/articles']); |
- mockHistory.getLogs(callsTo('pushState', anything)) |
- .verify(happenedExactly(1)); |
- })); |
- })); |
- }); |
- |
- test('should work with hierarchical go', () { |
- var mockWindow = new MockWindow(); |
- var router = new Router(windowImpl: mockWindow); |
- router.root |
- ..addRoute( |
- name: 'a', |
- path: '/:foo', |
- mount: (child) => child |
- ..addRoute( |
- name: 'b', |
- path: '/:bar')); |
- |
- var routeA = router.root.findRoute('a'); |
- |
- router.go('a.b', {}).then(expectAsync((_) { |
- var mockHistory = mockWindow.history; |
- |
- mockHistory.getLogs(callsTo('pushState', anything)) |
- .verify(happenedExactly(1)); |
- expect(mockHistory.getLogs(callsTo('pushState', anything)).last.args, |
- [null, '', '/null/null']); |
- |
- router.go('a.b', {'foo': 'aaaa', 'bar': 'bbbb'}).then(expectAsync((_) { |
- mockHistory.getLogs(callsTo('pushState', anything)) |
- .verify(happenedExactly(2)); |
- expect(mockHistory.getLogs(callsTo('pushState', anything)).last.args, |
- [null, '', '/aaaa/bbbb']); |
- |
- router.go('b', {'bar': 'bbbb'}, startingFrom: routeA) |
- .then(expectAsync((_) { |
- mockHistory.getLogs(callsTo('pushState', anything)) |
- .verify(happenedExactly(3)); |
- expect( |
- mockHistory.getLogs(callsTo('pushState')).last.args, |
- [null, '', '/aaaa/bbbb']); |
- })); |
- })); |
- })); |
- |
- }); |
- |
- test('should attempt to reverse default routes', () { |
- var counters = <String, int>{ |
- 'aEnter': 0, |
- 'bEnter': 0 |
- }; |
- |
- var mockWindow = new MockWindow(); |
- var router = new Router(windowImpl: mockWindow); |
- router.root |
- ..addRoute( |
- name: 'a', |
- defaultRoute: true, |
- path: '/:foo', |
- enter: (_) => counters['aEnter']++, |
- mount: (child) => child |
- ..addRoute( |
- name: 'b', |
- defaultRoute: true, |
- path: '/:bar', |
- enter: (_) => counters['bEnter']++)); |
- |
- expect(counters, { |
- 'aEnter': 0, |
- 'bEnter': 0 |
- }); |
- |
- router.route('').then((_) { |
- expect(counters, { |
- 'aEnter': 1, |
- 'bEnter': 1 |
- }); |
- |
- var routeA = router.root.findRoute('a'); |
- router.go('b', {'bar': 'bbb'}, startingFrom: routeA).then((_) { |
- var mockHistory = mockWindow.history; |
- |
- mockHistory.getLogs(callsTo('pushState', anything)) |
- .verify(happenedExactly(1)); |
- expect(mockHistory.getLogs(callsTo('pushState', anything)).last.args, |
- [null, '', '/null/bbb']); |
- }); |
- }); |
- }); |
- |
- }); |
- |
- group('url', () { |
- |
- test('should reconstruct url', () { |
- var mockWindow = new MockWindow(); |
- var router = new Router(windowImpl: mockWindow); |
- router.root |
- ..addRoute( |
- name: 'a', |
- defaultRoute: true, |
- path: '/:foo', |
- mount: (child) => child |
- ..addRoute( |
- name: 'b', |
- defaultRoute: true, |
- path: '/:bar')); |
- |
- var routeA = router.root.findRoute('a'); |
- |
- router.route('').then((_) { |
- expect(router.url('a.b'), '/null/null'); |
- expect(router.url('a.b', parameters: {'foo': 'aaa'}), '/aaa/null'); |
- expect(router.url('b', parameters: {'bar': 'bbb'}, |
- startingFrom: routeA), '/null/bbb'); |
- |
- router.route('/foo/bar').then((_) { |
- expect(router.url('a.b'), '/foo/bar'); |
- expect(router.url('a.b', parameters: {'foo': 'aaa'}), '/aaa/bar'); |
- expect(router.url('b', parameters: {'bar': 'bbb'}, |
- startingFrom: routeA), '/foo/bbb'); |
- expect(router.url('b', parameters: {'foo': 'aaa', 'bar': 'bbb'}, |
- startingFrom: routeA), '/foo/bbb'); |
- |
- expect(router.url('b', parameters: {'bar': 'bbb', 'b.param1': 'val1'}, |
- startingFrom: routeA), '/foo/bbb?b.param1=val1'); |
- |
- }); |
- }); |
- }); |
- |
- }); |
- |
- group('findRoute', () { |
- |
- test('should return correct routes', () { |
- Route routeFoo, routeBar, routeBaz, routeQux, routeAux; |
- |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/:foo', |
- mount: (child) => routeFoo = child |
- ..addRoute( |
- name: 'bar', |
- path: '/:bar', |
- mount: (child) => routeBar = child |
- ..addRoute( |
- name: 'baz', |
- path: '/:baz', |
- mount: (child) => routeBaz = child)) |
- ..addRoute( |
- name: 'qux', |
- path: '/:qux', |
- mount: (child) => routeQux = child |
- ..addRoute( |
- name: 'aux', |
- path: '/:aux', |
- mount: (child) => routeAux = child))); |
- |
- expect(router.root.findRoute('foo'), same(routeFoo)); |
- expect(router.root.findRoute('foo.bar'), same(routeBar)); |
- expect(routeFoo.findRoute('bar'), same(routeBar)); |
- expect(router.root.findRoute('foo.bar.baz'), same(routeBaz)); |
- expect(router.root.findRoute('foo.qux'), same(routeQux)); |
- expect(router.root.findRoute('foo.qux.aux'), same(routeAux)); |
- expect(routeQux.findRoute('aux'), same(routeAux)); |
- expect(routeFoo.findRoute('qux.aux'), same(routeAux)); |
- |
- expect(router.root.findRoute('baz'), isNull); |
- expect(router.root.findRoute('foo.baz'), isNull); |
- }); |
- |
- }); |
- |
- group('route', () { |
- |
- test('should parse query', () { |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/:foo', |
- enter: expectAsync((RouteEvent e) { |
- expect(e.parameters, { |
- 'foo': '123', |
- 'a': 'b', |
- 'b': '', |
- 'c': 'foo bar' |
- }); |
- })); |
- |
- router.route('/123?foo.a=b&foo.b=&foo.c=foo%20bar&foo.=ignore'); |
- }); |
- |
- group('isActive', () { |
- |
- test('should currectly identify active/inactive routes', () { |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/foo', |
- mount: (child) => child |
- ..addRoute( |
- name: 'bar', |
- path: '/bar', |
- mount: (child) => child |
- ..addRoute( |
- name: 'baz', |
- path: '/baz', |
- mount: (child) => child)) |
- ..addRoute( |
- name: 'qux', |
- path: '/qux', |
- mount: (child) => child |
- ..addRoute( |
- name: 'aux', |
- path: '/aux', |
- mount: (child) => child))); |
- |
- expect(r(router, 'foo').isActive, false); |
- expect(r(router, 'foo.bar').isActive, false); |
- expect(r(router, 'foo.bar.baz').isActive, false); |
- expect(r(router, 'foo.qux').isActive, false); |
- |
- return router.route('/foo').then((_) { |
- expect(r(router, 'foo').isActive, true); |
- expect(r(router, 'foo.bar').isActive, false); |
- expect(r(router, 'foo.bar.baz').isActive, false); |
- expect(r(router, 'foo.qux').isActive, false); |
- |
- return router.route('/foo/qux').then((_) { |
- expect(r(router, 'foo').isActive, true); |
- expect(r(router, 'foo.bar').isActive, false); |
- expect(r(router, 'foo.bar.baz').isActive, false); |
- expect(r(router, 'foo.qux').isActive, true); |
- |
- return router.route('/foo/bar/baz').then((_) { |
- expect(r(router, 'foo').isActive, true); |
- expect(r(router, 'foo.bar').isActive, true); |
- expect(r(router, 'foo.bar.baz').isActive, true); |
- expect(r(router, 'foo.qux').isActive, false); |
- }); |
- }); |
- }); |
- }); |
- |
- }); |
- |
- group('parameters', () { |
- |
- test('should return path parameters for routes', () { |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/:foo', |
- mount: (child) => child |
- ..addRoute( |
- name: 'bar', |
- path: '/:bar', |
- mount: (child) => child |
- ..addRoute( |
- name: 'baz', |
- path: '/:baz', |
- mount: (child) => child))); |
- |
- expect(r(router, 'foo').parameters, isNull); |
- expect(r(router, 'foo.bar').parameters, isNull); |
- expect(r(router, 'foo.bar.baz').parameters, isNull); |
- |
- return router.route('/aaa').then((_) { |
- expect(r(router, 'foo').parameters, {'foo': 'aaa'}); |
- expect(r(router, 'foo.bar').parameters, isNull); |
- expect(r(router, 'foo.bar.baz').parameters, isNull); |
- |
- return router.route('/aaa/bbb').then((_) { |
- expect(r(router, 'foo').parameters, {'foo': 'aaa'}); |
- expect(r(router, 'foo.bar').parameters, {'bar': 'bbb'}); |
- expect(r(router, 'foo.bar.baz').parameters, isNull); |
- |
- return router.route('/aaa/bbb/ccc').then((_) { |
- expect(r(router, 'foo').parameters, {'foo': 'aaa'}); |
- expect(r(router, 'foo.bar').parameters, {'bar': 'bbb'}); |
- expect(r(router, 'foo.bar.baz').parameters, {'baz': 'ccc'}); |
- }); |
- }); |
- }); |
- }); |
- |
- }); |
- |
- }); |
- |
- group('activePath', () { |
- |
- test('should currectly identify active path', () { |
- var router = new Router(); |
- router.root |
- ..addRoute( |
- name: 'foo', |
- path: '/foo', |
- mount: (child) => child |
- ..addRoute( |
- name: 'bar', |
- path: '/bar', |
- mount: (child) => child |
- ..addRoute( |
- name: 'baz', |
- path: '/baz', |
- mount: (child) => child)) |
- ..addRoute( |
- name: 'qux', |
- path: '/qux', |
- mount: (child) => child |
- ..addRoute( |
- name: 'aux', |
- path: '/aux', |
- mount: (child) => child))); |
- |
- var strPath = (List<Route> path) => |
- path.map((Route r) => r.name).join('.'); |
- |
- expect(strPath(router.activePath), ''); |
- |
- return router.route('/foo').then((_) { |
- expect(strPath(router.activePath), 'foo'); |
- |
- return router.route('/foo/qux').then((_) { |
- expect(strPath(router.activePath), 'foo.qux'); |
- |
- return router.route('/foo/bar/baz').then((_) { |
- expect(strPath(router.activePath), 'foo.bar.baz'); |
- }); |
- }); |
- }); |
- }); |
- |
- }); |
- |
- group('listen', () { |
- |
- group('fragment', () { |
- |
- test('shoud route current hash on listen', () { |
- var mockWindow = new MockWindow(); |
- var mockHashChangeController = new StreamController<Event>(sync: true); |
- |
- mockWindow.when(callsTo('get onHashChange')) |
- .alwaysReturn(mockHashChangeController.stream); |
- mockWindow.location.when(callsTo('get hash')).alwaysReturn('#/foo'); |
- var router = new Router(useFragment: true, windowImpl: mockWindow); |
- router.root.addRoute(name: 'foo', path: '/foo'); |
- router.onRouteStart.listen(expectAsync((RouteStartEvent start) { |
- start.completed.then(expectAsync((_) { |
- expect(router.findRoute('foo').isActive, isTrue); |
- })); |
- }, count: 1)); |
- router.listen(ignoreClick: true); |
- }); |
- |
- }); |
- |
- group('pushState', () { |
- |
- testInit(mockWindow, [count = 1]) { |
- mockWindow.location.when(callsTo('get hash')).alwaysReturn(''); |
- mockWindow.location.when(callsTo('get pathname')).alwaysReturn('/foo'); |
- var router = new Router(useFragment: false, windowImpl: mockWindow); |
- router.root.addRoute(name: 'foo', path: '/foo'); |
- router.onRouteStart.listen(expectAsync((RouteStartEvent start) { |
- start.completed.then(expectAsync((_) { |
- expect(router.findRoute('foo').isActive, isTrue); |
- })); |
- }, count: count)); |
- router.listen(ignoreClick: true); |
- } |
- |
- test('shoud route current path on listen with pop', () { |
- var mockWindow = new MockWindow(); |
- var mockPopStateController = new StreamController<Event>(sync: true); |
- mockWindow.when(callsTo('get onPopState')) |
- .alwaysReturn(mockPopStateController.stream); |
- testInit(mockWindow, 2); |
- mockPopStateController.add(null); |
- }); |
- |
- test('shoud route current path on listen without pop', () { |
- var mockWindow = new MockWindow(); |
- var mockPopStateController = new StreamController<Event>(sync: true); |
- mockWindow.when(callsTo('get onPopState')) |
- .alwaysReturn(mockPopStateController.stream); |
- testInit(mockWindow); |
- }); |
- |
- }); |
- |
- }); |
- |
-} |
- |
-/// An alias for Router.root.findRoute(path) |
-r(Router router, String path) => router.root.findRoute(path); |