1 package urlx
2
3 import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7 )
8
9 func TestParseURL(t *testing.T) {
10 type testData struct {
11 urlStr string
12 expectedPath string
13 expectedStr string
14 }
15 var testURLs = []testData{
16 {"File:///home/test/file1.txt", "/home/test/file1.txt", "file:///home/test/file1.txt"},
17 {"fIle:/home/test/file2.txt", "/home/test/file2.txt", "file:///home/test/file2.txt"},
18 {"fiLe:///../test/update/file3.txt", "/../test/update/file3.txt", "file:///../test/update/file3.txt"},
19 {"filE://../test/update/file4.txt", "../test/update/file4.txt", "../test/update/file4.txt"},
20 {"file://C:/users/test/file5.txt", "/C:/users/test/file5.txt", "file:///C:/users/test/file5.txt"},
21 {"file:///C:/users/test/file6.txt", "/C:/users/test/file6.txt", "file:///C:/users/test/file6.txt"},
22 {"file://file7.txt", "file7.txt", "file7.txt"},
23 {"file://path/file8.txt", "path/file8.txt", "path/file8.txt"},
24 {"file://C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\9ccf9f68-121c-451a-8a73-2aa360925b5a386398343/access-rules.json", "/C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\9ccf9f68-121c-451a-8a73-2aa360925b5a386398343/access-rules.json", "file:///C:%5CUsers%5CRUNNER~1%5CAppData%5CLocal%5CTemp%5C9ccf9f68-121c-451a-8a73-2aa360925b5a386398343/access-rules.json"},
25 {"file:///C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\9ccf9f68-121c-451a-8a73-2aa360925b5a386398343/access-rules.json", "/C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\9ccf9f68-121c-451a-8a73-2aa360925b5a386398343/access-rules.json", "file:///C:%5CUsers%5CRUNNER~1%5CAppData%5CLocal%5CTemp%5C9ccf9f68-121c-451a-8a73-2aa360925b5a386398343/access-rules.json"},
26 {"file://C:\\Users\\path with space\\file.txt", "/C:\\Users\\path with space\\file.txt", "file:///C:%5CUsers%5Cpath%20with%20space%5Cfile.txt"},
27 {"file8b.txt", "file8b.txt", "file8b.txt"},
28 {"../file9.txt", "../file9.txt", "../file9.txt"},
29 {"./file9b.txt", "./file9b.txt", "./file9b.txt"},
30 {"file://./file9c.txt", "./file9c.txt", "./file9c.txt"},
31 {"file://./folder/.././file9d.txt", "./folder/.././file9d.txt", "./folder/.././file9d.txt"},
32 {"..\\file10.txt", "..\\file10.txt", "..%5Cfile10.txt"},
33 {"C:\\file11.txt", "/C:\\file11.txt", "file:///C:%5Cfile11.txt"},
34 {"\\\\hostname\\share\\file12.txt", "/share/file12.txt", "file://hostname/share/file12.txt"},
35 {"\\\\", "/", "file:///"},
36 {"\\\\hostname", "/", "file://hostname/"},
37 {"\\\\hostname\\", "/", "file://hostname/"},
38 {"file:///home/test/file 13.txt", "/home/test/file 13.txt", "file:///home/test/file%2013.txt"},
39 {"file:///home/test/file%2014.txt", "/home/test/file 14.txt", "file:///home/test/file%2014.txt"},
40 {"http://server:80/test/file%2015.txt", "/test/file 15.txt", "http://server:80/test/file%2015.txt"},
41 {"file:///dir/file\\ with backslash", "/dir/file\\ with backslash", "file:///dir/file%5C%20with%20backslash"},
42 {"file://dir/file\\ with backslash", "dir/file\\ with backslash", "dir/file%5C%20with%20backslash"},
43 {"file:///dir/file with windows path forbidden chars \\<>:\"|%3F*", "/dir/file with windows path forbidden chars \\<>:\"|?*", "file:///dir/file%20with%20windows%20path%20forbidden%20chars%20%5C%3C%3E:%22%7C%3F%2A"},
44 {"file://dir/file with windows path forbidden chars \\<>:\"|%3F*", "dir/file with windows path forbidden chars \\<>:\"|?*", "dir/file%20with%20windows%20path%20forbidden%20chars%20%5C%3C%3E:%22%7C%3F%2A"},
45 {"file:///path/file?query=1", "/path/file", "file:///path/file?query=1"},
46 {"http://host:80/path/file?query=1", "/path/file", "http://host:80/path/file?query=1"},
47 {"file://////C:/file.txt", "////C:/file.txt", "file://////C:/file.txt"},
48 {"file://////C:\\file.txt", "////C:\\file.txt", "file://////C:%5Cfile.txt"},
49 }
50
51 for _, td := range testURLs {
52 u, err := Parse(td.urlStr)
53 assert.NoError(t, err)
54 if err != nil {
55 continue
56 }
57 assert.Equal(t, td.expectedPath, u.Path, "expected path for %s", td.urlStr)
58 assert.Equal(t, td.expectedStr, u.String(), "expected URL string for %s", td.urlStr)
59 }
60 _, err := Parse("://")
61 assert.Error(t, err)
62 _, err = Parse("://host:80/file")
63 assert.Error(t, err)
64 _, err = Parse(":///path/file")
65 assert.Error(t, err)
66 }
67
68 func TestTrimPrefixIC(t *testing.T) {
69 for _, td := range []struct {
70 s string
71 prefix string
72 expected string
73 }{
74 {"file://test", "file://", "test"},
75 {"FILE://test", "file://", "test"},
76 {"FiLe://test", "file://", "test"},
77 {"http://test", "file://", "http://test"},
78 {"files://test", "file://", "files://test"},
79 } {
80 assert.Equal(t, td.expected, trimPrefixIC(td.s, td.prefix))
81 }
82 }
83
View as plain text