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

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
}