1// Copyright 2017 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package validation
5
6import (
7 "testing"
8
9 "code.forgejo.org/go-chi/binding"
10)
11
12var gitRefNameValidationTestCases = []validationTestCase{
13 {
14 description: "Reference name contains only characters",
15 data: TestForm{
16 BranchName: "test",
17 },
18 expectedErrors: binding.Errors{},
19 },
20 {
21 description: "Reference name contains single slash",
22 data: TestForm{
23 BranchName: "feature/test",
24 },
25 expectedErrors: binding.Errors{},
26 },
27 {
28 description: "Reference name has allowed special characters",
29 data: TestForm{
30 BranchName: "debian/1%1.6.0-2",
31 },
32 expectedErrors: binding.Errors{},
33 },
34 {
35 description: "Reference name contains backslash",
36 data: TestForm{
37 BranchName: "feature\\test",
38 },
39 expectedErrors: binding.Errors{
40 binding.Error{
41 FieldNames: []string{"BranchName"},
42 Classification: ErrGitRefName,
43 Message: "GitRefName",
44 },
45 },
46 },
47 {
48 description: "Reference name starts with dot",
49 data: TestForm{
50 BranchName: ".test",
51 },
52 expectedErrors: binding.Errors{
53 binding.Error{
54 FieldNames: []string{"BranchName"},
55 Classification: ErrGitRefName,
56 Message: "GitRefName",
57 },
58 },
59 },
60 {
61 description: "Reference name ends with dot",
62 data: TestForm{
63 BranchName: "test.",
64 },
65 expectedErrors: binding.Errors{
66 binding.Error{
67 FieldNames: []string{"BranchName"},
68 Classification: ErrGitRefName,
69 Message: "GitRefName",
70 },
71 },
72 },
73 {
74 description: "Reference name starts with slash",
75 data: TestForm{
76 BranchName: "/test",
77 },
78 expectedErrors: binding.Errors{
79 binding.Error{
80 FieldNames: []string{"BranchName"},
81 Classification: ErrGitRefName,
82 Message: "GitRefName",
83 },
84 },
85 },
86 {
87 description: "Reference name ends with slash",
88 data: TestForm{
89 BranchName: "test/",
90 },
91 expectedErrors: binding.Errors{
92 binding.Error{
93 FieldNames: []string{"BranchName"},
94 Classification: ErrGitRefName,
95 Message: "GitRefName",
96 },
97 },
98 },
99 {
100 description: "Reference name ends with .lock",
101 data: TestForm{
102 BranchName: "test.lock",
103 },
104 expectedErrors: binding.Errors{
105 binding.Error{
106 FieldNames: []string{"BranchName"},
107 Classification: ErrGitRefName,
108 Message: "GitRefName",
109 },
110 },
111 },
112 {
113 description: "Reference name contains multiple consecutive dots",
114 data: TestForm{
115 BranchName: "te..st",
116 },
117 expectedErrors: binding.Errors{
118 binding.Error{
119 FieldNames: []string{"BranchName"},
120 Classification: ErrGitRefName,
121 Message: "GitRefName",
122 },
123 },
124 },
125 {
126 description: "Reference name contains multiple consecutive slashes",
127 data: TestForm{
128 BranchName: "te//st",
129 },
130 expectedErrors: binding.Errors{
131 binding.Error{
132 FieldNames: []string{"BranchName"},
133 Classification: ErrGitRefName,
134 Message: "GitRefName",
135 },
136 },
137 },
138 {
139 description: "Reference name is single @",
140 data: TestForm{
141 BranchName: "@",
142 },
143 expectedErrors: binding.Errors{
144 binding.Error{
145 FieldNames: []string{"BranchName"},
146 Classification: ErrGitRefName,
147 Message: "GitRefName",
148 },
149 },
150 },
151 {
152 description: "Reference name has @{",
153 data: TestForm{
154 BranchName: "branch@{",
155 },
156 expectedErrors: binding.Errors{
157 binding.Error{
158 FieldNames: []string{"BranchName"},
159 Classification: ErrGitRefName,
160 Message: "GitRefName",
161 },
162 },
163 },
164 {
165 description: "Reference name has unallowed special character ~",
166 data: TestForm{
167 BranchName: "~debian/1%1.6.0-2",
168 },
169 expectedErrors: binding.Errors{
170 binding.Error{
171 FieldNames: []string{"BranchName"},
172 Classification: ErrGitRefName,
173 Message: "GitRefName",
174 },
175 },
176 },
177 {
178 description: "Reference name has unallowed special character *",
179 data: TestForm{
180 BranchName: "*debian/1%1.6.0-2",
181 },
182 expectedErrors: binding.Errors{
183 binding.Error{
184 FieldNames: []string{"BranchName"},
185 Classification: ErrGitRefName,
186 Message: "GitRefName",
187 },
188 },
189 },
190 {
191 description: "Reference name has unallowed special character ?",
192 data: TestForm{
193 BranchName: "?debian/1%1.6.0-2",
194 },
195 expectedErrors: binding.Errors{
196 binding.Error{
197 FieldNames: []string{"BranchName"},
198 Classification: ErrGitRefName,
199 Message: "GitRefName",
200 },
201 },
202 },
203 {
204 description: "Reference name has unallowed special character ^",
205 data: TestForm{
206 BranchName: "^debian/1%1.6.0-2",
207 },
208 expectedErrors: binding.Errors{
209 binding.Error{
210 FieldNames: []string{"BranchName"},
211 Classification: ErrGitRefName,
212 Message: "GitRefName",
213 },
214 },
215 },
216 {
217 description: "Reference name has unallowed special character :",
218 data: TestForm{
219 BranchName: "debian:jessie",
220 },
221 expectedErrors: binding.Errors{
222 binding.Error{
223 FieldNames: []string{"BranchName"},
224 Classification: ErrGitRefName,
225 Message: "GitRefName",
226 },
227 },
228 },
229 {
230 description: "Reference name has unallowed special character (whitespace)",
231 data: TestForm{
232 BranchName: "debian jessie",
233 },
234 expectedErrors: binding.Errors{
235 binding.Error{
236 FieldNames: []string{"BranchName"},
237 Classification: ErrGitRefName,
238 Message: "GitRefName",
239 },
240 },
241 },
242 {
243 description: "Reference name has unallowed special character [",
244 data: TestForm{
245 BranchName: "debian[jessie",
246 },
247 expectedErrors: binding.Errors{
248 binding.Error{
249 FieldNames: []string{"BranchName"},
250 Classification: ErrGitRefName,
251 Message: "GitRefName",
252 },
253 },
254 },
255}
256
257func Test_GitRefNameValidation(t *testing.T) {
258 AddBindingRules()
259
260 for _, testCase := range gitRefNameValidationTestCases {
261 t.Run(testCase.description, func(t *testing.T) {
262 performValidationTest(t, testCase)
263 })
264 }
265}