Files
RenewCMS/test/article_repository_site_lock_test.go
T

101 lines
3.4 KiB
Go

package test
import (
domainArticle "RenewCMS/internal/domain/article"
domainSite "RenewCMS/internal/domain/site"
persistence "RenewCMS/internal/infrastructure/persistence/repositories"
"errors"
"testing"
)
func TestArticleRepositoryLocksOnlyWhenASiteIsInvolved(t *testing.T) {
t.Run("Creating an article without a site does not look up a site", func(t *testing.T) {
articles := persistence.NewArticleRepository(openContractSQLite(t))
created, err := articles.Create(newStorageArticle(0, "", "orphan", 0))
if err != nil {
t.Fatalf("expected the siteless article to be created, got %v", err)
}
if created.ID == 0 || created.SiteID != 0 {
t.Errorf("unexpected created article: %+v", created)
}
})
t.Run("Creating an article on a missing site fails", func(t *testing.T) {
articles := persistence.NewArticleRepository(openContractSQLite(t))
_, err := articles.Create(newStorageArticle(9999, "", "ghost", 0))
if !errors.Is(err, domainSite.ErrSiteNotFound) {
t.Errorf("expected ErrSiteNotFound, got %v", err)
}
})
t.Run("Updating the excerpt of a siteless article does not look up a site", func(t *testing.T) {
articles := persistence.NewArticleRepository(openContractSQLite(t))
created, err := articles.Create(newStorageArticle(0, "", "orphan", 0))
if err != nil {
t.Fatal(err)
}
updated, err := articles.Update(created.ID, domainArticle.Update{Excerpt: localeOf("Renamed")})
if err != nil || updated.Excerpt != "Renamed" {
t.Errorf("expected the excerpt update to succeed, got %+v %v", updated, err)
}
})
t.Run("Moving a siteless article to a site while setting a slug locks only the target", func(t *testing.T) {
db := openContractSQLite(t)
articles := persistence.NewArticleRepository(db)
site := storageDefaultSite(t, db)
created, err := articles.Create(newStorageArticle(0, "", "orphan", 0))
if err != nil {
t.Fatal(err)
}
updated, err := articles.Update(created.ID, domainArticle.Update{SiteID: &site.ID, Slug: localeOf("moved")})
if err != nil || updated.SiteID != site.ID || updated.Slug != "moved" {
t.Errorf("expected the move to succeed, got %+v %v", updated, err)
}
if stored := storedArticle(t, db, created.ID); stored.SiteID != site.ID || stored.Slug != "moved" {
t.Errorf("the move must be persisted, got site %d slug %q", stored.SiteID, stored.Slug)
}
})
t.Run("Setting a slug on a siteless article needs its site", func(t *testing.T) {
articles := persistence.NewArticleRepository(openContractSQLite(t))
created, err := articles.Create(newStorageArticle(0, "", "orphan", 0))
if err != nil {
t.Fatal(err)
}
_, err = articles.Update(created.ID, domainArticle.Update{Slug: localeOf("renamed")})
if !errors.Is(err, domainSite.ErrSiteNotFound) {
t.Errorf("expected ErrSiteNotFound, got %v", err)
}
})
}
func TestArticleRepositoryPersistsASlugChange(t *testing.T) {
db := openContractSQLite(t)
articles := persistence.NewArticleRepository(db)
site := storageDefaultSite(t, db)
created, err := articles.Create(newStorageArticle(site.ID, "", "before", 0))
if err != nil {
t.Fatal(err)
}
updated, err := articles.Update(created.ID, domainArticle.Update{Slug: localeOf("after")})
if err != nil || updated.Slug != "after" {
t.Fatalf("expected the slug change to succeed, got %+v %v", updated, err)
}
if stored := storedArticle(t, db, created.ID); stored.Slug != "after" {
t.Errorf("the slug change must be persisted, got %q", stored.Slug)
}
}