tercul-backend/internal/data/sql/author_repository_test.go
Damir Mukimov d50722dad5
Some checks failed
Test / Integration Tests (push) Successful in 4s
Build / Build Binary (push) Failing after 2m9s
Docker Build / Build Docker Image (push) Failing after 2m32s
Test / Unit Tests (push) Failing after 3m12s
Lint / Go Lint (push) Failing after 1m0s
Refactor ID handling to use UUIDs across the application
- Updated database models and repositories to replace uint IDs with UUIDs.
- Modified test fixtures to generate and use UUIDs for authors, translations, users, and works.
- Adjusted mock implementations to align with the new UUID structure.
- Ensured all relevant functions and methods are updated to handle UUIDs correctly.
- Added necessary imports for UUID handling in various files.
2025-12-27 00:33:34 +01:00

150 lines
4.4 KiB
Go

package sql_test
import (
"context"
"tercul/internal/data/sql"
"tercul/internal/domain"
"tercul/internal/platform/config"
"tercul/internal/testutil"
"testing"
"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.IntegrationTestSuite.SetupTest()
s.DB.Exec("DELETE FROM work_authors")
s.DB.Exec("DELETE FROM authors")
s.DB.Exec("DELETE FROM works")
s.DB.Exec("DELETE FROM books")
s.DB.Exec("DELETE FROM book_authors")
s.DB.Exec("DELETE FROM countries")
s.DB.Exec("DELETE FROM translations")
}
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) createBook(title string) *domain.Book {
book := &domain.Book{Title: title, TranslatableModel: domain.TranslatableModel{Language: "en"}}
err := s.DB.Create(book).Error
s.Require().NoError(err)
return book
}
func (s *AuthorRepositoryTestSuite) TestListByWorkID() {
s.Run("should return all authors for a given work", func() {
// Arrange
work := s.CreateTestWork(s.AdminCtx, "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, 3)
var authorNames []string
for _, a := range authors {
authorNames = append(authorNames, a.Name)
}
s.ElementsMatch([]string{"admin", "Author 1", "Author 2"}, authorNames)
})
}
func (s *AuthorRepositoryTestSuite) TestListByBookID() {
s.Run("should return all authors for a given book", func() {
// Arrange
book := s.createBook("Test Book")
author1 := s.createAuthor("Book Author 1")
author2 := s.createAuthor("Book Author 2")
s.Require().NoError(s.DB.Model(&book).Association("Authors").Append([]*domain.Author{author1, author2}))
// Act
authors, err := s.AuthorRepo.ListByBookID(context.Background(), book.ID)
// Assert
s.Require().NoError(err)
s.Len(authors, 2)
s.ElementsMatch([]string{"Book Author 1", "Book Author 2"}, []string{authors[0].Name, authors[1].Name})
})
}
func (s *AuthorRepositoryTestSuite) TestListByCountryID() {
s.Run("should return all authors for a given country", func() {
// Arrange
country1 := &domain.Country{Name: "Country 1", Code: "C1"}
country2 := &domain.Country{Name: "Country 2", Code: "C2"}
s.Require().NoError(s.DB.Create(country1).Error)
s.Require().NoError(s.DB.Create(country2).Error)
author1 := s.createAuthor("Author C1")
author1.CountryID = &country1.ID
s.Require().NoError(s.DB.Save(author1).Error)
author2 := s.createAuthor("Author C2")
author2.CountryID = &country2.ID
s.Require().NoError(s.DB.Save(author2).Error)
// Act
authors, err := s.AuthorRepo.ListByCountryID(context.Background(), country1.ID)
// Assert
s.Require().NoError(err)
s.Len(authors, 1)
s.Equal("Author C1", authors[0].Name)
})
}
func (s *AuthorRepositoryTestSuite) TestGetWithTranslations() {
s.Run("should return author with preloaded translations", func() {
// Arrange
author := s.createAuthor("Translated Author")
translation := &domain.Translation{
TranslatableType: "authors",
TranslatableID: author.ID,
Language: "es",
Title: "Autor Traducido",
Content: "Una biografía.",
}
s.Require().NoError(s.DB.Create(translation).Error)
// Act
foundAuthor, err := s.AuthorRepo.GetWithTranslations(context.Background(), author.ID)
// Assert
s.Require().NoError(err)
s.Require().NotNil(foundAuthor)
s.Require().Len(foundAuthor.Translations, 1)
s.Equal("es", foundAuthor.Translations[0].Language)
s.Equal("Una biografía.", foundAuthor.Translations[0].Content)
})
}
func TestAuthorRepository(t *testing.T) {
suite.Run(t, new(AuthorRepositoryTestSuite))
}