package sql_test import ( "context" "testing" "tercul/internal/data/sql" "tercul/internal/domain" "tercul/internal/platform/config" "tercul/internal/testutil" "github.com/stretchr/testify/suite" ) type AuthorRepositoryTestSuite struct { testutil.IntegrationTestSuite AuthorRepo domain.AuthorRepository } func (s *AuthorRepositoryTestSuite) SetupSuite() { s.IntegrationTestSuite.SetupSuite(testutil.DefaultTestConfig()) cfg, err := config.LoadConfig() s.Require().NoError(err) s.AuthorRepo = sql.NewAuthorRepository(s.DB, cfg) } func (s *AuthorRepositoryTestSuite) SetupTest() { s.DB.Exec("DELETE FROM work_authors") s.DB.Exec("DELETE FROM authors") s.DB.Exec("DELETE FROM works") } func (s *AuthorRepositoryTestSuite) createAuthor(name string) *domain.Author { author := &domain.Author{ Name: name, TranslatableModel: domain.TranslatableModel{ Language: "en", }, } err := s.AuthorRepo.Create(context.Background(), author) s.Require().NoError(err) return author } func (s *AuthorRepositoryTestSuite) TestListByWorkID() { s.Run("should return all authors for a given work", func() { // Arrange work := s.CreateTestWork("Test Work", "en", "Test content") author1 := s.createAuthor("Author 1") author2 := s.createAuthor("Author 2") s.Require().NoError(s.DB.Model(&work).Association("Authors").Append([]*domain.Author{author1, author2})) // Act authors, err := s.AuthorRepo.ListByWorkID(context.Background(), work.ID) // Assert s.Require().NoError(err) s.Len(authors, 2) s.ElementsMatch([]string{"Author 1", "Author 2"}, []string{authors[0].Name, authors[1].Name}) }) } func TestAuthorRepository(t *testing.T) { suite.Run(t, new(AuthorRepositoryTestSuite)) }