| OLD | NEW |
| 1 import 'dart:async'; | 1 import 'dart:async'; |
| 2 import 'dart:html'; |
| 2 | 3 |
| 3 import 'package:unittest/unittest.dart'; | 4 import 'package:unittest/unittest.dart'; |
| 4 import 'package:unittest/mock.dart'; | 5 import 'package:unittest/mock.dart'; |
| 6 import 'package:unittest/html_enhanced_config.dart'; |
| 5 import 'package:route_hierarchical/client.dart'; | 7 import 'package:route_hierarchical/client.dart'; |
| 6 import 'package:route_hierarchical/url_pattern.dart'; | 8 import 'package:route_hierarchical/url_pattern.dart'; |
| 7 | 9 |
| 8 import 'mocks.dart'; | 10 import 'mocks.dart'; |
| 9 | 11 |
| 10 main() { | 12 main() { |
| 11 unittestConfiguration.timeout = new Duration(seconds: 1); | 13 useHtmlEnhancedConfiguration(); |
| 12 | 14 |
| 13 test('paths are routed to routes added with addRoute', () { | 15 test('paths are routed to routes added with addRoute', () { |
| 14 Router router = new Router(); | 16 Router router = new Router(); |
| 15 router.root.addRoute( | 17 router.root.addRoute( |
| 16 name: 'foo', | 18 name: 'foo', |
| 17 path: '/foo', | 19 path: '/foo', |
| 18 enter: expectAsync1((RouteEvent e) { | 20 enter: expectAsync1((RouteEvent e) { |
| 19 expect(e.path, '/foo'); | 21 expect(e.path, '/foo'); |
| 20 expect(router.root.getRoute('foo').isActive, isTrue); | |
| 21 })); | 22 })); |
| 22 return router.route('/foo'); | 23 router.route('/foo'); |
| 23 }); | 24 }); |
| 24 | 25 |
| 25 group('hierarchical routing', () { | 26 group('hierarchical routing', () { |
| 26 | 27 |
| 27 _testParentChild( | 28 _testParentChild( |
| 28 Pattern parentPath, | 29 Pattern parentPath, |
| 29 Pattern childPath, | 30 Pattern childPath, |
| 30 String expectedParentPath, | 31 String expectedParentPath, |
| 31 String expectedChildPath, | 32 String expectedChildPath, |
| 32 String testPath) { | 33 String testPath) { |
| 33 Router router = new Router(); | 34 Router router = new Router(); |
| 34 router.root.addRoute( | 35 router.root.addRoute( |
| 35 name: 'parent', | 36 name: 'parent', |
| 36 path: parentPath, | 37 path: parentPath, |
| 37 enter: expectAsync1((RouteEvent e) { | 38 enter: expectAsync1((RouteEvent e) { |
| 38 expect(e.path, expectedParentPath); | 39 expect(e.path, expectedParentPath); |
| 39 expect(e.route, isNotNull); | |
| 40 expect(e.route.name, 'parent'); | |
| 41 }), | 40 }), |
| 42 mount: (Route child) { | 41 mount: (Route child) { |
| 43 child.addRoute( | 42 child.addRoute( |
| 44 name: 'child', | 43 name: 'child', |
| 45 path: childPath, | 44 path: childPath, |
| 46 enter: expectAsync1((RouteEvent e) { | 45 enter: expectAsync1((RouteEvent e) { |
| 47 expect(e.path, expectedChildPath); | 46 expect(e.path, expectedChildPath); |
| 48 })); | 47 })); |
| 49 }); | 48 }); |
| 50 router.route(testPath); | 49 router.route(testPath); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 67 '/bar', | 66 '/bar', |
| 68 '/foo/bar'); | 67 '/foo/bar'); |
| 69 }); | 68 }); |
| 70 | 69 |
| 71 }); | 70 }); |
| 72 | 71 |
| 73 group('leave', () { | 72 group('leave', () { |
| 74 | 73 |
| 75 test('should leave previous route and enter new', () { | 74 test('should leave previous route and enter new', () { |
| 76 Map<String, int> counters = <String, int>{ | 75 Map<String, int> counters = <String, int>{ |
| 77 'fooPreEnter': 0, | |
| 78 'fooEnter': 0, | 76 'fooEnter': 0, |
| 79 'fooLeave': 0, | 77 'fooLeave': 0, |
| 80 'barPreEnter': 0, | |
| 81 'barEnter': 0, | 78 'barEnter': 0, |
| 82 'barLeave': 0, | 79 'barLeave': 0, |
| 83 'bazPreEnter': 0, | |
| 84 'bazEnter': 0, | 80 'bazEnter': 0, |
| 85 'bazLeave': 0 | 81 'bazLeave': 0 |
| 86 }; | 82 }; |
| 87 Router router = new Router(); | 83 Router router = new Router(); |
| 88 router.root | 84 router.root |
| 89 ..addRoute(path: '/foo', | 85 ..addRoute(path: '/foo', |
| 90 name: 'foo', | 86 name: 'foo', |
| 91 preEnter: (RouteEvent e) => counters['fooPreEnter']++, | |
| 92 enter: (RouteEvent e) => counters['fooEnter']++, | 87 enter: (RouteEvent e) => counters['fooEnter']++, |
| 93 leave: (RouteEvent e) => counters['fooLeave']++, | 88 leave: (RouteEvent e) => counters['fooLeave']++, |
| 94 mount: (Route route) => route | 89 mount: (Route route) => route |
| 95 ..addRoute(path: '/bar', | 90 ..addRoute(path: '/bar', |
| 96 name: 'bar', | 91 name: 'bar', |
| 97 preEnter: (RouteEvent e) => counters['barPreEnter']++, | |
| 98 enter: (RouteEvent e) => counters['barEnter']++, | 92 enter: (RouteEvent e) => counters['barEnter']++, |
| 99 leave: (RouteEvent e) => counters['barLeave']++) | 93 leave: (RouteEvent e) => counters['barLeave']++) |
| 100 ..addRoute(path: '/baz', | 94 ..addRoute(path: '/baz', |
| 101 name: 'baz', | 95 name: 'baz', |
| 102 preEnter: (RouteEvent e) => counters['bazPreEnter']++, | |
| 103 enter: (RouteEvent e) => counters['bazEnter']++, | 96 enter: (RouteEvent e) => counters['bazEnter']++, |
| 104 leave: (RouteEvent e) => counters['bazLeave']++)); | 97 leave: (RouteEvent e) => counters['bazLeave']++)); |
| 105 | 98 |
| 106 expect(counters, { | 99 expect(counters, { |
| 107 'fooPreEnter': 0, | |
| 108 'fooEnter': 0, | 100 'fooEnter': 0, |
| 109 'fooLeave': 0, | 101 'fooLeave': 0, |
| 110 'barPreEnter': 0, | |
| 111 'barEnter': 0, | 102 'barEnter': 0, |
| 112 'barLeave': 0, | 103 'barLeave': 0, |
| 113 'bazPreEnter': 0, | |
| 114 'bazEnter': 0, | 104 'bazEnter': 0, |
| 115 'bazLeave': 0 | 105 'bazLeave': 0 |
| 116 }); | 106 }); |
| 117 | 107 |
| 118 router.route('/foo/bar').then(expectAsync1((_) { | 108 router.route('/foo/bar').then(expectAsync1((_) { |
| 119 expect(counters, { | 109 expect(counters, { |
| 120 'fooPreEnter': 1, | |
| 121 'fooEnter': 1, | 110 'fooEnter': 1, |
| 122 'fooLeave': 0, | 111 'fooLeave': 0, |
| 123 'barPreEnter': 1, | |
| 124 'barEnter': 1, | 112 'barEnter': 1, |
| 125 'barLeave': 0, | 113 'barLeave': 0, |
| 126 'bazPreEnter': 0, | |
| 127 'bazEnter': 0, | 114 'bazEnter': 0, |
| 128 'bazLeave': 0 | 115 'bazLeave': 0 |
| 129 }); | 116 }); |
| 130 | 117 |
| 131 router.route('/foo/baz').then(expectAsync1((_) { | 118 router.route('/foo/baz').then(expectAsync1((_) { |
| 132 expect(counters, { | 119 expect(counters, { |
| 133 'fooPreEnter': 1, | |
| 134 'fooEnter': 1, | 120 'fooEnter': 1, |
| 135 'fooLeave': 0, | 121 'fooLeave': 0, |
| 136 'barPreEnter': 1, | |
| 137 'barEnter': 1, | 122 'barEnter': 1, |
| 138 'barLeave': 1, | 123 'barLeave': 1, |
| 139 'bazPreEnter': 1, | |
| 140 'bazEnter': 1, | 124 'bazEnter': 1, |
| 141 'bazLeave': 0 | 125 'bazLeave': 0 |
| 142 }); | 126 }); |
| 143 })); | 127 })); |
| 144 })); | 128 })); |
| 145 }); | 129 }); |
| 146 | 130 |
| 147 _testAllowLeave(bool allowLeave) { | 131 _testAllowLeave(bool allowLeave) { |
| 148 Completer<bool> completer = new Completer<bool>(); | 132 Completer<bool> completer = new Completer<bool>(); |
| 149 bool barEntered = false; | 133 bool barEntered = false; |
| 150 bool bazEntered = false; | 134 bool bazEntered = false; |
| 151 | 135 |
| 152 Router router = new Router(); | 136 Router router = new Router(); |
| 153 router.root | 137 router.root |
| 154 ..addRoute(name: 'foo', path: '/foo', | 138 ..addRoute(name: 'foo', path: '/foo', |
| 155 mount: (Route child) => child | 139 mount: (Route child) => child |
| 156 ..addRoute(name: 'bar', path: '/bar', | 140 ..addRoute(name: 'bar', path: '/bar', |
| 157 enter: (RouteEnterEvent e) => barEntered = true, | 141 enter: (RouteEvent e) => barEntered = true, |
| 158 leave: (RouteLeaveEvent e) => e.allowLeave(completer.future)) | 142 leave: (RouteEvent e) => e.allowLeave(completer.future)) |
| 159 ..addRoute(name: 'baz', path: '/baz', | 143 ..addRoute(name: 'baz', path: '/baz', |
| 160 enter: (RouteEnterEvent e) => bazEntered = true)); | 144 enter: (RouteEvent e) => bazEntered = true)); |
| 161 | 145 |
| 162 router.route('/foo/bar').then(expectAsync1((_) { | 146 router.route('/foo/bar').then(expectAsync1((_) { |
| 163 expect(barEntered, true); | 147 expect(barEntered, true); |
| 164 expect(bazEntered, false); | 148 expect(bazEntered, false); |
| 165 router.route('/foo/baz').then(expectAsync1((_) { | 149 router.route('/foo/baz').then(expectAsync1((_) { |
| 166 expect(bazEntered, allowLeave); | 150 expect(bazEntered, allowLeave); |
| 167 })); | 151 })); |
| 168 completer.complete(allowLeave); | 152 completer.complete(allowLeave); |
| 169 })); | 153 })); |
| 170 } | 154 } |
| 171 | 155 |
| 172 test('should allow navigation', () { | 156 test('should allow navigation', () { |
| 173 _testAllowLeave(true); | 157 _testAllowLeave(true); |
| 174 }); | 158 }); |
| 175 | 159 |
| 176 test('should veto navigation', () { | 160 test('should veto navigation', () { |
| 177 _testAllowLeave(false); | 161 _testAllowLeave(false); |
| 178 }); | 162 }); |
| 179 }); | 163 }); |
| 180 | 164 |
| 181 group('preEnter', () { | |
| 182 | |
| 183 _testAllowEnter(bool allowEnter) { | |
| 184 Completer<bool> completer = new Completer<bool>(); | |
| 185 bool barEntered = false; | |
| 186 | |
| 187 Router router = new Router(); | |
| 188 router.root | |
| 189 ..addRoute(name: 'foo', path: '/foo', | |
| 190 mount: (Route child) => child | |
| 191 ..addRoute(name: 'bar', path: '/bar', | |
| 192 enter: (RouteEnterEvent e) => barEntered = true, | |
| 193 preEnter: (RoutePreEnterEvent e) => | |
| 194 e.allowEnter(completer.future))); | |
| 195 | |
| 196 router.route('/foo/bar').then(expectAsync1((_) { | |
| 197 expect(barEntered, allowEnter); | |
| 198 })); | |
| 199 completer.complete(allowEnter); | |
| 200 } | |
| 201 | |
| 202 test('should allow navigation', () { | |
| 203 _testAllowEnter(true); | |
| 204 }); | |
| 205 | |
| 206 test('should veto navigation', () { | |
| 207 _testAllowEnter(false); | |
| 208 }); | |
| 209 }); | |
| 210 | |
| 211 group('Default route', () { | 165 group('Default route', () { |
| 212 | 166 |
| 213 _testHeadTail(String path, String expectFoo, String expectBar) { | 167 _testHeadTail(String path, String expectFoo, String expectBar) { |
| 214 Router router = new Router(); | 168 Router router = new Router(); |
| 215 router.root | 169 router.root |
| 216 ..addRoute( | 170 ..addRoute( |
| 217 name: 'foo', | 171 name: 'foo', |
| 218 path: '/foo', | 172 path: '/foo', |
| 219 defaultRoute: true, | 173 defaultRoute: true, |
| 220 enter: expectAsync1((RouteEvent e) { | 174 enter: expectAsync1((RouteEvent e) { |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 }); | 674 }); |
| 721 }); | 675 }); |
| 722 }); | 676 }); |
| 723 | 677 |
| 724 }); | 678 }); |
| 725 | 679 |
| 726 } | 680 } |
| 727 | 681 |
| 728 /// An alias for Router.root.getRoute(path) | 682 /// An alias for Router.root.getRoute(path) |
| 729 r(Router router, String path) => router.root.getRoute(path); | 683 r(Router router, String path) => router.root.getRoute(path); |
| OLD | NEW |