Skip to content

Commit d1f6e31

Browse files
committed
chore: better test structure
1 parent be5a49c commit d1f6e31

8 files changed

Lines changed: 300 additions & 215 deletions

File tree

gdrive_config_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"encoding/base64"
6+
"net/http"
7+
"net/http/httptest"
8+
"strings"
9+
"testing"
10+
)
11+
12+
func TestHttpHandlerRoot(t *testing.T) {
13+
h := newHttpHandler(context.Background(), func() {})
14+
req := httptest.NewRequest("GET", "/", nil)
15+
rw := httptest.NewRecorder()
16+
17+
h.ServeHTTP(rw, req)
18+
if rw.Code != http.StatusOK {
19+
t.Errorf("expected 200 OK, got %d", rw.Code)
20+
}
21+
}
22+
23+
func TestHttpHandlerLoginMissingFields(t *testing.T) {
24+
h := newHttpHandler(context.Background(), func() {})
25+
req := httptest.NewRequest("POST", "/login", strings.NewReader(""))
26+
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
27+
rw := httptest.NewRecorder()
28+
29+
h.ServeHTTP(rw, req)
30+
if rw.Code != http.StatusBadRequest {
31+
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
32+
}
33+
}
34+
35+
func TestHttpHandlerAuthInvalidState(t *testing.T) {
36+
h := newHttpHandler(context.Background(), func() {})
37+
req := httptest.NewRequest("GET", "/auth?state=invalid", nil)
38+
rw := httptest.NewRecorder()
39+
40+
h.ServeHTTP(rw, req)
41+
if rw.Code != http.StatusBadRequest {
42+
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
43+
}
44+
}
45+
46+
func TestHttpHandlerGenerateMissingToken(t *testing.T) {
47+
h := newHttpHandler(context.Background(), func() {})
48+
req := httptest.NewRequest("POST", "/generate", nil)
49+
rw := httptest.NewRecorder()
50+
51+
h.ServeHTTP(rw, req)
52+
if rw.Code != http.StatusBadRequest {
53+
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
54+
}
55+
}
56+
57+
func TestHttpHandlerGenerateMissingOidc(t *testing.T) {
58+
h := newHttpHandler(context.Background(), func() {})
59+
req := httptest.NewRequest("POST", "/generate", nil)
60+
req.AddCookie(&http.Cookie{Name: "token", Value: base64.StdEncoding.EncodeToString([]byte("dummy"))})
61+
rw := httptest.NewRecorder()
62+
63+
h.ServeHTTP(rw, req)
64+
if rw.Code != http.StatusBadRequest {
65+
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
66+
}
67+
}

keyring_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/zalando/go-keyring"
8+
)
9+
10+
func TestCredentialGetAndSet(t *testing.T) {
11+
keyring.MockInit()
12+
13+
clientID := "test_client_id"
14+
clientSecret := "test_client_secret"
15+
16+
err := setCredentials(clientID, clientSecret)
17+
assert.NoError(t, err)
18+
19+
retrievedClientID, retrievedClientSecret, err := getCredentials()
20+
assert.NoError(t, err)
21+
assert.Equal(t, clientID, retrievedClientID)
22+
assert.Equal(t, clientSecret, retrievedClientSecret)
23+
}

main_test.go

Lines changed: 44 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -1,176 +1,54 @@
11
package main
22

33
import (
4-
"context"
5-
"encoding/base64"
6-
"net/http"
7-
"net/http/httptest"
8-
"path"
4+
"bytes"
95
"strings"
106
"testing"
117

12-
"github.com/adrg/xdg"
13-
"github.com/coreos/go-systemd/v22/dbus"
148
"github.com/stretchr/testify/assert"
15-
"github.com/zalando/go-keyring"
169
)
1710

