| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| @TestOn('chrome') // Uses web-only Flutter SDK |
| |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:flutter_web_plugins/flutter_web_plugins.dart'; |
| |
| void main() { |
| group('$HashUrlStrategy', () { |
| late TestPlatformLocation location; |
| |
| setUp(() { |
| location = TestPlatformLocation(); |
| }); |
| |
| test('allows null state', () { |
| final HashUrlStrategy strategy = HashUrlStrategy(location); |
| expect(() => strategy.pushState(null, '', '/'), returnsNormally); |
| expect(() => strategy.replaceState(null, '', '/'), returnsNormally); |
| }); |
| |
| test('leading slash is optional', () { |
| final HashUrlStrategy strategy = HashUrlStrategy(location); |
| |
| location.hash = '#/'; |
| expect(strategy.getPath(), '/'); |
| |
| location.hash = '#/foo'; |
| expect(strategy.getPath(), '/foo'); |
| |
| location.hash = '#foo'; |
| expect(strategy.getPath(), 'foo'); |
| }); |
| |
| test('path should not be empty', () { |
| final HashUrlStrategy strategy = HashUrlStrategy(location); |
| |
| location.hash = ''; |
| expect(strategy.getPath(), '/'); |
| |
| location.hash = '#'; |
| expect(strategy.getPath(), '/'); |
| }); |
| }); |
| |
| group('$PathUrlStrategy', () { |
| late TestPlatformLocation location; |
| |
| setUp(() { |
| location = TestPlatformLocation(); |
| }); |
| |
| test('allows null state', () { |
| location.baseHref = '/'; |
| final PathUrlStrategy strategy = PathUrlStrategy(location); |
| expect(() => strategy.pushState(null, '', '/'), returnsNormally); |
| expect(() => strategy.replaceState(null, '', '/'), returnsNormally); |
| }); |
| |
| test('validates base href', () { |
| location.baseHref = '/'; |
| expect( |
| () => PathUrlStrategy(location), |
| returnsNormally, |
| ); |
| |
| location.baseHref = '/foo/'; |
| expect( |
| () => PathUrlStrategy(location), |
| returnsNormally, |
| ); |
| |
| location.baseHref = ''; |
| expect( |
| () => PathUrlStrategy(location), |
| throwsException, |
| ); |
| |
| location.baseHref = 'foo'; |
| expect( |
| () => PathUrlStrategy(location), |
| throwsException, |
| ); |
| |
| location.baseHref = '/foo'; |
| expect( |
| () => PathUrlStrategy(location), |
| throwsException, |
| ); |
| }); |
| |
| test('leading slash is always prepended', () { |
| location.baseHref = '/'; |
| final PathUrlStrategy strategy = PathUrlStrategy(location); |
| |
| location.pathname = ''; |
| expect(strategy.getPath(), '/'); |
| |
| location.pathname = 'foo'; |
| expect(strategy.getPath(), '/foo'); |
| }); |
| |
| test('gets path correctly in the presence of basePath', () { |
| location.baseHref = 'https://example.com/foo/'; |
| final PathUrlStrategy strategy = PathUrlStrategy(location); |
| |
| location.pathname = '/foo/'; |
| expect(strategy.getPath(), '/'); |
| |
| location.pathname = '/foo'; |
| expect(strategy.getPath(), '/'); |
| |
| location.pathname = '/foo/bar'; |
| expect(strategy.getPath(), '/bar'); |
| }); |
| |
| test('gets path correctly in the presence of query params', () { |
| location.baseHref = 'https://example.com/foo/'; |
| location.pathname = '/foo/bar'; |
| final PathUrlStrategy strategy = PathUrlStrategy(location); |
| |
| |
| location.search = '?q=1'; |
| expect(strategy.getPath(), '/bar?q=1'); |
| |
| location.search = '?q=1&t=r'; |
| expect(strategy.getPath(), '/bar?q=1&t=r'); |
| }); |
| |
| test('generates external path correctly in the presence of basePath', () { |
| location.baseHref = 'https://example.com/foo/'; |
| final PathUrlStrategy strategy = PathUrlStrategy(location); |
| |
| expect(strategy.prepareExternalUrl(''), '/foo'); |
| expect(strategy.prepareExternalUrl('/'), '/foo/'); |
| expect(strategy.prepareExternalUrl('bar'), '/foo/bar'); |
| expect(strategy.prepareExternalUrl('/bar'), '/foo/bar'); |
| expect(strategy.prepareExternalUrl('/bar/'), '/foo/bar/'); |
| }); |
| }); |
| } |
| |
| /// A mock implementation of [PlatformLocation] that doesn't access the browser. |
| class TestPlatformLocation extends PlatformLocation { |
| @override |
| String pathname = ''; |
| |
| @override |
| String search = ''; |
| |
| @override |
| String hash = ''; |
| |
| @override |
| Object? get state => null; |
| |
| /// Mocks the base href of the document. |
| String baseHref = ''; |
| |
| @override |
| void addPopStateListener(EventListener fn) { |
| throw UnimplementedError(); |
| } |
| |
| @override |
| void removePopStateListener(EventListener fn) { |
| throw UnimplementedError(); |
| } |
| |
| @override |
| void pushState(Object? state, String title, String url) {} |
| |
| @override |
| void replaceState(Object? state, String title, String url) {} |
| |
| @override |
| void go(int count) { |
| throw UnimplementedError(); |
| } |
| |
| @override |
| String getBaseHref() => baseHref; |
| } |