mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-24 11:02:42 +00:00
Refs: https://codeberg.org/forgejo/forgejo/pulls/676 Author: Panagiotis "Ivory" Vasilopoulos <git@n0toose.net> Date: Mon Jun 12 13:57:01 2023 +0200 Co-authored-by: Gusted <postmaster@gusted.xyz> (cherry picked from commitfabdda5c6e) (cherry picked from commitd2c7f45621) (cherry picked from commitdfdbaba3d6) (cherry picked from commita3cda092b8) (cherry picked from commitf0fdb5905c) (cherry picked from commit9697e48c1f) (cherry picked from commit46e31009a8) (cherry picked from commit5bb2c54b6f) (cherry picked from commit682f9d24e1) (cherry picked from commit1863481005) (cherry picked from commit4f1b7c4ddb) (cherry picked from commit6afe70bbf1) (cherry picked from commit5cec1d9c2d) Conflicts: templates/admin/config.tmpl https://codeberg.org/forgejo/forgejo/pulls/1512 (cherry picked from commitde2d172473) (cherry picked from commit37a3172dd9) (cherry picked from commit92dfca0c5a) (cherry picked from commita713d59b0c) (cherry picked from commite7bd71a618) (cherry picked from commit69f3e952c4) (cherry picked from commit83fbb7b566) (cherry picked from commit3196605fa9) (cherry picked from commite37eb8de9c) (cherry picked from commit8c99f59e48) (cherry picked from commit74aa1ac66f) (cherry picked from commit622440b3bd) (cherry picked from commit2c1ec90984) (cherry picked from commit24d57152e0) (cherry picked from commit071e9013f3) (cherry picked from commit27fbb726fa) (cherry picked from commit29eddd86ea) (cherry picked from commit133dc72fab)
216 lines
5.3 KiB
Go
216 lines
5.3 KiB
Go
// Copyright 2018 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package validation
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test_IsValidURL(t *testing.T) {
|
|
cases := []struct {
|
|
description string
|
|
url string
|
|
valid bool
|
|
}{
|
|
{
|
|
description: "Empty URL",
|
|
url: "",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "Loopback IPv4 URL",
|
|
url: "http://127.0.1.1:5678/",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "Loopback IPv6 URL",
|
|
url: "https://[::1]/",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "Missing semicolon after schema",
|
|
url: "http//meh/",
|
|
valid: false,
|
|
},
|
|
}
|
|
|
|
for _, testCase := range cases {
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
assert.Equal(t, testCase.valid, IsValidURL(testCase.url))
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_IsValidExternalURL(t *testing.T) {
|
|
setting.AppURL = "https://try.gitea.io/"
|
|
|
|
cases := []struct {
|
|
description string
|
|
url string
|
|
valid bool
|
|
}{
|
|
{
|
|
description: "Current instance URL",
|
|
url: "https://try.gitea.io/test",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "Loopback IPv4 URL",
|
|
url: "http://127.0.1.1:5678/",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "Current instance API URL",
|
|
url: "https://try.gitea.io/api/v1/user/follow",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "Local network URL",
|
|
url: "http://192.168.1.2/api/v1/user/follow",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "Local URL",
|
|
url: "http://LOCALHOST:1234/whatever",
|
|
valid: false,
|
|
},
|
|
}
|
|
|
|
for _, testCase := range cases {
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
assert.Equal(t, testCase.valid, IsValidExternalURL(testCase.url))
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_IsValidExternalTrackerURLFormat(t *testing.T) {
|
|
setting.AppURL = "https://try.gitea.io/"
|
|
|
|
cases := []struct {
|
|
description string
|
|
url string
|
|
valid bool
|
|
}{
|
|
{
|
|
description: "Correct external tracker URL with all placeholders",
|
|
url: "https://github.com/{user}/{repo}/issues/{index}",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "Local external tracker URL with all placeholders",
|
|
url: "https://127.0.0.1/{user}/{repo}/issues/{index}",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "External tracker URL with typo placeholder",
|
|
url: "https://github.com/{user}/{repo/issues/{index}",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "External tracker URL with typo placeholder",
|
|
url: "https://github.com/[user}/{repo/issues/{index}",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "External tracker URL with typo placeholder",
|
|
url: "https://github.com/{user}/repo}/issues/{index}",
|
|
valid: false,
|
|
},
|
|
{
|
|
description: "External tracker URL missing optional placeholder",
|
|
url: "https://github.com/{user}/issues/{index}",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "External tracker URL missing optional placeholder",
|
|
url: "https://github.com/{repo}/issues/{index}",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "External tracker URL missing optional placeholder",
|
|
url: "https://github.com/issues/{index}",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "External tracker URL missing optional placeholder",
|
|
url: "https://github.com/issues/{user}",
|
|
valid: true,
|
|
},
|
|
{
|
|
description: "External tracker URL with similar placeholder names test",
|
|
url: "https://github.com/user/repo/issues/{index}",
|
|
valid: true,
|
|
},
|
|
}
|
|
|
|
for _, testCase := range cases {
|
|
t.Run(testCase.description, func(t *testing.T) {
|
|
assert.Equal(t, testCase.valid, IsValidExternalTrackerURLFormat(testCase.url))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsValidUsernameAllowDots(t *testing.T) {
|
|
setting.Service.AllowDotsInUsernames = true
|
|
tests := []struct {
|
|
arg string
|
|
want bool
|
|
}{
|
|
{arg: "a", want: true},
|
|
{arg: "abc", want: true},
|
|
{arg: "0.b-c", want: true},
|
|
{arg: "a.b-c_d", want: true},
|
|
{arg: "", want: false},
|
|
{arg: ".abc", want: false},
|
|
{arg: "abc.", want: false},
|
|
{arg: "a..bc", want: false},
|
|
{arg: "a...bc", want: false},
|
|
{arg: "a.-bc", want: false},
|
|
{arg: "a._bc", want: false},
|
|
{arg: "a_-bc", want: false},
|
|
{arg: "a/bc", want: false},
|
|
{arg: "☁️", want: false},
|
|
{arg: "-", want: false},
|
|
{arg: "--diff", want: false},
|
|
{arg: "-im-here", want: false},
|
|
{arg: "a space", want: false},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.arg, func(t *testing.T) {
|
|
assert.Equalf(t, tt.want, IsValidUsername(tt.arg), "IsValidUsername(%v)", tt.arg)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsValidUsernameBanDots(t *testing.T) {
|
|
setting.Service.AllowDotsInUsernames = false
|
|
defer func() {
|
|
setting.Service.AllowDotsInUsernames = true
|
|
}()
|
|
|
|
tests := []struct {
|
|
arg string
|
|
want bool
|
|
}{
|
|
{arg: "a", want: true},
|
|
{arg: "abc", want: true},
|
|
{arg: "0.b-c", want: false},
|
|
{arg: "a.b-c_d", want: false},
|
|
{arg: ".abc", want: false},
|
|
{arg: "abc.", want: false},
|
|
{arg: "a..bc", want: false},
|
|
{arg: "a...bc", want: false},
|
|
{arg: "a.-bc", want: false},
|
|
{arg: "a._bc", want: false},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.arg, func(t *testing.T) {
|
|
assert.Equalf(t, tt.want, IsValidUsername(tt.arg), "IsValidUsername[AllowDotsInUsernames=false](%v)", tt.arg)
|
|
})
|
|
}
|
|
}
|