18-
func TestHttpHandlerRoot(t *testing.T) {
19-
h := newHttpHandler(context.Background(), func() {})
20-
req := httptest.NewRequest("GET", "/", nil)
21-
rw := httptest.NewRecorder()
22-
23-
h.ServeHTTP(rw, req)
24-
if rw.Code != http.StatusOK {
25-
t.Errorf("expected 200 OK, got %d", rw.Code)
26-
}
27-
}
28-
29-
func TestHttpHandlerLoginMissingFields(t *testing.T) {
30-
h := newHttpHandler(context.Background(), func() {})
31-
req := httptest.NewRequest("POST", "/login", strings.NewReader(""))
32-
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
33-
rw := httptest.NewRecorder()
34-
35-
h.ServeHTTP(rw, req)
36-
if rw.Code != http.StatusBadRequest {
37-
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
38-
}
39-
}
40-
41-
func TestHttpHandlerAuthInvalidState(t *testing.T) {
42-
h := newHttpHandler(context.Background(), func() {})
43-
req := httptest.NewRequest("GET", "/auth?state=invalid", nil)
44-
rw := httptest.NewRecorder()
45-
46-
h.ServeHTTP(rw, req)
47-
if rw.Code != http.StatusBadRequest {
48-
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
49-
}
50-
}
51-
52-
func TestHttpHandlerGenerateMissingToken(t *testing.T) {
53-
h := newHttpHandler(context.Background(), func() {})
54-
req := httptest.NewRequest("POST", "/generate", nil)
55-
rw := httptest.NewRecorder()
56-
57-
h.ServeHTTP(rw, req)
58-
if rw.Code != http.StatusBadRequest {
59-
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
60-
}
61-
}
62-
63-
func TestHttpHandlerGenerateMissingOidc(t *testing.T) {
64-
h := newHttpHandler(context.Background(), func() {})
65-
req := httptest.NewRequest("POST", "/generate", nil)
66-
req.AddCookie(&http.Cookie{Name: "token", Value: base64.StdEncoding.EncodeToString([]byte("dummy"))})
67-
rw := httptest.NewRecorder()
68-
69-
h.ServeHTTP(rw, req)
70-
if rw.Code != http.StatusBadRequest {
71-
t.Errorf("expected 400 Bad Request, got %d", rw.Code)
72-
}
73-
}
74-
75-
func TestCredentialGetAndSet(t *testing.T) {
76-
keyring.MockInit()
77-
78-
clientID := "test_client_id"
79-
clientSecret := "test_client_secret"
80-
81-
err := setCredentials(clientID, clientSecret)
82-
assert.NoError(t, err)
83-
84-
retrievedClientID, retrievedClientSecret, err := getCredentials()
85-
assert.NoError(t, err)
86-
assert.Equal(t, clientID, retrievedClientID)
87-
assert.Equal(t, clientSecret, retrievedClientSecret)
88-
}
89-
90-
func TestSanitizeDriveName(t *testing.T) {
91-
for _, test := range []struct {
92-
input string
93-
expected string
94-
}{
95-
{"My Drive", "My_Drive"},
96-
{"My/Drive", "My_Drive"},
97-
{"My\\Drive", "My_Drive"},
98-
{"My:Drive", "My_Drive"},
99-
{"My?Drive", "My_Drive"},
100-
{"My*Drive", "My_Drive"},
101-
{"My\"Drive", "My_Drive"},
102-
{"My<Drive", "My_Drive"},
103-
{"My>Drive", "My_Drive"},
104-
{"My|Drive", "My_Drive"},
105-
{"My&Drive", "My_Drive"},
106-
} {
107-
result := sanitizeDriveName(test.input)
108-
assert.Equal(t, test.expected, result)
109-
}
110-
}
111-
112-
func TestUnitNameToDriveName(t *testing.T) {
113-
for _, test := range []struct {
114-
input string
115-
expected string
116-
}{
117-
{"rclone@mydrive.service", "mydrive"},
118-
{"rclone@my-drive-1.service", "my-drive-1"},
119-
{"rclone@my_drive_xyz.service", "my_drive_xyz"},
120-
} {
121-
result := unitNameToDriveName(test.input)
122-
assert.Equal(t, test.expected, result)
123-
}
124-
}
125-
126-
func TestDriveNameToUnitName(t *testing.T) {
127-
for _, test := range []struct {
128-
input string
129-
expected string
130-
}{
131-
{"mydrive", "rclone@mydrive.service"},
132-
{"my-drive-1", "rclone@my-drive-1.service"},
133-
{"my_drive_xyz", "rclone@my_drive_xyz.service"},
134-
} {
135-
result := driveNameToUnitName(test.input)
136-
assert.Equal(t, test.expected, result)
137-
}
138-
}
139-
140-
func TestStatusesToServiceStatuses(t *testing.T) {
141-
for _, test := range []struct {
142-
input []dbus.UnitStatus
143-
expected []serviceStatus
144-
}{
145-
{
146-
input: []dbus.UnitStatus{
147-
{
148-
Name: "rclone@test.service",
149-
Description: "Test Service",
150-
ActiveState: "active",
151-
},
152-
{
153-
Name: "rclone@my_drive.service",
154-
Description: "My Drive Service",
155-
ActiveState: "inactive",
156-
},
157-
},
158-
expected: []serviceStatus{
159-
{
160-
Name: "test",
161-
Status: "active",
162-
MountPath: path.Join(xdg.Home, "google", "test"),
163-
},
164-
{
165-
Name: "my_drive",
166-
Status: "inactive",
167-
MountPath: path.Join(xdg.Home, "google", "my_drive"),
168-
},
169-
},
170-
},
171-
} {
172-
result := statusesToServiceStatuses(test.input)
173-
assert.Equal(t, test.expected, result)
174-
}
175-
11+
func TestRootCmd_UsageAndShort(t *testing.T) {
12+
assert.Equal(t, "adfinis-rclone-mgr", rootCmd.Use)
13+
assert.Contains(t, rootCmd.Short, "Google Drive")
14+
assert.Equal(t, Version, rootCmd.Version)
15+
}
16+
17+
func TestRootCmd_HasSubcommands(t *testing.T) {
18+
subNames := []string{}
19+
for _, c := range rootCmd.Commands() {
20+
subNames = append(subNames, c.Name())
21+
}
22+
expected := []string{
23+
"gdrive-config",
24+
"mount",
25+
"umount",
26+
"ls",
27+
"version",
28+
}
29+
for _, name := range expected {
30+
assert.Contains(t, subNames, name)
31+
}
32+
}
33+
34+
func TestRootCmd_HelpOutput(t *testing.T) {
35+
buf := new(bytes.Buffer)
36+
rootCmd.SetOut(buf)
37+
rootCmd.SetArgs([]string{})
38+
_ = rootCmd.Execute()
39+
out := buf.String()
40+
assert.Contains(t, out, "Manage rclone mounts")
41+
assert.Contains(t, out, "Usage:")
42+
assert.Contains(t, out, "Available Commands:")
43+
}
44+
45+
func TestRootCmd_UnknownCommand(t *testing.T) {
46+
buf := new(bytes.Buffer)
47+
rootCmd.SetOut(buf)
48+
rootCmd.SetErr(buf)
49+
rootCmd.SetArgs([]string{"doesnotexist"})
50+
err := rootCmd.Execute()
51+
assert.Error(t, err)
52+
out := buf.String()
53+
assert.True(t, strings.Contains(out, "unknown command") || strings.Contains(out, "Usage:"))
17654
}

mount.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"fmt"
77
"log"
88
"os"
9-
"strings"
109

1110
"github.com/charmbracelet/lipgloss"
1211
"github.com/charmbracelet/lipgloss/table"
@@ -188,13 +187,3 @@ func renderYAML(statuses []dbus.UnitStatus) {
188187
}
189188
fmt.Println(string(yamlData))
190189
}
191-
192-
func unitNameToDriveName(name string) string {
193-
name = strings.Split(name, "@")[1]
194-
name = strings.Split(name, ".service")[0]
195-
return name
196-
}
197-
198-
func driveNameToUnitName(name string) string {
199-
return fmt.Sprintf("rclone@%s.service", name)
200-
}

