package sql_test import ( "context" "testing" "tercul/internal/domain" "tercul/internal/testutil" "github.com/stretchr/testify/suite" ) type BookRepositoryTestSuite struct { testutil.IntegrationTestSuite } func (s *BookRepositoryTestSuite) SetupSuite() { s.IntegrationTestSuite.SetupSuite(testutil.DefaultTestConfig()) } func (s *BookRepositoryTestSuite) TestCreateBook() { s.Run("should create a new book", func() { // Arrange book := &domain.Book{ Title: "New Test Book", TranslatableModel: domain.TranslatableModel{ Language: "en", }, } // Act err := s.BookRepo.Create(context.Background(), book) // Assert s.Require().NoError(err) s.NotZero(book.ID) // Verify that the book was actually created in the database var foundBook domain.Book err = s.DB.First(&foundBook, book.ID).Error s.Require().NoError(err) s.Equal("New Test Book", foundBook.Title) s.Equal("en", foundBook.Language) }) } func (s *BookRepositoryTestSuite) TestGetBookByID() { s.Run("should return a book by ID", func() { // Arrange book := &domain.Book{Title: "Test Book"} s.Require().NoError(s.BookRepo.Create(context.Background(), book)) // Act foundBook, err := s.BookRepo.GetByID(context.Background(), book.ID) // Assert s.Require().NoError(err) s.Require().NotNil(foundBook) s.Equal(book.ID, foundBook.ID) s.Equal("Test Book", foundBook.Title) }) } func (s *BookRepositoryTestSuite) TestUpdateBook() { s.Run("should update an existing book", func() { // Arrange book := &domain.Book{Title: "Original Title"} s.Require().NoError(s.BookRepo.Create(context.Background(), book)) book.Title = "Updated Title" // Act err := s.BookRepo.Update(context.Background(), book) // Assert s.Require().NoError(err) var foundBook domain.Book err = s.DB.First(&foundBook, book.ID).Error s.Require().NoError(err) s.Equal("Updated Title", foundBook.Title) }) } func (s *BookRepositoryTestSuite) TestDeleteBook() { s.Run("should delete an existing book", func() { // Arrange book := &domain.Book{Title: "To Be Deleted"} s.Require().NoError(s.BookRepo.Create(context.Background(), book)) // Act err := s.BookRepo.Delete(context.Background(), book.ID) // Assert s.Require().NoError(err) var foundBook domain.Book err = s.DB.First(&foundBook, book.ID).Error s.Require().Error(err) }) } func (s *BookRepositoryTestSuite) TestFindByISBN() { s.Run("should return a book by ISBN", func() { // Arrange book := &domain.Book{Title: "Test Book", ISBN: "1234567890"} s.Require().NoError(s.BookRepo.Create(context.Background(), book)) // Act foundBook, err := s.BookRepo.FindByISBN(context.Background(), "1234567890") // Assert s.Require().NoError(err) s.Require().NotNil(foundBook) s.Equal(book.ID, foundBook.ID) }) } func TestBookRepository(t *testing.T) { suite.Run(t, new(BookRepositoryTestSuite)) }