|
5ac549c…
|
lmata
|
1 |
package auth_test |
|
5ac549c…
|
lmata
|
2 |
|
|
5ac549c…
|
lmata
|
3 |
import ( |
|
5ac549c…
|
lmata
|
4 |
"path/filepath" |
|
5ac549c…
|
lmata
|
5 |
"testing" |
|
5ac549c…
|
lmata
|
6 |
|
|
5ac549c…
|
lmata
|
7 |
"github.com/conflicthq/scuttlebot/internal/auth" |
|
5ac549c…
|
lmata
|
8 |
) |
|
5ac549c…
|
lmata
|
9 |
|
|
5ac549c…
|
lmata
|
10 |
func newStore(t *testing.T) *auth.AdminStore { |
|
5ac549c…
|
lmata
|
11 |
t.Helper() |
|
5ac549c…
|
lmata
|
12 |
s, err := auth.NewAdminStore(filepath.Join(t.TempDir(), "admins.json")) |
|
5ac549c…
|
lmata
|
13 |
if err != nil { |
|
5ac549c…
|
lmata
|
14 |
t.Fatalf("NewAdminStore: %v", err) |
|
5ac549c…
|
lmata
|
15 |
} |
|
5ac549c…
|
lmata
|
16 |
return s |
|
5ac549c…
|
lmata
|
17 |
} |
|
5ac549c…
|
lmata
|
18 |
|
|
5ac549c…
|
lmata
|
19 |
func TestIsEmptyInitially(t *testing.T) { |
|
5ac549c…
|
lmata
|
20 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
21 |
if !s.IsEmpty() { |
|
5ac549c…
|
lmata
|
22 |
t.Error("expected empty store") |
|
5ac549c…
|
lmata
|
23 |
} |
|
5ac549c…
|
lmata
|
24 |
} |
|
5ac549c…
|
lmata
|
25 |
|
|
5ac549c…
|
lmata
|
26 |
func TestAddAndAuthenticate(t *testing.T) { |
|
5ac549c…
|
lmata
|
27 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
28 |
if err := s.Add("alice", "s3cr3t"); err != nil { |
|
5ac549c…
|
lmata
|
29 |
t.Fatalf("Add: %v", err) |
|
5ac549c…
|
lmata
|
30 |
} |
|
5ac549c…
|
lmata
|
31 |
if !s.Authenticate("alice", "s3cr3t") { |
|
5ac549c…
|
lmata
|
32 |
t.Error("expected Authenticate to return true for correct credentials") |
|
5ac549c…
|
lmata
|
33 |
} |
|
5ac549c…
|
lmata
|
34 |
if s.Authenticate("alice", "wrong") { |
|
5ac549c…
|
lmata
|
35 |
t.Error("expected Authenticate to return false for wrong password") |
|
5ac549c…
|
lmata
|
36 |
} |
|
5ac549c…
|
lmata
|
37 |
if s.Authenticate("nobody", "s3cr3t") { |
|
5ac549c…
|
lmata
|
38 |
t.Error("expected Authenticate to return false for unknown user") |
|
5ac549c…
|
lmata
|
39 |
} |
|
5ac549c…
|
lmata
|
40 |
} |
|
5ac549c…
|
lmata
|
41 |
|
|
5ac549c…
|
lmata
|
42 |
func TestAddDuplicateReturnsError(t *testing.T) { |
|
5ac549c…
|
lmata
|
43 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
44 |
if err := s.Add("alice", "pass1"); err != nil { |
|
5ac549c…
|
lmata
|
45 |
t.Fatalf("first Add: %v", err) |
|
5ac549c…
|
lmata
|
46 |
} |
|
5ac549c…
|
lmata
|
47 |
if err := s.Add("alice", "pass2"); err == nil { |
|
5ac549c…
|
lmata
|
48 |
t.Error("expected error on duplicate Add") |
|
5ac549c…
|
lmata
|
49 |
} |
|
5ac549c…
|
lmata
|
50 |
} |
|
5ac549c…
|
lmata
|
51 |
|
|
5ac549c…
|
lmata
|
52 |
func TestIsEmptyAfterAdd(t *testing.T) { |
|
5ac549c…
|
lmata
|
53 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
54 |
_ = s.Add("admin", "pw") |
|
5ac549c…
|
lmata
|
55 |
if s.IsEmpty() { |
|
5ac549c…
|
lmata
|
56 |
t.Error("expected non-empty store after Add") |
|
5ac549c…
|
lmata
|
57 |
} |
|
5ac549c…
|
lmata
|
58 |
} |
|
5ac549c…
|
lmata
|
59 |
|
|
5ac549c…
|
lmata
|
60 |
func TestList(t *testing.T) { |
|
5ac549c…
|
lmata
|
61 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
62 |
_ = s.Add("alice", "pw") |
|
5ac549c…
|
lmata
|
63 |
_ = s.Add("bob", "pw") |
|
5ac549c…
|
lmata
|
64 |
|
|
5ac549c…
|
lmata
|
65 |
list := s.List() |
|
5ac549c…
|
lmata
|
66 |
if len(list) != 2 { |
|
5ac549c…
|
lmata
|
67 |
t.Fatalf("List: got %d, want 2", len(list)) |
|
5ac549c…
|
lmata
|
68 |
} |
|
5ac549c…
|
lmata
|
69 |
names := map[string]bool{list[0].Username: true, list[1].Username: true} |
|
5ac549c…
|
lmata
|
70 |
if !names["alice"] || !names["bob"] { |
|
5ac549c…
|
lmata
|
71 |
t.Errorf("List: unexpected names %v", names) |
|
5ac549c…
|
lmata
|
72 |
} |
|
5ac549c…
|
lmata
|
73 |
} |
|
5ac549c…
|
lmata
|
74 |
|
|
5ac549c…
|
lmata
|
75 |
func TestSetPassword(t *testing.T) { |
|
5ac549c…
|
lmata
|
76 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
77 |
_ = s.Add("alice", "old") |
|
5ac549c…
|
lmata
|
78 |
|
|
5ac549c…
|
lmata
|
79 |
if err := s.SetPassword("alice", "new"); err != nil { |
|
5ac549c…
|
lmata
|
80 |
t.Fatalf("SetPassword: %v", err) |
|
5ac549c…
|
lmata
|
81 |
} |
|
5ac549c…
|
lmata
|
82 |
if s.Authenticate("alice", "old") { |
|
5ac549c…
|
lmata
|
83 |
t.Error("old password should no longer work") |
|
5ac549c…
|
lmata
|
84 |
} |
|
5ac549c…
|
lmata
|
85 |
if !s.Authenticate("alice", "new") { |
|
5ac549c…
|
lmata
|
86 |
t.Error("new password should work") |
|
5ac549c…
|
lmata
|
87 |
} |
|
5ac549c…
|
lmata
|
88 |
} |
|
5ac549c…
|
lmata
|
89 |
|
|
5ac549c…
|
lmata
|
90 |
func TestSetPasswordUnknownUser(t *testing.T) { |
|
5ac549c…
|
lmata
|
91 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
92 |
if err := s.SetPassword("nobody", "pw"); err == nil { |
|
5ac549c…
|
lmata
|
93 |
t.Error("expected error setting password for unknown user") |
|
5ac549c…
|
lmata
|
94 |
} |
|
5ac549c…
|
lmata
|
95 |
} |
|
5ac549c…
|
lmata
|
96 |
|
|
5ac549c…
|
lmata
|
97 |
func TestRemove(t *testing.T) { |
|
5ac549c…
|
lmata
|
98 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
99 |
_ = s.Add("alice", "pw") |
|
5ac549c…
|
lmata
|
100 |
_ = s.Add("bob", "pw") |
|
5ac549c…
|
lmata
|
101 |
|
|
5ac549c…
|
lmata
|
102 |
if err := s.Remove("alice"); err != nil { |
|
5ac549c…
|
lmata
|
103 |
t.Fatalf("Remove: %v", err) |
|
5ac549c…
|
lmata
|
104 |
} |
|
5ac549c…
|
lmata
|
105 |
if len(s.List()) != 1 { |
|
5ac549c…
|
lmata
|
106 |
t.Errorf("List after Remove: got %d, want 1", len(s.List())) |
|
5ac549c…
|
lmata
|
107 |
} |
|
5ac549c…
|
lmata
|
108 |
if s.List()[0].Username != "bob" { |
|
5ac549c…
|
lmata
|
109 |
t.Errorf("expected bob to remain, got %q", s.List()[0].Username) |
|
5ac549c…
|
lmata
|
110 |
} |
|
5ac549c…
|
lmata
|
111 |
} |
|
5ac549c…
|
lmata
|
112 |
|
|
5ac549c…
|
lmata
|
113 |
func TestRemoveUnknown(t *testing.T) { |
|
5ac549c…
|
lmata
|
114 |
s := newStore(t) |
|
5ac549c…
|
lmata
|
115 |
if err := s.Remove("nobody"); err == nil { |
|
5ac549c…
|
lmata
|
116 |
t.Error("expected error removing unknown user") |
|
5ac549c…
|
lmata
|
117 |
} |
|
5ac549c…
|
lmata
|
118 |
} |
|
5ac549c…
|
lmata
|
119 |
|
|
5ac549c…
|
lmata
|
120 |
func TestPersistence(t *testing.T) { |
|
5ac549c…
|
lmata
|
121 |
dir := t.TempDir() |
|
5ac549c…
|
lmata
|
122 |
path := filepath.Join(dir, "admins.json") |
|
5ac549c…
|
lmata
|
123 |
|
|
5ac549c…
|
lmata
|
124 |
s1, err := auth.NewAdminStore(path) |
|
5ac549c…
|
lmata
|
125 |
if err != nil { |
|
5ac549c…
|
lmata
|
126 |
t.Fatalf("create: %v", err) |
|
5ac549c…
|
lmata
|
127 |
} |
|
5ac549c…
|
lmata
|
128 |
_ = s1.Add("alice", "s3cr3t") |
|
5ac549c…
|
lmata
|
129 |
|
|
5ac549c…
|
lmata
|
130 |
// Load a new store from the same file. |
|
5ac549c…
|
lmata
|
131 |
s2, err := auth.NewAdminStore(path) |
|
5ac549c…
|
lmata
|
132 |
if err != nil { |
|
5ac549c…
|
lmata
|
133 |
t.Fatalf("reload: %v", err) |
|
5ac549c…
|
lmata
|
134 |
} |
|
5ac549c…
|
lmata
|
135 |
if s2.IsEmpty() { |
|
5ac549c…
|
lmata
|
136 |
t.Error("reloaded store should not be empty") |
|
5ac549c…
|
lmata
|
137 |
} |
|
5ac549c…
|
lmata
|
138 |
if !s2.Authenticate("alice", "s3cr3t") { |
|
5ac549c…
|
lmata
|
139 |
t.Error("reloaded store should authenticate alice") |
|
5ac549c…
|
lmata
|
140 |
} |
|
5ac549c…
|
lmata
|
141 |
} |