2018-08-15 09:29:37 +03:00
// Copyright 2018 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2018-08-15 09:29:37 +03:00
package validation
import (
"testing"
"code.gitea.io/gitea/modules/setting"
2019-08-23 19:40:30 +03:00
"github.com/stretchr/testify/assert"
2018-08-15 09:29:37 +03:00
)
func Test_IsValidURL ( t * testing . T ) {
cases := [ ] struct {
description string
url string
valid bool
} {
{
description : "Empty URL" ,
url : "" ,
valid : false ,
} ,
{
2021-07-08 14:38:13 +03:00
description : "Loopback IPv4 URL" ,
2018-08-15 09:29:37 +03:00
url : "http://127.0.1.1:5678/" ,
valid : true ,
} ,
{
2021-07-08 14:38:13 +03:00
description : "Loopback IPv6 URL" ,
2018-08-15 09:29:37 +03:00
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 ,
} ,
{
2021-07-08 14:38:13 +03:00
description : "Loopback IPv4 URL" ,
2018-08-15 09:29:37 +03:00
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 ) )
} )
}
}
2019-05-31 12:21:15 +03:00
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 ) )
} )
}
}
2022-11-04 12:04:08 +03:00
2023-06-12 14:57:01 +03:00
func TestIsValidUsernameAllowDots ( t * testing . T ) {
setting . Service . AllowDotsInUsernames = true
2022-11-04 12:04:08 +03:00
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 )
} )
}
}
2023-06-12 14:57:01 +03:00
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 )
} )
}
}