mirror of
https://github.com/SamyRai/tercul-backend.git
synced 2025-12-27 02:51:34 +00:00
Refactor repository tests to be more DRY and maintainable.
Introduced a new testing strategy for the data access layer to avoid redundant testing of generic repository methods. This change centralizes the testing of common functionality, making the test suite cleaner and more efficient. - Created a comprehensive test suite for the generic `BaseRepository` using a dedicated `TestEntity`. This suite covers all common CRUD operations, including transactions and error handling, in a single location. - Added a new, focused test suite for the previously untested `CategoryRepository`. - Refactored the existing test suites for `AuthorRepository`, `BookRepository`, `PublisherRepository`, and `SourceRepository` to remove redundant CRUD tests, leaving only tests for repository-specific logic. - Updated the test utilities to support the new testing strategy. This change significantly improves the maintainability and efficiency of the test suite and provides a clear, future-proof pattern for testing all repositories.
This commit is contained in:
parent
1655a02a08
commit
fd921ee7d2
@ -17,90 +17,27 @@ 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) SetupTest() {
|
||||
s.DB.Exec("DELETE FROM books")
|
||||
}
|
||||
|
||||
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) createBook(title, isbn string) *domain.Book {
|
||||
book := &domain.Book{
|
||||
Title: title,
|
||||
ISBN: isbn,
|
||||
TranslatableModel: domain.TranslatableModel{
|
||||
Language: "en",
|
||||
},
|
||||
}
|
||||
err := s.BookRepo.Create(context.Background(), book)
|
||||
s.Require().NoError(err)
|
||||
return book
|
||||
}
|
||||
|
||||
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))
|
||||
s.createBook("Test Book", "1234567890")
|
||||
|
||||
// Act
|
||||
foundBook, err := s.BookRepo.FindByISBN(context.Background(), "1234567890")
|
||||
@ -108,7 +45,18 @@ func (s *BookRepositoryTestSuite) TestFindByISBN() {
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(foundBook)
|
||||
s.Equal(book.ID, foundBook.ID)
|
||||
s.Equal("Test Book", foundBook.Title)
|
||||
})
|
||||
|
||||
s.Run("should return error if ISBN not found", func() {
|
||||
// Arrange
|
||||
s.createBook("Another Book", "1111111111")
|
||||
|
||||
// Act
|
||||
_, err := s.BookRepo.FindByISBN(context.Background(), "9999999999")
|
||||
|
||||
// Assert
|
||||
s.Require().Error(err)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -17,6 +17,12 @@ func (s *MonetizationRepositoryTestSuite) SetupSuite() {
|
||||
s.IntegrationTestSuite.SetupSuite(testutil.DefaultTestConfig())
|
||||
}
|
||||
|
||||
func (s *MonetizationRepositoryTestSuite) SetupTest() {
|
||||
s.DB.Exec("DELETE FROM work_monetizations")
|
||||
s.DB.Exec("DELETE FROM monetizations")
|
||||
s.DB.Exec("DELETE FROM works")
|
||||
}
|
||||
|
||||
func (s *MonetizationRepositoryTestSuite) TestAddMonetizationToWork() {
|
||||
s.Run("should add a monetization to a work", func() {
|
||||
// Arrange
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
package sql_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"tercul/internal/domain"
|
||||
"tercul/internal/testutil"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
@ -17,85 +15,14 @@ func (s *PublisherRepositoryTestSuite) SetupSuite() {
|
||||
s.IntegrationTestSuite.SetupSuite(testutil.DefaultTestConfig())
|
||||
}
|
||||
|
||||
func (s *PublisherRepositoryTestSuite) TestCreatePublisher() {
|
||||
s.Run("should create a new publisher", func() {
|
||||
// Arrange
|
||||
publisher := &domain.Publisher{
|
||||
Name: "New Test Publisher",
|
||||
TranslatableModel: domain.TranslatableModel{
|
||||
Language: "en",
|
||||
},
|
||||
}
|
||||
|
||||
// Act
|
||||
err := s.PublisherRepo.Create(context.Background(), publisher)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
s.NotZero(publisher.ID)
|
||||
|
||||
// Verify that the publisher was actually created in the database
|
||||
var foundPublisher domain.Publisher
|
||||
err = s.DB.First(&foundPublisher, publisher.ID).Error
|
||||
s.Require().NoError(err)
|
||||
s.Equal("New Test Publisher", foundPublisher.Name)
|
||||
s.Equal("en", foundPublisher.Language)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *PublisherRepositoryTestSuite) TestGetPublisherByID() {
|
||||
s.Run("should return a publisher by ID", func() {
|
||||
// Arrange
|
||||
publisher := &domain.Publisher{Name: "Test Publisher"}
|
||||
s.Require().NoError(s.PublisherRepo.Create(context.Background(), publisher))
|
||||
|
||||
// Act
|
||||
foundPublisher, err := s.PublisherRepo.GetByID(context.Background(), publisher.ID)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(foundPublisher)
|
||||
s.Equal(publisher.ID, foundPublisher.ID)
|
||||
s.Equal("Test Publisher", foundPublisher.Name)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *PublisherRepositoryTestSuite) TestUpdatePublisher() {
|
||||
s.Run("should update an existing publisher", func() {
|
||||
// Arrange
|
||||
publisher := &domain.Publisher{Name: "Original Name"}
|
||||
s.Require().NoError(s.PublisherRepo.Create(context.Background(), publisher))
|
||||
publisher.Name = "Updated Name"
|
||||
|
||||
// Act
|
||||
err := s.PublisherRepo.Update(context.Background(), publisher)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
var foundPublisher domain.Publisher
|
||||
err = s.DB.First(&foundPublisher, publisher.ID).Error
|
||||
s.Require().NoError(err)
|
||||
s.Equal("Updated Name", foundPublisher.Name)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *PublisherRepositoryTestSuite) TestDeletePublisher() {
|
||||
s.Run("should delete an existing publisher", func() {
|
||||
// Arrange
|
||||
publisher := &domain.Publisher{Name: "To Be Deleted"}
|
||||
s.Require().NoError(s.PublisherRepo.Create(context.Background(), publisher))
|
||||
|
||||
// Act
|
||||
err := s.PublisherRepo.Delete(context.Background(), publisher.ID)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
var foundPublisher domain.Publisher
|
||||
err = s.DB.First(&foundPublisher, publisher.ID).Error
|
||||
s.Require().Error(err)
|
||||
})
|
||||
func (s *PublisherRepositoryTestSuite) SetupTest() {
|
||||
s.DB.Exec("DELETE FROM publishers")
|
||||
}
|
||||
|
||||
func TestPublisherRepository(t *testing.T) {
|
||||
suite.Run(t, new(PublisherRepositoryTestSuite))
|
||||
}
|
||||
|
||||
// NOTE: All tests for this repository were removed because they tested generic
|
||||
// CRUD functionality that is now covered in `base_repository_test.go`.
|
||||
// If you add publisher-specific methods to the repository, add their tests here.
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
package sql_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"tercul/internal/domain"
|
||||
"tercul/internal/testutil"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
@ -17,85 +15,14 @@ func (s *SourceRepositoryTestSuite) SetupSuite() {
|
||||
s.IntegrationTestSuite.SetupSuite(testutil.DefaultTestConfig())
|
||||
}
|
||||
|
||||
func (s *SourceRepositoryTestSuite) TestCreateSource() {
|
||||
s.Run("should create a new source", func() {
|
||||
// Arrange
|
||||
source := &domain.Source{
|
||||
Name: "New Test Source",
|
||||
TranslatableModel: domain.TranslatableModel{
|
||||
Language: "en",
|
||||
},
|
||||
}
|
||||
|
||||
// Act
|
||||
err := s.SourceRepo.Create(context.Background(), source)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
s.NotZero(source.ID)
|
||||
|
||||
// Verify that the source was actually created in the database
|
||||
var foundSource domain.Source
|
||||
err = s.DB.First(&foundSource, source.ID).Error
|
||||
s.Require().NoError(err)
|
||||
s.Equal("New Test Source", foundSource.Name)
|
||||
s.Equal("en", foundSource.Language)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *SourceRepositoryTestSuite) TestGetSourceByID() {
|
||||
s.Run("should return a source by ID", func() {
|
||||
// Arrange
|
||||
source := &domain.Source{Name: "Test Source"}
|
||||
s.Require().NoError(s.SourceRepo.Create(context.Background(), source))
|
||||
|
||||
// Act
|
||||
foundSource, err := s.SourceRepo.GetByID(context.Background(), source.ID)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(foundSource)
|
||||
s.Equal(source.ID, foundSource.ID)
|
||||
s.Equal("Test Source", foundSource.Name)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *SourceRepositoryTestSuite) TestUpdateSource() {
|
||||
s.Run("should update an existing source", func() {
|
||||
// Arrange
|
||||
source := &domain.Source{Name: "Original Name"}
|
||||
s.Require().NoError(s.SourceRepo.Create(context.Background(), source))
|
||||
source.Name = "Updated Name"
|
||||
|
||||
// Act
|
||||
err := s.SourceRepo.Update(context.Background(), source)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
var foundSource domain.Source
|
||||
err = s.DB.First(&foundSource, source.ID).Error
|
||||
s.Require().NoError(err)
|
||||
s.Equal("Updated Name", foundSource.Name)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *SourceRepositoryTestSuite) TestDeleteSource() {
|
||||
s.Run("should delete an existing source", func() {
|
||||
// Arrange
|
||||
source := &domain.Source{Name: "To Be Deleted"}
|
||||
s.Require().NoError(s.SourceRepo.Create(context.Background(), source))
|
||||
|
||||
// Act
|
||||
err := s.SourceRepo.Delete(context.Background(), source.ID)
|
||||
|
||||
// Assert
|
||||
s.Require().NoError(err)
|
||||
var foundSource domain.Source
|
||||
err = s.DB.First(&foundSource, source.ID).Error
|
||||
s.Require().Error(err)
|
||||
})
|
||||
func (s *SourceRepositoryTestSuite) SetupTest() {
|
||||
s.DB.Exec("DELETE FROM sources")
|
||||
}
|
||||
|
||||
func TestSourceRepository(t *testing.T) {
|
||||
suite.Run(t, new(SourceRepositoryTestSuite))
|
||||
}
|
||||
|
||||
// NOTE: All tests for this repository were removed because they tested generic
|
||||
// CRUD functionality that is now covered in `base_repository_test.go`.
|
||||
// If you add source-specific methods to the repository, add their tests here.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user