2021-04-09 01:25:57 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-04-09 01:25:57 +03:00
package util
import (
"net/url"
"runtime"
"testing"
"github.com/stretchr/testify/assert"
2024-07-30 22:41:10 +03:00
"github.com/stretchr/testify/require"
2021-04-09 01:25:57 +03:00
)
func TestFileURLToPath ( t * testing . T ) {
2022-01-20 20:46:10 +03:00
cases := [ ] struct {
2021-04-09 01:25:57 +03:00
url string
expected string
haserror bool
windows bool
} {
// case 0
{
url : "" ,
haserror : true ,
} ,
// case 1
{
url : "http://test.io" ,
haserror : true ,
} ,
// case 2
{
url : "file:///path" ,
expected : "/path" ,
} ,
// case 3
{
url : "file:///C:/path" ,
expected : "C:/path" ,
windows : true ,
} ,
}
for n , c := range cases {
if c . windows && runtime . GOOS != "windows" {
continue
}
u , _ := url . Parse ( c . url )
p , err := FileURLToPath ( u )
if c . haserror {
2024-07-30 22:41:10 +03:00
require . Error ( t , err , "case %d: should return error" , n )
2021-04-09 01:25:57 +03:00
} else {
2024-07-30 22:41:10 +03:00
require . NoError ( t , err , "case %d: should not return error" , n )
2021-04-09 01:25:57 +03:00
assert . Equal ( t , c . expected , p , "case %d: should be equal" , n )
}
}
}
2023-02-13 23:01:09 +03:00
func TestMisc_IsReadmeFileName ( t * testing . T ) {
trueTestCases := [ ] string {
"readme" ,
"README" ,
"readME.mdown" ,
"README.md" ,
"readme.i18n.md" ,
}
falseTestCases := [ ] string {
"test.md" ,
"wow.MARKDOWN" ,
"LOL.mDoWn" ,
"test" ,
"abcdefg" ,
"abcdefghijklmnopqrstuvwxyz" ,
"test.md.test" ,
"readmf" ,
}
for _ , testCase := range trueTestCases {
assert . True ( t , IsReadmeFileName ( testCase ) )
}
for _ , testCase := range falseTestCases {
assert . False ( t , IsReadmeFileName ( testCase ) )
}
type extensionTestcase struct {
name string
expected bool
idx int
}
exts := [ ] string { ".md" , ".txt" , "" }
testCasesExtensions := [ ] extensionTestcase {
{
name : "readme" ,
expected : true ,
idx : 2 ,
} ,
{
name : "readme.md" ,
expected : true ,
idx : 0 ,
} ,
{
name : "README.md" ,
expected : true ,
idx : 0 ,
} ,
{
name : "ReAdMe.Md" ,
expected : true ,
idx : 0 ,
} ,
{
name : "readme.txt" ,
expected : true ,
idx : 1 ,
} ,
{
name : "readme.doc" ,
expected : true ,
idx : 3 ,
} ,
{
name : "readmee.md" ,
} ,
{
name : "readme.." ,
expected : true ,
idx : 3 ,
} ,
}
for _ , testCase := range testCasesExtensions {
idx , ok := IsReadmeFileExtension ( testCase . name , exts ... )
assert . Equal ( t , testCase . expected , ok )
assert . Equal ( t , testCase . idx , idx )
}
}
2023-03-08 15:17:39 +03:00
func TestCleanPath ( t * testing . T ) {
2023-03-21 23:02:49 +03:00
cases := [ ] struct {
elems [ ] string
expected string
} {
{ [ ] string { } , ` ` } ,
{ [ ] string { ` ` } , ` ` } ,
{ [ ] string { ` .. ` } , ` . ` } ,
{ [ ] string { ` a ` } , ` a ` } ,
{ [ ] string { ` /a/ ` } , ` a ` } ,
{ [ ] string { ` ../a/ ` , ` ../b ` , ` c/.. ` , ` d ` } , ` a/b/d ` } ,
{ [ ] string { ` a\..\b ` } , ` a\..\b ` } ,
{ [ ] string { ` a ` , ` ` , ` b ` } , ` a/b ` } ,
{ [ ] string { ` a ` , ` .. ` , ` b ` } , ` a/b ` } ,
{ [ ] string { ` lfs ` , ` repo/.. ` , ` user/../path ` } , ` lfs/path ` } ,
}
for _ , c := range cases {
assert . Equal ( t , c . expected , PathJoinRel ( c . elems ... ) , "case: %v" , c . elems )
}
cases = [ ] struct {
elems [ ] string
expected string
} {
{ [ ] string { } , ` ` } ,
{ [ ] string { ` ` } , ` ` } ,
{ [ ] string { ` .. ` } , ` . ` } ,
{ [ ] string { ` a ` } , ` a ` } ,
{ [ ] string { ` /a/ ` } , ` a ` } ,
{ [ ] string { ` ../a/ ` , ` ../b ` , ` c/.. ` , ` d ` } , ` a/b/d ` } ,
{ [ ] string { ` a\..\b ` } , ` b ` } ,
{ [ ] string { ` a ` , ` ` , ` b ` } , ` a/b ` } ,
{ [ ] string { ` a ` , ` .. ` , ` b ` } , ` a/b ` } ,
{ [ ] string { ` lfs ` , ` repo/.. ` , ` user/../path ` } , ` lfs/path ` } ,
}
for _ , c := range cases {
assert . Equal ( t , c . expected , PathJoinRelX ( c . elems ... ) , "case: %v" , c . elems )
2023-03-08 15:17:39 +03:00
}
2023-03-21 23:02:49 +03:00
// for POSIX only, but the result is similar on Windows, because the first element must be an absolute path
if isOSWindows ( ) {
cases = [ ] struct {
elems [ ] string
expected string
} {
{ [ ] string { ` C:\.. ` } , ` C:\ ` } ,
{ [ ] string { ` C:\a ` } , ` C:\a ` } ,
{ [ ] string { ` C:\a/ ` } , ` C:\a ` } ,
{ [ ] string { ` C:\..\a\ ` , ` ../b ` , ` c\.. ` , ` d ` } , ` C:\a\b\d ` } ,
{ [ ] string { ` C:\a/..\b ` } , ` C:\b ` } ,
{ [ ] string { ` C:\a ` , ` ` , ` b ` } , ` C:\a\b ` } ,
{ [ ] string { ` C:\a ` , ` .. ` , ` b ` } , ` C:\a\b ` } ,
{ [ ] string { ` C:\lfs ` , ` repo/.. ` , ` user/../path ` } , ` C:\lfs\path ` } ,
}
} else {
cases = [ ] struct {
elems [ ] string
expected string
} {
{ [ ] string { ` /.. ` } , ` / ` } ,
{ [ ] string { ` /a ` } , ` /a ` } ,
{ [ ] string { ` /a/ ` } , ` /a ` } ,
{ [ ] string { ` /../a/ ` , ` ../b ` , ` c/.. ` , ` d ` } , ` /a/b/d ` } ,
{ [ ] string { ` /a\..\b ` } , ` /b ` } ,
{ [ ] string { ` /a ` , ` ` , ` b ` } , ` /a/b ` } ,
{ [ ] string { ` /a ` , ` .. ` , ` b ` } , ` /a/b ` } ,
{ [ ] string { ` /lfs ` , ` repo/.. ` , ` user/../path ` } , ` /lfs/path ` } ,
}
}
for _ , c := range cases {
2023-04-12 13:16:45 +03:00
assert . Equal ( t , c . expected , FilePathJoinAbs ( c . elems [ 0 ] , c . elems [ 1 : ] ... ) , "case: %v" , c . elems )
2023-03-08 15:17:39 +03:00
}
}