package user import ( "os" "path/filepath" "testing" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func setupTestDB(t *testing.T) *gorm.DB { t.Helper() dbPath := filepath.Join("testdata", "users.db") _ = os.Remove(dbPath) db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) if err != nil { t.Fatalf("failed to open db: %v", err) } if err := db.AutoMigrate(&User{}); err != nil { t.Fatalf("failed to migrate: %v", err) } return db } func TestUsersCRUD(t *testing.T) { db := setupTestDB(t) store, err := NewGormUserStore(db) if err != nil { t.Fatalf("failed to create store: %v", err) } service, err := NewService(store) if err != nil { t.Fatalf("failed to create service: %v", err) } user := &User{ Username: "testuser", Email: "test@example.com", Password: "password123", } if err := service.Create(user); err != nil { t.Fatalf("failed to create user: %v", err) } retrieved, err := service.GetByID(user.ID) if err != nil { t.Fatalf("failed to get user by ID: %v", err) } if retrieved.Username != user.Username { t.Fatalf("expected username %s, got %s", user.Username, retrieved.Username) } retrievedByUsername, err := service.GetByUsername(user.Username) if err != nil { t.Fatalf("failed to get user by username: %v", err) } if retrievedByUsername.Email != user.Email { t.Fatalf("expected email %s, got %s", user.Email, retrievedByUsername.Email) } user.Email = "newemail@example.com" if err := service.Update(user); err != nil { t.Fatalf("failed to update user: %v", err) } retrieved, err = service.GetByID(user.ID) if err != nil { t.Fatalf("failed to get user by ID: %v", err) } if retrieved.Email != user.Email { t.Fatalf("expected email %s, got %s", user.Email, retrieved.Email) } err = service.Delete(user.ID) if err != nil { t.Fatalf("failed to delete user: %v", err) } }