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) } }