74 lines
2.5 KiB
Go
74 lines
2.5 KiB
Go
package auth
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
appdb "github.com/example/sndit/backend/internal/db"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func TestRegisterLoginAndSession(t *testing.T) {
|
|
ctx := context.Background()
|
|
database, err := appdb.New(ctx, "sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("open sqlite database: %v", err)
|
|
}
|
|
defer database.Close()
|
|
if _, err := database.ExecContext(ctx, `
|
|
CREATE TABLE users (
|
|
id TEXT PRIMARY KEY NOT NULL,
|
|
email TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
`); err != nil {
|
|
t.Fatalf("create users table: %v", err)
|
|
}
|
|
|
|
service, err := NewService(NewRepository(database), "test-session-secret-that-is-long-enough", false)
|
|
if err != nil {
|
|
t.Fatalf("create auth service: %v", err)
|
|
}
|
|
user, err := service.Register(ctx, "Photographer@Example.com", "DemoPassword123!", "Noah Bianchi")
|
|
if err != nil {
|
|
t.Fatalf("register user: %v", err)
|
|
}
|
|
if user.Email != "photographer@example.com" {
|
|
t.Fatalf("email was not normalized: %q", user.Email)
|
|
}
|
|
loggedIn, err := service.Login(ctx, "PHOTOGRAPHER@example.com", "DemoPassword123!")
|
|
if err != nil || loggedIn.ID != user.ID {
|
|
t.Fatalf("login failed: user=%+v err=%v", loggedIn, err)
|
|
}
|
|
updated, err := service.UpdateProfile(ctx, user.ID, "updated@example.com", "Updated Studio")
|
|
if err != nil || updated.Email != "updated@example.com" || updated.Name != "Updated Studio" {
|
|
t.Fatalf("profile update failed: user=%+v err=%v", updated, err)
|
|
}
|
|
if err := service.ChangePassword(ctx, user.ID, "DemoPassword123!", "NewPassword123!"); err != nil {
|
|
t.Fatalf("password update failed: %v", err)
|
|
}
|
|
if _, err := service.Login(ctx, "updated@example.com", "DemoPassword123!"); !errors.Is(err, ErrInvalidCredentials) {
|
|
t.Fatalf("old password should be invalid, got %v", err)
|
|
}
|
|
if _, err := service.Login(ctx, "updated@example.com", "NewPassword123!"); err != nil {
|
|
t.Fatalf("new password should work: %v", err)
|
|
}
|
|
|
|
recorder := httptest.NewRecorder()
|
|
ginContext, _ := gin.CreateTestContext(recorder)
|
|
ginContext.Request = httptest.NewRequest(http.MethodGet, "/api/auth/me", nil)
|
|
service.SetSession(ginContext, user)
|
|
request := httptest.NewRequest(http.MethodGet, "/api/auth/me", nil)
|
|
request.AddCookie(recorder.Result().Cookies()[0])
|
|
fromSession, err := service.UserFromRequest(ctx, request)
|
|
if err != nil || fromSession.ID != user.ID {
|
|
t.Fatalf("session lookup failed: user=%+v err=%v", fromSession, err)
|
|
}
|
|
}
|