Skip to content

Commit 75a0233

Browse files
creed-brattonbfabio
authored andcommitted
test: add tests for Gitea scanner, GitLab pure functions, mergeNewAliases
1 parent d1f9b97 commit 75a0233

3 files changed

Lines changed: 440 additions & 0 deletions

File tree

crawler/crawler_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package crawler
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestMergeNewAliases_addsNew(t *testing.T) {
10+
existing := []string{"https://github.com/org/repo.git"}
11+
newAliases := []string{"https://github.com/org/repo"}
12+
13+
got := mergeNewAliases(existing, newAliases)
14+
15+
assert.Equal(t, []string{
16+
"https://github.com/org/repo.git",
17+
"https://github.com/org/repo",
18+
}, got)
19+
}
20+
21+
func TestMergeNewAliases_noDuplicates(t *testing.T) {
22+
existing := []string{"https://github.com/org/repo.git"}
23+
newAliases := []string{"https://github.com/org/repo.git"}
24+
25+
got := mergeNewAliases(existing, newAliases)
26+
27+
assert.Equal(t, []string{"https://github.com/org/repo.git"}, got)
28+
}
29+
30+
func TestMergeNewAliases_emptyExisting(t *testing.T) {
31+
got := mergeNewAliases(nil, []string{"https://github.com/org/repo"})
32+
33+
assert.Equal(t, []string{"https://github.com/org/repo"}, got)
34+
}
35+
36+
func TestMergeNewAliases_emptyNew(t *testing.T) {
37+
existing := []string{"https://github.com/org/repo"}
38+
39+
got := mergeNewAliases(existing, nil)
40+
41+
assert.Equal(t, existing, got)
42+
}
43+
44+
func TestMergeNewAliases_bothEmpty(t *testing.T) {
45+
got := mergeNewAliases(nil, nil)
46+
47+
assert.Nil(t, got)
48+
}
49+
50+
func TestMergeNewAliases_multipleNew(t *testing.T) {
51+
existing := []string{"a"}
52+
newAliases := []string{"b", "a", "c"}
53+
54+
got := mergeNewAliases(existing, newAliases)
55+
56+
assert.Equal(t, []string{"a", "b", "c"}, got)
57+
}

scanner/gitea_test.go

