Compare commits
2 Commits
457b5c88e2
...
86d4835ccf
| Author | SHA1 | Date | |
|---|---|---|---|
| 86d4835ccf | |||
| feddb2ed43 |
@@ -236,44 +236,28 @@ func seedDatabase(userRepo repositories.UserRepository, postRepo repositories.Po
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func findExistingSeedUser(userRepo repositories.UserRepository) (*database.User, error) {
|
const (
|
||||||
user, err := userRepo.GetByUsernamePrefix("seed_admin_")
|
seedUsername = "seed_admin"
|
||||||
if err != nil {
|
seedEmail = "seed_admin@goyco.local"
|
||||||
return nil, fmt.Errorf("no existing seed user found")
|
)
|
||||||
}
|
|
||||||
return user, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func ensureSeedUser(userRepo repositories.UserRepository, passwordHash string) (*database.User, error) {
|
func ensureSeedUser(userRepo repositories.UserRepository, passwordHash string) (*database.User, error) {
|
||||||
existingUser, err := findExistingSeedUser(userRepo)
|
if user, err := userRepo.GetByUsername(seedUsername); err == nil {
|
||||||
if err == nil && existingUser != nil {
|
|
||||||
return existingUser, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
randomID := generateRandomIdentifier()
|
|
||||||
seedUsername := fmt.Sprintf("seed_admin_%s", randomID)
|
|
||||||
seedEmail := fmt.Sprintf("seed_admin_%s@goyco.local", randomID)
|
|
||||||
|
|
||||||
const maxRetries = 10
|
|
||||||
for range maxRetries {
|
|
||||||
user := &database.User{
|
|
||||||
Username: seedUsername,
|
|
||||||
Email: seedEmail,
|
|
||||||
Password: passwordHash,
|
|
||||||
EmailVerified: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := userRepo.Create(user); err != nil {
|
|
||||||
randomID = generateRandomIdentifier()
|
|
||||||
seedUsername = fmt.Sprintf("seed_admin_%s", randomID)
|
|
||||||
seedEmail = fmt.Sprintf("seed_admin_%s@goyco.local", randomID)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("failed to create seed user after %d attempts", maxRetries)
|
user := &database.User{
|
||||||
|
Username: seedUsername,
|
||||||
|
Email: seedEmail,
|
||||||
|
Password: passwordHash,
|
||||||
|
EmailVerified: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := userRepo.Create(user); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create seed user: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getVoteCounts(voteRepo repositories.VoteRepository, postID uint) (int, int, error) {
|
func getVoteCounts(voteRepo repositories.VoteRepository, postID uint) (int, int, error) {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ func TestSeedCommand(t *testing.T) {
|
|||||||
var seedUser *database.User
|
var seedUser *database.User
|
||||||
regularUserCount := 0
|
regularUserCount := 0
|
||||||
for i := range users {
|
for i := range users {
|
||||||
if strings.HasPrefix(users[i].Username, "seed_admin_") {
|
if users[i].Username == "seed_admin" {
|
||||||
seedUserCount++
|
seedUserCount++
|
||||||
seedUser = &users[i]
|
seedUser = &users[i]
|
||||||
} else if strings.HasPrefix(users[i].Username, "user_") {
|
} else if strings.HasPrefix(users[i].Username, "user_") {
|
||||||
@@ -63,12 +63,12 @@ func TestSeedCommand(t *testing.T) {
|
|||||||
t.Fatal("Expected seed user to be created")
|
t.Fatal("Expected seed user to be created")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.HasPrefix(seedUser.Username, "seed_admin_") {
|
if seedUser.Username != "seed_admin" {
|
||||||
t.Errorf("Expected username to start with 'seed_admin_', got '%s'", seedUser.Username)
|
t.Errorf("Expected username to be 'seed_admin', got '%s'", seedUser.Username)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.HasPrefix(seedUser.Email, "seed_admin_") || !strings.HasSuffix(seedUser.Email, "@goyco.local") {
|
if seedUser.Email != "seed_admin@goyco.local" {
|
||||||
t.Errorf("Expected email to start with 'seed_admin_' and end with '@goyco.local', got '%s'", seedUser.Email)
|
t.Errorf("Expected email to be 'seed_admin@goyco.local', got '%s'", seedUser.Email)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !seedUser.EmailVerified {
|
if !seedUser.EmailVerified {
|
||||||
@@ -302,13 +302,13 @@ func TestSeedCommandIdempotency(t *testing.T) {
|
|||||||
|
|
||||||
seedUserCount := 0
|
seedUserCount := 0
|
||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
if strings.HasPrefix(user.Username, "seed_admin_") {
|
if user.Username == "seed_admin" {
|
||||||
seedUserCount++
|
seedUserCount++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if seedUserCount < 1 {
|
if seedUserCount != 1 {
|
||||||
t.Errorf("Expected at least 1 seed user, got %d", seedUserCount)
|
t.Errorf("Expected exactly 1 seed user, got %d", seedUserCount)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -387,7 +387,7 @@ func TestSeedCommandIdempotency(t *testing.T) {
|
|||||||
|
|
||||||
func findSeedUser(users []database.User) *database.User {
|
func findSeedUser(users []database.User) *database.User {
|
||||||
for i := range users {
|
for i := range users {
|
||||||
if strings.HasPrefix(users[i].Username, "seed_admin_") {
|
if users[i].Username == "seed_admin" {
|
||||||
return &users[i]
|
return &users[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -476,3 +476,58 @@ func TestSeedCommandTransactionRollback(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEnsureSeedUser(t *testing.T) {
|
||||||
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to connect to database: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := db.AutoMigrate(&database.User{}); err != nil {
|
||||||
|
t.Fatalf("Failed to migrate database: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
userRepo := repositories.NewUserRepository(db)
|
||||||
|
passwordHash := "test_password_hash"
|
||||||
|
|
||||||
|
firstUser, err := ensureSeedUser(userRepo, passwordHash)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create seed user: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if firstUser.Username != "seed_admin" || firstUser.Email != "seed_admin@goyco.local" || firstUser.Password != passwordHash || !firstUser.EmailVerified {
|
||||||
|
t.Errorf("Invalid seed user: username=%s, email=%s, password matches=%v, emailVerified=%v",
|
||||||
|
firstUser.Username, firstUser.Email, firstUser.Password == passwordHash, firstUser.EmailVerified)
|
||||||
|
}
|
||||||
|
|
||||||
|
secondUser, err := ensureSeedUser(userRepo, "different_password_hash")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to reuse seed user: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if firstUser.ID != secondUser.ID {
|
||||||
|
t.Errorf("Expected same user to be reused (ID %d), got different user (ID %d)", firstUser.ID, secondUser.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < 3; i++ {
|
||||||
|
if _, err := ensureSeedUser(userRepo, passwordHash); err != nil {
|
||||||
|
t.Fatalf("Call %d failed: %v", i+1, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
users, err := userRepo.GetAll(100, 0)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to get users: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
seedUserCount := 0
|
||||||
|
for _, user := range users {
|
||||||
|
if user.Username == "seed_admin" {
|
||||||
|
seedUserCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if seedUserCount != 1 {
|
||||||
|
t.Errorf("Expected exactly 1 seed user, got %d", seedUserCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user