From f4ab8bda45cc2417f9f6763cc3c752adbbde58f3 Mon Sep 17 00:00:00 2001 From: Kharec Date: Fri, 21 Nov 2025 16:20:41 +0100 Subject: [PATCH] feat: transaction rollback test --- cmd/goyco/commands/seed_test.go | 83 +++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/cmd/goyco/commands/seed_test.go b/cmd/goyco/commands/seed_test.go index 10750a7..6f5961f 100644 --- a/cmd/goyco/commands/seed_test.go +++ b/cmd/goyco/commands/seed_test.go @@ -362,3 +362,86 @@ func findSeedUser(users []database.User) *database.User { } return nil } + +func TestSeedCommandTransactionRollback(t *testing.T) { + db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) + if err != nil { + t.Fatalf("Failed to connect to database: %v", err) + } + + err = db.AutoMigrate(&database.User{}, &database.Post{}, &database.Vote{}) + if err != nil { + t.Fatalf("Failed to migrate database: %v", err) + } + + userRepo := repositories.NewUserRepository(db) + postRepo := repositories.NewPostRepository(db) + voteRepo := repositories.NewVoteRepository(db) + + t.Run("transaction rolls back on failure", func(t *testing.T) { + initialUserCount, _ := userRepo.Count() + initialPostCount, _ := postRepo.Count() + initialVoteCount, _ := voteRepo.Count() + + err := db.Transaction(func(tx *gorm.DB) error { + txUserRepo := userRepo.WithTx(tx) + txPostRepo := postRepo.WithTx(tx) + txVoteRepo := voteRepo.WithTx(tx) + + err := seedDatabase(txUserRepo, txPostRepo, txVoteRepo, []string{"--users", "2", "--posts", "3"}) + if err != nil { + return err + } + + return fmt.Errorf("simulated failure") + }) + + if err == nil { + t.Fatal("Expected transaction to fail") + } + + finalUserCount, _ := userRepo.Count() + finalPostCount, _ := postRepo.Count() + finalVoteCount, _ := voteRepo.Count() + + if finalUserCount != initialUserCount { + t.Errorf("Expected user count to remain %d after rollback, got %d", initialUserCount, finalUserCount) + } + if finalPostCount != initialPostCount { + t.Errorf("Expected post count to remain %d after rollback, got %d", initialPostCount, finalPostCount) + } + if finalVoteCount != initialVoteCount { + t.Errorf("Expected vote count to remain %d after rollback, got %d", initialVoteCount, finalVoteCount) + } + }) + + t.Run("transaction commits on success", func(t *testing.T) { + initialUserCount, _ := userRepo.Count() + initialPostCount, _ := postRepo.Count() + + err := db.Transaction(func(tx *gorm.DB) error { + txUserRepo := userRepo.WithTx(tx) + txPostRepo := postRepo.WithTx(tx) + txVoteRepo := voteRepo.WithTx(tx) + + return seedDatabase(txUserRepo, txPostRepo, txVoteRepo, []string{"--users", "1", "--posts", "1"}) + }) + + if err != nil { + t.Fatalf("Expected transaction to succeed, got error: %v", err) + } + + finalUserCount, _ := userRepo.Count() + finalPostCount, _ := postRepo.Count() + + expectedUsers := initialUserCount + 2 + expectedPosts := initialPostCount + 1 + + if finalUserCount < expectedUsers { + t.Errorf("Expected at least %d users after commit, got %d", expectedUsers, finalUserCount) + } + if finalPostCount < expectedPosts { + t.Errorf("Expected at least %d posts after commit, got %d", expectedPosts, finalPostCount) + } + }) +}