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
|
package redirects
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
netlifyRedirects "github.com/tj/go-redirects"
)
func TestRedirectsValidateUrl(t *testing.T) {
enablePlaceholders(t)
tests := map[string]struct {
url string
expectedErr error
}{
"valid_url": {
url: "/goto.html",
},
"no_domain_level_redirects": {
url: "https://GitLab.com",
expectedErr: errNoDomainLevelRedirects,
},
"no_schemaless_url_domain_level_redirects": {
url: "//GitLab.com/pages.html",
expectedErr: errNoDomainLevelRedirects,
},
"no_bare_domain_level_redirects": {
url: "GitLab.com",
expectedErr: errNoStartingForwardSlashInURLPath,
},
"no_parent_traversing_relative_url": {
url: "../target.html",
expectedErr: errNoStartingForwardSlashInURLPath,
},
"too_many_slashes": {
url: strings.Repeat("/a", 26),
expectedErr: errTooManyPathSegments,
},
"placeholders": {
url: "/news/:year/:month/:date/:slug",
},
"splats": {
url: "/blog/*",
},
"splat_placeholders": {
url: "/new/path/:splat",
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
err := validateURL(tt.url)
require.ErrorIs(t, err, tt.expectedErr)
})
}
}
// Tests validation rules that only apply when the `FF_ENABLE_PLACEHOLDERS`
// feature flag is not enabled. These tests can be removed when the
// `FF_ENABLE_PLACEHOLDERS` flag is removed.
func TestRedirectsValidateUrlNoPlaceholders(t *testing.T) {
tests := map[string]struct {
url string
expectedErr error
}{
"no_splats": {
url: "/blog/*",
expectedErr: errNoSplats,
},
"no_placeholders": {
url: "/news/:year/:month/:date/:slug",
expectedErr: errNoPlaceholders,
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
err := validateURL(tt.url)
require.ErrorIs(t, err, tt.expectedErr)
})
}
}
func TestRedirectsValidateRule(t *testing.T) {
enablePlaceholders(t)
tests := map[string]struct {
rule string
expectedErr error
}{
"valid_rule": {
rule: "/goto.html /target.html 301",
},
"invalid_from_url": {
rule: "invalid.com /teapot.html 302",
expectedErr: errNoStartingForwardSlashInURLPath,
},
"invalid_to_url": {
rule: "/goto.html invalid.com",
expectedErr: errNoStartingForwardSlashInURLPath,
},
"no_parameters": {
rule: "/ /something 302 foo=bar",
expectedErr: errNoParams,
},
"invalid_status": {
rule: "/goto.html /target.html 418",
expectedErr: errUnsupportedStatus,
},
"force_not_supported": {
rule: "/goto.html /target.html 302!",
expectedErr: errNoForce,
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
rules, err := netlifyRedirects.ParseString(tt.rule)
require.NoError(t, err)
err = validateRule(rules[0])
require.ErrorIs(t, err, tt.expectedErr)
})
}
}
|