Phase 4 — P4-03/04: RBAC + user management #14
@@ -0,0 +1,58 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
stdhttp "net/http"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/oklog/ulid/v2"
|
||||
|
||||
"gitea.dcglab.co.uk/steve/restic-manager/internal/auth"
|
||||
"gitea.dcglab.co.uk/steve/restic-manager/internal/store"
|
||||
)
|
||||
|
||||
// makeUser inserts a user with a known password ('test-password').
|
||||
// Returns the user id. Used by RBAC middleware tests + the
|
||||
// user-management handler tests.
|
||||
//
|
||||
//nolint:unused
|
||||
func makeUser(t *testing.T, srv *Server, username string, role store.Role) string {
|
||||
t.Helper()
|
||||
id := ulid.Make().String()
|
||||
hash, err := auth.HashPassword("test-password")
|
||||
if err != nil {
|
||||
t.Fatalf("hash: %v", err)
|
||||
}
|
||||
if err := srv.deps.Store.CreateUser(t.Context(), store.User{
|
||||
ID: id, Username: username, PasswordHash: hash,
|
||||
Role: role, CreatedAt: time.Now().UTC(),
|
||||
}); err != nil {
|
||||
t.Fatalf("create user %s: %v", username, err)
|
||||
}
|
||||
return id
|
||||
}
|
||||
|
||||
// loginAs gets a session cookie for the given user. Skips the real
|
||||
// /api/auth/login handler for speed and to keep these helpers usable
|
||||
// even when login validation is mid-flight elsewhere.
|
||||
//
|
||||
//nolint:unused
|
||||
func loginAs(t *testing.T, srv *Server, userID string) *stdhttp.Cookie {
|
||||
t.Helper()
|
||||
rawToken, err := auth.NewToken()
|
||||
if err != nil {
|
||||
t.Fatalf("token: %v", err)
|
||||
}
|
||||
hash := auth.HashToken(rawToken)
|
||||
now := time.Now().UTC()
|
||||
if err := srv.deps.Store.CreateSession(t.Context(), store.Session{
|
||||
ID: hash, UserID: userID, CreatedAt: now,
|
||||
ExpiresAt: now.Add(8 * time.Hour),
|
||||
}, hash); err != nil {
|
||||
t.Fatalf("session: %v", err)
|
||||
}
|
||||
return &stdhttp.Cookie{
|
||||
Name: sessionCookieName,
|
||||
Value: rawToken,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user