Skip to content

Commit cac03ae

Browse files
committed
Improve test coverage for filter, submit, show and search
1 parent 376a1f1 commit cac03ae

6 files changed

Lines changed: 324 additions & 0 deletions

File tree

cmd/search_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,32 @@ func TestSearchPackages(t *testing.T) {
2525
}
2626
linesContainsPackageStatistic(t, strings.Split(output, "\n"), []string{"php", "php-fpm"})
2727
}
28+
29+
func TestSearchRequiresArgument(t *testing.T) {
30+
_, err := pkgstats(t, []string{"search"})
31+
if err == nil {
32+
t.Fatal("Expected error when no argument provided")
33+
}
34+
}
35+
36+
func TestSearchRejectsInvalidPackageName(t *testing.T) {
37+
_, err := pkgstats(t, []string{"search", "ö"})
38+
if err == nil {
39+
t.Fatal("Expected error for invalid package name")
40+
}
41+
}
42+
43+
func TestSearchRejectsInvalidLimit(t *testing.T) {
44+
_, err := pkgstats(t, []string{"search", "--limit", "0", "php"})
45+
if err == nil {
46+
t.Fatal("Expected error for limit below minimum")
47+
}
48+
}
49+
50+
func TestSearchWithCustomLimit(t *testing.T) {
51+
output, err := pkgstats(t, []string{"search", "--limit", "5", "php"})
52+
if err != nil {
53+
t.Fatalf("Failed to run command: %v", err)
54+
}
55+
linesContainsPackageStatistic(t, strings.Split(output, "\n"), []string{"php"})
56+
}

cmd/show_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,25 @@ func TestShowPackages(t *testing.T) {
1212
}
1313
linesContainsPackageStatistic(t, strings.Split(output, "\n"), []string{"php", "pacman"})
1414
}
15+
16+
func TestShowRequiresArguments(t *testing.T) {
17+
_, err := pkgstats(t, []string{"show"})
18+
if err == nil {
19+
t.Fatal("Expected error when no arguments provided")
20+
}
21+
}
22+
23+
func TestShowRejectsInvalidPackageName(t *testing.T) {
24+
_, err := pkgstats(t, []string{"show", "ö"})
25+
if err == nil {
26+
t.Fatal("Expected error for invalid package name")
27+
}
28+
}
29+
30+
func TestShowSinglePackage(t *testing.T) {
31+
output, err := pkgstats(t, []string{"show", "php"})
32+
if err != nil {
33+
t.Fatalf("Failed to run command: %v", err)
34+
}
35+
linesContainsPackageStatistic(t, strings.Split(output, "\n"), []string{"php"})
36+
}

cmd/submit_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,16 @@ func TestSendInformation(t *testing.T) {
166166
t.Errorf("Expected 'Data were successfully sent', got %s", lines[2])
167167
}
168168
}
169+
170+
func TestShowConfigHelp(t *testing.T) {
171+
output, err := pkgstats(t, []string{"submit", "--config-help"})
172+
if err != nil {
173+
t.Fatalf("Failed to run command: %v", err)
174+
}
175+
if !strings.Contains(output, "blocklist") {
176+
t.Errorf("Expected config help to mention blocklist, got %s", output)
177+
}
178+
if !strings.Contains(output, "/etc/pkgstats.yaml") {
179+
t.Errorf("Expected config help to mention config path, got %s", output)
180+
}
181+
}

cmd/testhelper_pacman_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ func createPacmanDBPath(t *testing.T) string {
4545
"pacman-1.0-1",
4646
"pacman-mirrorlist-2.0-2",
4747
"secret-package-1.0.0-1",
48+
"my-app-dev-2.0-1",
49+
"app-123.pkg-1.0-1",
4850
}
4951