Lines changed: 328 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
package scanner_test
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"net/http"
7+
"net/http/httptest"
8+
"net/url"
9+
"testing"
10+
11+
"github.com/italia/publiccode-crawler/v4/common"
12+
"github.com/italia/publiccode-crawler/v4/scanner"
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
func giteaRepoJSON(name, fullName, defaultBranch string, private, archived, empty bool) map[string]any {
18+
return map[string]any{
19+
"name": name,
20+
"full_name": fullName,
21+
"private": private,
22+
"archived": archived,
23+
"empty": empty,
24+
"default_branch": defaultBranch,
25+
"html_url": "http://placeholder/" + fullName,
26+
"clone_url": "http://placeholder/" + fullName + ".git",
27+
}
28+
}
29+
30+
// newGiteaTestServer returns a test server that handles Gitea API requests.
31+
func newGiteaTestServer(t *testing.T, handler http.HandlerFunc) *httptest.Server {
32+
return httptest.NewServer(handler)
33+
}
34+
35+
func giteaPublisher() common.Publisher {
36+
return common.Publisher{ID: "test", Name: "Test"}
37+
}
38+
39+
func TestGiteaScanner_ScanRepo_success(t *testing.T) {
40+
repo := giteaRepoJSON("myrepo", "myorg/myrepo", "main", false, false, false)
41+
42+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
43+
assert.Equal(t, "/api/v1/repos/myorg/myrepo", r.URL.Path)
44+
45+
w.Header().Set("Content-Type", "application/json")
46+
_ = json.NewEncoder(w).Encode(repo)
47+
})
48+
defer ts.Close()
49+
50+
repoURL, err := url.Parse(ts.URL + "/myorg/myrepo")
51+
require.NoError(t, err)
52+
53+
repositories := make(chan common.Repository, 1)
54+
55+
sc := scanner.NewGiteaScanner()
56+
err = sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
57+
58+
require.NoError(t, err)
59+
require.Len(t, repositories, 1)
60+
61+
got := <-repositories
62+
assert.Equal(t, "myorg/myrepo", got.Name)
63+
assert.Equal(t, "main", got.GitBranch)
64+
assert.Equal(t, "http://placeholder/myorg/myrepo/raw/branch/main/publiccode.yml", got.FileRawURL)
65+
}
66+
67+
func TestGiteaScanner_ScanRepo_dotGitSuffix(t *testing.T) {
68+
repo := giteaRepoJSON("myrepo", "myorg/myrepo", "main", false, false, false)
69+
70+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
71+
assert.Equal(t, "/api/v1/repos/myorg/myrepo", r.URL.Path)
72+
73+
w.Header().Set("Content-Type", "application/json")
74+
_ = json.NewEncoder(w).Encode(repo)
75+
})
76+
defer ts.Close()
77+
78+
repoURL, err := url.Parse(ts.URL + "/myorg/myrepo.git")
79+
require.NoError(t, err)
80+
81+
repositories := make(chan common.Repository, 1)
82+
83+
sc := scanner.NewGiteaScanner()
84+
err = sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
85+
86+
require.NoError(t, err)
87+
assert.Len(t, repositories, 1)
88+
}
89+
90+
func TestGiteaScanner_ScanRepo_private(t *testing.T) {
91+
repo := giteaRepoJSON("myrepo", "myorg/myrepo", "main", true, false, false)
92+
93+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
94+
w.Header().Set("Content-Type", "application/json")
95+
_ = json.NewEncoder(w).Encode(repo)
96+
})
97+
defer ts.Close()
98+
99+
repoURL, err := url.Parse(ts.URL + "/myorg/myrepo")
100+
require.NoError(t, err)
101+
102+
repositories := make(chan common.Repository, 1)
103+
104+
sc := scanner.NewGiteaScanner()
105+
err = sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
106+
107+
require.NoError(t, err)
108+
assert.Empty(t, repositories)
109+
}
110+
111+
func TestGiteaScanner_ScanRepo_archived(t *testing.T) {
112+
repo := giteaRepoJSON("myrepo", "myorg/myrepo", "main", false, true, false)
113+
114+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
115+
w.Header().Set("Content-Type", "application/json")
116+
_ = json.NewEncoder(w).Encode(repo)
117+
})
118+
defer ts.Close()
119+
120+
repoURL, err := url.Parse(ts.URL + "/myorg/myrepo")
121+
require.NoError(t, err)
122+
123+
repositories := make(chan common.Repository, 1)
124+
125+
sc := scanner.NewGiteaScanner()
126+
err = sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
127+
128+
require.NoError(t, err)
129+
assert.Empty(t, repositories)
130+
}
131+
132+
func TestGiteaScanner_ScanRepo_empty(t *testing.T) {
133+
repo := giteaRepoJSON("myrepo", "myorg/myrepo", "", false, false, true)
134+
135+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
136+
w.Header().Set("Content-Type", "application/json")
137+
_ = json.NewEncoder(w).Encode(repo)
138+
})
139+
defer ts.Close()
140+
141+
repoURL, err := url.Parse(ts.URL + "/myorg/myrepo")
142+
require.NoError(t, err)
143+
144+
repositories := make(chan common.Repository, 1)
145+
146+
sc := scanner.NewGiteaScanner()
147+
err = sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
148+
149+
require.NoError(t, err)
150+
assert.Empty(t, repositories)
151+
}
152+
153+
func TestGiteaScanner_ScanRepo_apiError(t *testing.T) {
154+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
155+
w.WriteHeader(http.StatusInternalServerError)
156+
})
157+
defer ts.Close()
158+
159+
repoURL, err := url.Parse(ts.URL + "/myorg/myrepo")
160+
require.NoError(t, err)
161+
162+
repositories := make(chan common.Repository, 1)
163+
164+
sc := scanner.NewGiteaScanner()
165+
err = sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
166+
167+
require.Error(t, err)
168+
assert.Empty(t, repositories)
169+
}
170+
171+
func TestGiteaScanner_ScanRepo_invalidURL(t *testing.T) {
172+
repositories := make(chan common.Repository, 1)
173+
174+
repoURL, _ := url.Parse("http://example.com/onlyone")
175+
176+
sc := scanner.NewGiteaScanner()
177+
err := sc.ScanRepo(*repoURL, giteaPublisher(), repositories)
178+
179+
require.Error(t, err)
180+
}
181+
182+
func TestGiteaScanner_ScanGroupOfRepos_org(t *testing.T) {
183+
repos := []map[string]any{
184+
giteaRepoJSON("repo1", "myorg/repo1", "main", false, false, false),
185+
giteaRepoJSON("repo2", "myorg/repo2", "develop", false, false, false),
186+
}
187+
188+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
189+
switch r.URL.Path {
190+
case "/api/v1/orgs/myorg/repos":
191+
w.Header().Set("Content-Type", "application/json")
192+
_ = json.NewEncoder(w).Encode(repos)
193+
default:
194+
w.WriteHeader(http.StatusNotFound)
195+
}
196+
})
197+
defer ts.Close()
198+
199+
groupURL, err := url.Parse(ts.URL + "/myorg")
200+
require.NoError(t, err)
201+
202+
repositories := make(chan common.Repository, 10)
203+
204+
sc := scanner.NewGiteaScanner()
205+
err = sc.ScanGroupOfRepos(*groupURL, giteaPublisher(), repositories)
206+
207+
require.NoError(t, err)
208+
assert.Len(t, repositories, 2)
209+
}
210+
211+
func TestGiteaScanner_ScanGroupOfRepos_fallbackToUser(t *testing.T) {
212+
repos := []map[string]any{
213+
giteaRepoJSON("repo1", "myuser/repo1", "main", false, false, false),
214+
}
215+
216+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
217+
switch r.URL.Path {
218+
case "/api/v1/orgs/myuser/repos":
219+
// Org not found — fall back to user endpoint.
220+
w.WriteHeader(http.StatusNotFound)
221+
case "/api/v1/users/myuser/repos":
222+
w.Header().Set("Content-Type", "application/json")
223+
_ = json.NewEncoder(w).Encode(repos)
224+
default:
225+
w.WriteHeader(http.StatusNotFound)
226+
}
227+
})
228+
defer ts.Close()
229+
230+
groupURL, err := url.Parse(ts.URL + "/myuser")
231+
require.NoError(t, err)
232+
233+
repositories := make(chan common.Repository, 10)
234+
235+
sc := scanner.NewGiteaScanner()
236+
err = sc.ScanGroupOfRepos(*groupURL, giteaPublisher(), repositories)
237+
238+
require.NoError(t, err)
239+
assert.Len(t, repositories, 1)
240+
}
241+
242+
func TestGiteaScanner_ScanGroupOfRepos_instance(t *testing.T) {
243+
repos := []map[string]any{
244+
giteaRepoJSON("repo1", "org/repo1", "main", false, false, false),
245+
}
246+
247+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
248+
assert.Equal(t, "/api/v1/repos/search", r.URL.Path)
249+
250+
w.Header().Set("Content-Type", "application/json")
251+
_ = json.NewEncoder(w).Encode(map[string]any{"data": repos})
252+
})
253+
defer ts.Close()
254+
255+
// Root URL = scan whole instance.
256+
instanceURL, err := url.Parse(ts.URL)
257+
require.NoError(t, err)
258+
259+
repositories := make(chan common.Repository, 10)
260+
261+
sc := scanner.NewGiteaScanner()
262+
err = sc.ScanGroupOfRepos(*instanceURL, giteaPublisher(), repositories)
263+
264+
require.NoError(t, err)
265+
assert.Len(t, repositories, 1)
266+
}
267+
268+
func TestGiteaScanner_ScanGroupOfRepos_skipsPrivateAndArchived(t *testing.T) {
269+
repos := []map[string]any{
270+
giteaRepoJSON("pub", "org/pub", "main", false, false, false),
271+
giteaRepoJSON("priv", "org/priv", "main", true, false, false),
272+
giteaRepoJSON("arch", "org/arch", "main", false, true, false),
273+
}
274+
275+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
276+
w.Header().Set("Content-Type", "application/json")
277+
_ = json.NewEncoder(w).Encode(repos)
278+
})
279+
defer ts.Close()
280+
281+
groupURL, err := url.Parse(ts.URL + "/org")
282+
require.NoError(t, err)
283+
284+
repositories := make(chan common.Repository, 10)
285+
286+
sc := scanner.NewGiteaScanner()
287+
err = sc.ScanGroupOfRepos(*groupURL, giteaPublisher(), repositories)
288+
289+
require.NoError(t, err)
290+
assert.Len(t, repositories, 1)
291+
292+
got := <-repositories
293+
assert.Equal(t, "org/pub", got.Name)
294+
}
295+
296+
func TestGiteaScanner_ScanGroupOfRepos_pagination(t *testing.T) {
297+
page1 := make([]map[string]any, 50)
298+
for i := range page1 {
299+
name := fmt.Sprintf("repo%d", i)
300+
page1[i] = giteaRepoJSON(name, "org/"+name, "main", false, false, false)
301+
}
302+
303+
page2 := []map[string]any{
304+
giteaRepoJSON("last", "org/last", "main", false, false, false),
305+
}
306+
307+
ts := newGiteaTestServer(t, func(w http.ResponseWriter, r *http.Request) {
308+
w.Header().Set("Content-Type", "application/json")
309+
310+
if r.URL.Query().Get("page") == "2" {
311+
_ = json.NewEncoder(w).Encode(page2)
312+
} else {
313+
_ = json.NewEncoder(w).Encode(page1)
314+
}
315+
})
316+
defer ts.Close()
317+
318+
groupURL, err := url.Parse(ts.URL + "/org")
319+
require.NoError(t, err)
320+
321+
repositories := make(chan common.Repository, 100)
322+
323+
sc := scanner.NewGiteaScanner()
324+
err = sc.ScanGroupOfRepos(*groupURL, giteaPublisher(), repositories)
325+
326+
require.NoError(t, err)
327+
assert.Len(t, repositories, 51)
328+
}

0 commit comments

Comments
 (0)