You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.3 KiB
101 lines
2.3 KiB
package auth
|
|
|
|
import (
|
|
"database/sql"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/domagojzecevic/cammonitor/internal/db"
|
|
)
|
|
|
|
func TestStoreAuthenticateHappyPathAndWrongPassword(t *testing.T) {
|
|
database := openTestDB(t)
|
|
store := NewStore(database)
|
|
|
|
if err := store.CreateUser("alice", "secret", false); err != nil {
|
|
t.Fatalf("create user: %v", err)
|
|
}
|
|
|
|
user, err := store.Authenticate("alice", "secret")
|
|
if err != nil {
|
|
t.Fatalf("authenticate valid user: %v", err)
|
|
}
|
|
if user.Username != "alice" {
|
|
t.Fatalf("expected alice, got %q", user.Username)
|
|
}
|
|
if user.IsAdmin {
|
|
t.Fatal("expected regular user")
|
|
}
|
|
|
|
if _, err := store.Authenticate("alice", "wrong"); err == nil {
|
|
t.Fatal("expected wrong password to fail")
|
|
}
|
|
}
|
|
|
|
func TestStoreExpiredSessionIsRejected(t *testing.T) {
|
|
database := openTestDB(t)
|
|
store := NewStore(database)
|
|
|
|
if err := store.CreateUser("alice", "secret", false); err != nil {
|
|
t.Fatalf("create user: %v", err)
|
|
}
|
|
|
|
user, err := store.Authenticate("alice", "secret")
|
|
if err != nil {
|
|
t.Fatalf("authenticate: %v", err)
|
|
}
|
|
|
|
token, err := store.CreateSession(user.ID, -time.Minute)
|
|
if err != nil {
|
|
t.Fatalf("create session: %v", err)
|
|
}
|
|
|
|
if _, err := store.GetSession(token); err == nil {
|
|
t.Fatal("expected expired session to fail")
|
|
}
|
|
}
|
|
|
|
func TestEnsureAdminCreatesFirstRunAdminOnlyWhenEmpty(t *testing.T) {
|
|
database := openTestDB(t)
|
|
store := NewStore(database)
|
|
|
|
if err := store.EnsureAdmin("admin", "secret"); err != nil {
|
|
t.Fatalf("ensure admin: %v", err)
|
|
}
|
|
|
|
users, err := store.ListUsers()
|
|
if err != nil {
|
|
t.Fatalf("list users: %v", err)
|
|
}
|
|
if len(users) != 1 || users[0].Username != "admin" || !users[0].IsAdmin {
|
|
t.Fatalf("unexpected users after bootstrap: %#v", users)
|
|
}
|
|
|
|
if err := store.EnsureAdmin("other", "secret"); err != nil {
|
|
t.Fatalf("ensure admin second run: %v", err)
|
|
}
|
|
|
|
users, err = store.ListUsers()
|
|
if err != nil {
|
|
t.Fatalf("list users second run: %v", err)
|
|
}
|
|
if len(users) != 1 {
|
|
t.Fatalf("expected no second bootstrap user, got %d", len(users))
|
|
}
|
|
}
|
|
|
|
func openTestDB(t *testing.T) *sql.DB {
|
|
t.Helper()
|
|
|
|
database, err := db.Open(t.TempDir() + "/test.db")
|
|
if err != nil {
|
|
t.Fatalf("open database: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
if err := database.Close(); err != nil {
|
|
t.Fatalf("close database: %v", err)
|
|
}
|
|
})
|
|
|
|
return database
|
|
}
|
|
|