aboutsummaryrefslogtreecommitdiff
path: root/src/normalize-url.test.js
blob: 0d7a9da11d102c337c4ec4ad926107b683bf79f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import test from 'ava'
import { normalizeUrl } from './normalize-url'

test('main', (t) => {
  t.is(normalizeUrl('http://sindresorhus.com'), 'https://sindresorhus.com')
  t.is(normalizeUrl('http://sindresorhus.com '), 'https://sindresorhus.com')
  t.is(normalizeUrl('http://sindresorhus.com.'), 'https://sindresorhus.com')
  t.is(normalizeUrl('http://SindreSorhus.com'), 'https://sindresorhus.com')
  t.is(normalizeUrl('http://sindresorhus.com'), 'https://sindresorhus.com')
  t.is(normalizeUrl('HTTP://sindresorhus.com'), 'https://sindresorhus.com')

  // TODO: why isn't this parsed correctly by Node.js URL?
  // t.is(normalizeUrl('//sindresorhus.com'), 'https://sindresorhus.com')

  t.is(normalizeUrl('http://sindresorhus.com'), 'https://sindresorhus.com')
  t.is(normalizeUrl('http://sindresorhus.com:80'), 'https://sindresorhus.com')
  t.is(normalizeUrl('https://sindresorhus.com:443'), 'https://sindresorhus.com')
  t.is(normalizeUrl('ftp://sindresorhus.com:21'), 'ftp://sindresorhus.com')
  t.is(
    normalizeUrl('https://sindresorhus.com/foo/'),
    'https://sindresorhus.com/foo'
  )
  t.is(
    normalizeUrl('http://sindresorhus.com/?foo=bar baz'),
    'https://sindresorhus.com/?foo=bar+baz'
  )
  t.is(
    normalizeUrl('https://foo.com/https://bar.com'),
    'https://foo.com/https://bar.com'
  )
  t.is(
    normalizeUrl('https://foo.com/https://bar.com/foo//bar'),
    'https://foo.com/https://bar.com/foo/bar'
  )
  t.is(
    normalizeUrl('https://foo.com/http://bar.com'),
    'https://foo.com/http://bar.com'
  )
  t.is(
    normalizeUrl('https://foo.com/http://bar.com/foo//bar'),
    'https://foo.com/http://bar.com/foo/bar'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/%7Efoo/'),
    'https://sindresorhus.com/~foo',
    'decode URI octets'
  )
  t.is(normalizeUrl('https://sindresorhus.com/?'), 'https://sindresorhus.com')
  t.is(normalizeUrl('https://êxample.com'), 'https://xn--xample-hva.com')
  t.is(
    normalizeUrl('https://sindresorhus.com/?b=bar&a=foo'),
    'https://sindresorhus.com/?a=foo&b=bar'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/?foo=bar*|<>:"'),
    'https://sindresorhus.com/?foo=bar*%7C%3C%3E%3A%22'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com:5000'),
    'https://sindresorhus.com:5000'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/foo#bar'),
    'https://sindresorhus.com/foo#bar'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/foo/bar/../baz'),
    'https://sindresorhus.com/foo/baz'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/foo/bar/./baz'),
    'https://sindresorhus.com/foo/bar/baz'
  )
  t.is(
    normalizeUrl(
      'https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'
    ),
    'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F598160082_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png'
  )
})

test('removeTrailingSlash and removeDirectoryIndex options)', (t) => {
  t.is(
    normalizeUrl('https://sindresorhus.com/path/'),
    'https://sindresorhus.com/path'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/#/path/'),
    'https://sindresorhus.com/#/path/'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/foo/#/bar/'),
    'https://sindresorhus.com/foo#/bar/'
  )
})

test('sortQueryParameters', (t) => {
  t.is(
    normalizeUrl('https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'),
    'https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/?b=Y&c=X&a=Z&d=W'),
    'https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com/?a=Z&d=W&b=Y&c=X'),
    'https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'
  )
  t.is(normalizeUrl('https://sindresorhus.com/'), 'https://sindresorhus.com')
})

test('invalid urls', (t) => {
  t.throws(() => {
    normalizeUrl('http://')
  }, 'Invalid URL: http://')

  t.throws(() => {
    normalizeUrl('/')
  }, 'Invalid URL: /')

  t.throws(() => {
    normalizeUrl('/relative/path/')
  }, 'Invalid URL: /relative/path/')
})

test('remove duplicate pathname slashes', (t) => {
  t.is(
    normalizeUrl('https://sindresorhus.com////foo/bar'),
    'https://sindresorhus.com/foo/bar'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com////foo////bar'),
    'https://sindresorhus.com/foo/bar'
  )
  t.is(
    normalizeUrl('ftp://sindresorhus.com//foo'),
    'ftp://sindresorhus.com/foo'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com:5000///foo'),
    'https://sindresorhus.com:5000/foo'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com///foo'),
    'https://sindresorhus.com/foo'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com:5000//foo'),
    'https://sindresorhus.com:5000/foo'
  )
  t.is(
    normalizeUrl('https://sindresorhus.com//foo'),
    'https://sindresorhus.com/foo'
  )
})