url_strategy_test.dart 4.68 KB
Newer Older
1 2 3 4 5
// 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
6
library;
7 8

import 'package:flutter_test/flutter_test.dart';
9 10 11
import 'package:flutter_web_plugins/url_strategy.dart';

import 'common.dart';
12 13 14

void main() {
  group('$PathUrlStrategy', () {
15
    late TestPlatformLocation location;
16 17 18

    setUp(() {
      location = TestPlatformLocation();
19
      location.baseHref = '/';
20 21
    });

22 23 24 25 26 27
    test('allows null state', () {
      final PathUrlStrategy strategy = PathUrlStrategy(location);
      expect(() => strategy.pushState(null, '', '/'), returnsNormally);
      expect(() => strategy.replaceState(null, '', '/'), returnsNormally);
    });

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    test('validates base href', () {
      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', () {
      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');
    });

83
    test('gets path correctly in the presence of query params and omits fragment if no flag specified', () {
84 85 86 87
      location.baseHref = 'https://example.com/foo/';
      location.pathname = '/foo/bar';
      final PathUrlStrategy strategy = PathUrlStrategy(location);

88 89 90 91 92 93 94 95 96 97 98 99 100 101
      location.search = '?q=1';
      expect(strategy.getPath(), '/bar?q=1');

      location.search = '?q=1&t=r';
      expect(strategy.getPath(), '/bar?q=1&t=r');

      location.hash = '#fragment=1';
      expect(strategy.getPath(), '/bar?q=1&t=r');
    });

    test('gets path correctly in the presence of query params and fragment', () {
      location.baseHref = 'https://example.com/foo/';
      location.pathname = '/foo/bar';
      final PathUrlStrategy strategy = PathUrlStrategy(location, true);
102 103 104 105 106 107

      location.search = '?q=1';
      expect(strategy.getPath(), '/bar?q=1');

      location.search = '?q=1&t=r';
      expect(strategy.getPath(), '/bar?q=1&t=r');
108 109 110

      location.hash = '#fragment=1';
      expect(strategy.getPath(), '/bar?q=1&t=r#fragment=1');
111 112
    });

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
    test('empty route name is ok', () {
      final PathUrlStrategy strategy = PathUrlStrategy(location);
      expect(strategy.prepareExternalUrl(''), '/');
      expect(() => strategy.pushState(null, '', ''), returnsNormally);
      expect(() => strategy.replaceState(null, '', ''), returnsNormally);
    });

    test('route names must start with /', () {
      final PathUrlStrategy strategy = PathUrlStrategy(location);

      expect(() => strategy.prepareExternalUrl('foo'), throwsAssertionError);
      expect(() => strategy.prepareExternalUrl('foo/'), throwsAssertionError);
      expect(() => strategy.prepareExternalUrl('foo/bar'), throwsAssertionError);

      expect(() => strategy.pushState(null, '', 'foo'), throwsAssertionError);
      expect(() => strategy.pushState(null, '', 'foo/'), throwsAssertionError);
      expect(() => strategy.pushState(null, '', 'foo/bar'), throwsAssertionError);

      expect(() => strategy.replaceState(null, '', 'foo'), throwsAssertionError);
      expect(() => strategy.replaceState(null, '', 'foo/'), throwsAssertionError);
      expect(() => strategy.replaceState(null, '', 'foo/bar'), throwsAssertionError);
    });

136 137 138 139
    test('generates external path correctly in the presence of basePath', () {
      location.baseHref = 'https://example.com/foo/';
      final PathUrlStrategy strategy = PathUrlStrategy(location);

140
      expect(strategy.prepareExternalUrl(''), '/foo/');
141 142 143 144 145 146
      expect(strategy.prepareExternalUrl('/'), '/foo/');
      expect(strategy.prepareExternalUrl('/bar'), '/foo/bar');
      expect(strategy.prepareExternalUrl('/bar/'), '/foo/bar/');
    });
  });
}