ScuttleBot

scuttlebot / internal / auth / admin_test.go
Source Blame History 141 lines
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 }

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button