rclone.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"context"
55
"fmt"
6-
"strings"
76

87
"log"
98

@@ -20,25 +19,6 @@ func init() {
2019
configfile.Install()
2120
}
2221

23-
// dont ask...
24-
func sanitizeDriveName(name string) string {
25-
name = strings.TrimSpace(name)
26-
name = strings.ReplaceAll(name, " ", "_")
27-
name = strings.ReplaceAll(name, "/", "_")
28-
name = strings.ReplaceAll(name, "\\", "_")
29-
name = strings.ReplaceAll(name, ":", "_")
30-
name = strings.ReplaceAll(name, "?", "_")
31-
name = strings.ReplaceAll(name, "*", "_")
32-
name = strings.ReplaceAll(name, "\"", "_")
33-
name = strings.ReplaceAll(name, "<", "_")
34-
name = strings.ReplaceAll(name, ">", "_")
35-
name = strings.ReplaceAll(name, "|", "_")
36-
name = strings.ReplaceAll(name, "'", "_")
37-
name = strings.ReplaceAll(name, "&", "_")
38-
name = strings.ReplaceAll(name, "%", "_")
39-
return name
40-
}
41-
4222
func handleRcloneConfig(ctx context.Context, drives []models.Drive, clientID, clientSecret, token string) error {
4323
// add drives
4424
for _, drive := range drives {

0 commit comments

Comments
 (0)