5052
for _, dir := range subdirs {
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package submit_test
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"pkgstats-cli/internal/api/submit"
8+
)
9+
10+
type mockPackageManager struct {
11+
packages []string
12+
server string
13+
pkgErr error
14+
srvErr error
15+
}
16+
17+
func (m *mockPackageManager) GetInstalledPackages() ([]string, error) {
18+
return m.packages, m.pkgErr
19+
}
20+
21+
func (m *mockPackageManager) GetServer() (string, error) {
22+
return m.server, m.srvErr
23+
}
24+
25+
type mockSystemInfo struct {
26+
cpuArch string
27+
arch string
28+
osId string
29+
cpuErr error
30+
archErr error
31+
osErr error
32+
}
33+
34+
func (m *mockSystemInfo) GetCpuArchitecture() (string, error) {
35+
return m.cpuArch, m.cpuErr
36+
}
37+
38+
func (m *mockSystemInfo) GetArchitecture() (string, error) {
39+
return m.arch, m.archErr
40+
}
41+
42+
func (m *mockSystemInfo) GetOSId() (string, error) {
43+
return m.osId, m.osErr
44+
}
45+
46+
func TestCreateRequest(t *testing.T) {
47+
pm := &mockPackageManager{
48+
packages: []string{"pacman", "linux"},
49+
server: "https://mirror.example.com/",
50+
}
51+
si := &mockSystemInfo{
52+
cpuArch: "x86_64",
53+
arch: "x86_64",
54+
osId: "linux",
55+
}
56+
57+
req, err := submit.CreateRequest(pm, si)
58+
if err != nil {
59+
t.Fatal(err)
60+
}
61+
62+
if req.Version != submit.Version {
63+
t.Errorf("Expected version %s, got %s", submit.Version, req.Version)
64+
}
65+
if req.System.Architecture != "x86_64" {
66+
t.Errorf("Expected system architecture x86_64, got %s", req.System.Architecture)
67+
}
68+
if req.OS.Architecture != "x86_64" {
69+
t.Errorf("Expected OS architecture x86_64, got %s", req.OS.Architecture)
70+
}
71+
if req.OS.Id != "linux" {
72+
t.Errorf("Expected OS id linux, got %s", req.OS.Id)
73+
}
74+
if req.Pacman.Mirror != "https://mirror.example.com/" {
75+
t.Errorf("Expected mirror https://mirror.example.com/, got %s", req.Pacman.Mirror)
76+
}
77+
if len(req.Pacman.Packages) != 2 {
78+
t.Errorf("Expected 2 packages, got %d", len(req.Pacman.Packages))
79+
}
80+
}
81+
82+
func TestCreateRequestReturnsErrorOnPackageFailure(t *testing.T) {
83+
pm := &mockPackageManager{pkgErr: errors.New("pacman error")}
84+
si := &mockSystemInfo{}
85+
86+
_, err := submit.CreateRequest(pm, si)
87+
if err == nil {
88+
t.Fatal("Expected error")
89+
}
90+
}
91+
92+
func TestCreateRequestReturnsErrorOnServerFailure(t *testing.T) {
93+
pm := &mockPackageManager{packages: []string{"pacman"}, srvErr: errors.New("server error")}
94+
si := &mockSystemInfo{}
95+
96+
_, err := submit.CreateRequest(pm, si)
97+
if err == nil {
98+
t.Fatal("Expected error")
99+
}
100+
}
101+
102+
func TestCreateRequestReturnsErrorOnCpuArchFailure(t *testing.T) {
103+
pm := &mockPackageManager{packages: []string{"pacman"}, server: "https://mirror.example.com/"}
104+
si := &mockSystemInfo{cpuErr: errors.New("cpu error")}
105+
106+
_, err := submit.CreateRequest(pm, si)
107+
if err == nil {
108+
t.Fatal("Expected error")
109+
}
110+
}
111+
112+
func TestCreateRequestReturnsErrorOnArchFailure(t *testing.T) {
113+
pm := &mockPackageManager{packages: []string{"pacman"}, server: "https://mirror.example.com/"}
114+
si := &mockSystemInfo{cpuArch: "x86_64", archErr: errors.New("arch error")}
115+
116+
_, err := submit.CreateRequest(pm, si)
117+
if err == nil {
118+
t.Fatal("Expected error")
119+
}
120+
}
121+
122+
func TestCreateRequestReturnsErrorOnOSIdFailure(t *testing.T) {
123+
pm := &mockPackageManager{packages: []string{"pacman"}, server: "https://mirror.example.com/"}
124+
si := &mockSystemInfo{cpuArch: "x86_64", arch: "x86_64", osErr: errors.New("os error")}
125+
126+
_, err := submit.CreateRequest(pm, si)
127+
if err == nil {
128+
t.Fatal("Expected error")
129+
}
130+
}

