-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathinstall_test.go
More file actions
243 lines (229 loc) · 6.16 KB
/
install_test.go
File metadata and controls
243 lines (229 loc) · 6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
package command
import (
"strings"
"testing"
"github.com/privateerproj/privateer-sdk/internal/registry"
)
func TestParsePluginName(t *testing.T) {
var tests = []struct {
name string
input string
expectedOwner string
expectedRepo string
expectError string
}{
{
name: "owner/repo format",
input: "ossf/pvtr-github-repo-scanner",
expectedOwner: "ossf",
expectedRepo: "pvtr-github-repo-scanner",
},
{
name: "repo only defaults to privateerproj",
input: "pvtr-example",
expectedOwner: "privateerproj",
expectedRepo: "pvtr-example",
},
{
name: "org with nested path",
input: "myorg/my-plugin",
expectedOwner: "myorg",
expectedRepo: "my-plugin",
},
{
name: "empty string",
input: "",
expectError: "must not be empty",
},
{
name: "whitespace only",
input: " ",
expectError: "must not be empty",
},
{
name: "path traversal",
input: "../etc/passwd",
expectError: "invalid owner",
},
{
name: "backslash",
input: "org\\repo",
expectError: "invalid repo",
},
{
name: "empty owner",
input: "/my-plugin",
expectError: "invalid owner",
},
{
name: "empty repo",
input: "myorg/",
expectError: "invalid repo",
},
{
name: "owner starts with dot",
input: ".hidden/repo",
expectError: "invalid owner",
},
{
name: "repo starts with hyphen",
input: "org/-repo",
expectError: "invalid repo",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
owner, repo, err := parsePluginName(tt.input)
if tt.expectError != "" {
if err == nil {
t.Fatalf("expected error containing %q, got nil", tt.expectError)
}
if !strings.Contains(err.Error(), tt.expectError) {
t.Errorf("expected error containing %q, got: %v", tt.expectError, err)
}
return
}
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if owner != tt.expectedOwner {
t.Errorf("owner: got %q, expected %q", owner, tt.expectedOwner)
}
if repo != tt.expectedRepo {
t.Errorf("repo: got %q, expected %q", repo, tt.expectedRepo)
}
})
}
}
func TestIsVetted(t *testing.T) {
plugins := []string{"ossf/pvtr-github-repo-scanner", "privateerproj/pvtr-example", " spaced-name "}
var tests = []struct {
name string
search string
expected bool
}{
{name: "exact match", search: "ossf/pvtr-github-repo-scanner", expected: true},
{name: "another match", search: "privateerproj/pvtr-example", expected: true},
{name: "not in list", search: "unknown/plugin", expected: false},
{name: "empty string", search: "", expected: false},
{name: "trimmed match", search: "spaced-name", expected: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isVetted(plugins, tt.search)
if got != tt.expected {
t.Errorf("isVetted(plugins, %q) = %v, expected %v", tt.search, got, tt.expected)
}
})
}
}
func TestResolveDownloadURL(t *testing.T) {
var tests = []struct {
name string
data *registry.PluginData
expectURL string
expectError string
}{
{
name: "direct download URL",
data: ®istry.PluginData{
Name: "ossf/pvtr-github-repo-scanner",
Download: "https://example.com/direct-download.tar.gz",
Source: "https://github.com/ossf/pvtr-github-repo-scanner",
Latest: "0.19.2",
},
expectURL: "https://example.com/direct-download.tar.gz",
},
{
name: "inferred from GitHub release",
data: ®istry.PluginData{
Name: "ossf/pvtr-github-repo-scanner",
Source: "https://github.com/ossf/pvtr-github-repo-scanner",
Latest: "0.19.2",
},
expectURL: "https://github.com/ossf/pvtr-github-repo-scanner/releases/download/v0.19.2/pvtr-github-repo-scanner_",
},
{
name: "inferred from owner/repo source",
data: ®istry.PluginData{
Name: "privateerproj/pvtr-example",
Source: "privateerproj/pvtr-example",
Latest: "1.0.0",
},
expectURL: "https://github.com/privateerproj/pvtr-example/releases/download/v1.0.0/pvtr-example_",
},
{
name: "missing source and download",
data: ®istry.PluginData{
Name: "broken-plugin",
Latest: "1.0.0",
},
expectError: "no download URL and no source/version",
},
{
name: "missing version",
data: ®istry.PluginData{
Name: "broken-plugin",
Source: "https://github.com/org/repo",
},
expectError: "no download URL and no source/version",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := resolveDownloadURL(tt.data)
if tt.expectError != "" {
if err == nil {
t.Fatalf("expected error containing %q, got nil", tt.expectError)
}
if !strings.Contains(err.Error(), tt.expectError) {
t.Errorf("expected error containing %q, got: %v", tt.expectError, err)
}
return
}
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// For inferred URLs, we only check the prefix since the suffix depends on OS/arch
if tt.data.Download != "" {
if got != tt.expectURL {
t.Errorf("got %q, expected %q", got, tt.expectURL)
}
} else {
if !strings.HasPrefix(got, tt.expectURL) {
t.Errorf("got %q, expected prefix %q", got, tt.expectURL)
}
}
})
}
}
func TestContains(t *testing.T) {
plugins := []*PluginPkg{
{Name: "plugin-a"},
{Name: "plugin-b"},
{Name: "pvtr-github-repo-scanner"},
}
var tests = []struct {
name string
search string
expected bool
}{
{name: "found first", search: "plugin-a", expected: true},
{name: "found last", search: "pvtr-github-repo-scanner", expected: true},
{name: "not found", search: "missing-plugin", expected: false},
{name: "empty string", search: "", expected: false},
{name: "nil slice", search: "anything", expected: false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
slice := plugins
if tt.name == "nil slice" {
slice = nil
}
got := Contains(slice, tt.search)
if got != tt.expected {
t.Errorf("Contains(plugins, %q) = %v, expected %v", tt.search, got, tt.expected)
}
})
}
}