internal/filter/filter_test.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package filter_test
2+
3+
import (
4+
"testing"
5+
6+
"pkgstats-cli/internal/api/submit"
7+
"pkgstats-cli/internal/config"
8+
"pkgstats-cli/internal/filter"
9+
)
10+
11+
func TestFilterRequestRemovesBlockedPackages(t *testing.T) {
12+
conf := &config.Config{}
13+
conf.Blocklist.Packages = []string{"secret-*"}
14+
15+
req := &submit.Request{
16+
Pacman: submit.Pacman{
17+
Packages: []string{"pacman", "secret-pkg", "linux"},
18+
Mirror: "http://example.com/",
19+
},
20+
}
21+
22+
if err := filter.FilterRequest(conf, req); err != nil {
23+
t.Fatal(err)
24+
}
25+
26+
if len(req.Pacman.Packages) != 2 {
27+
t.Fatalf("Expected 2 packages, got %d: %v", len(req.Pacman.Packages), req.Pacman.Packages)
28+
}
29+
for _, pkg := range req.Pacman.Packages {
30+
if pkg == "secret-pkg" {
31+
t.Error("Expected secret-pkg to be filtered")
32+
}
33+
}
34+
}
35+
36+
func TestFilterRequestClearsBlockedMirror(t *testing.T) {
37+
conf := &config.Config{}
38+
conf.Blocklist.Mirrors = []string{"private.lan"}
39+
40+
req := &submit.Request{
41+
Pacman: submit.Pacman{
42+
Packages: []string{"pacman"},
43+
Mirror: "http://private.lan/archlinux",
44+
},
45+
}
46+
47+
if err := filter.FilterRequest(conf, req); err != nil {
48+
t.Fatal(err)
49+
}
50+
51+
if req.Pacman.Mirror != "" {
52+
t.Errorf("Expected mirror to be cleared, got %s", req.Pacman.Mirror)
53+
}
54+
}
55+
56+
func TestFilterRequestKeepsUnblockedMirror(t *testing.T) {
57+
conf := &config.Config{}
58+
conf.Blocklist.Mirrors = []string{"private.lan"}
59+
60+
mirror := "http://public.example.com/archlinux"
61+
req := &submit.Request{
62+
Pacman: submit.Pacman{
63+
Packages: []string{"pacman"},
64+
Mirror: mirror,
65+
},
66+
}
67+
68+
if err := filter.FilterRequest(conf, req); err != nil {
69+
t.Fatal(err)
70+
}
71+
72+
if req.Pacman.Mirror != mirror {
73+
t.Errorf("Expected mirror to remain %s, got %s", mirror, req.Pacman.Mirror)
74+
}
75+
}
76+
77+
func TestFilterRequestWithEmptyConfig(t *testing.T) {
78+
conf := &config.Config{}
79+
req := &submit.Request{
80+
Pacman: submit.Pacman{
81+
Packages: []string{"pacman", "linux"},
82+
Mirror: "http://example.com/",
83+
},
84+
}
85+
86+
if err := filter.FilterRequest(conf, req); err != nil {
87+
t.Fatal(err)
88+
}
89+
90+
if len(req.Pacman.Packages) != 2 {
91+
t.Errorf("Expected 2 packages, got %d", len(req.Pacman.Packages))
92+
}
93+
if req.Pacman.Mirror != "http://example.com/" {
94+
t.Errorf("Expected mirror unchanged, got %s", req.Pacman.Mirror)
95+
}
96+
}
97+
98+
func TestFilterRequestReturnsErrorOnInvalidPackagePattern(t *testing.T) {
99+
conf := &config.Config{}
100+
conf.Blocklist.Packages = []string{"["}
101+
102+
req := &submit.Request{
103+
Pacman: submit.Pacman{
104+
Packages: []string{"pacman"},
105+
Mirror: "http://example.com/",
106+
},
107+
}
108+
109+
if err := filter.FilterRequest(conf, req); err == nil {
110+
t.Error("Expected error for invalid glob pattern")
111+
}
112+
}
113+
114+
func TestFilterRequestReturnsErrorOnInvalidMirrorPattern(t *testing.T) {
115+
conf := &config.Config{}
116+
conf.Blocklist.Mirrors = []string{"["}
117+
118+
req := &submit.Request{
119+
Pacman: submit.Pacman{
120+
Packages: []string{"pacman"},
121+
Mirror: "http://example.com/",
122+
},
123+
}
124+
125+
if err := filter.FilterRequest(conf, req); err == nil {
126+
t.Error("Expected error for invalid glob pattern")
127+
}
128+
}

0 commit comments

Comments
 (0)