refac: article reads, story delete, no leaks, stored SEO status, rate limit, cleanup (%site%, article repo split, old lang repos, one default per site rule to domain)

This commit is contained in:
Florian Sylvain committed 2026-11-03 16:01:52 +01:00
1 parent 9d284e65a9
commit 7c15206170
85 files changed
+1788 -593

No files matched your search

+105
View File
@@ -0,0 +1,105 @@
package test
import (
"RenewCMS/internal/domain/article"
"RenewCMS/internal/domain/localization"
"RenewCMS/internal/domain/site"
"RenewCMS/internal/infrastructure/useCases"
"errors"
"math"
"slices"
"strings"
"testing"
)
func TestLocalizationDomainRules(t *testing.T) {
t.Run("A site has exactly one default language", func(t *testing.T) {
cases := []struct {
name string
rows []localization.Row
err error
}{
{"none", []localization.Row{{Tag: "en"}}, localization.ErrSingleDefault},
{"one", []localization.Row{{Tag: "en", IsDefault: true}, {Tag: "fr"}}, nil},
{"two", []localization.Row{{Tag: "en", IsDefault: true}, {Tag: "fr", IsDefault: true}}, localization.ErrSingleDefault},
}
for _, c := range cases {
if err := localization.RequireSingleDefault(c.rows); !errors.Is(err, c.err) {
t.Errorf("%s: %v, want %v", c.name, err, c.err)
}
}
})
t.Run("Only an enabled assigned language takes part in the public surfaces", func(t *testing.T) {
rows := []localization.Row{{Tag: "en", IsDefault: true, Enabled: true, Confirmed: true}, {Tag: "es"}}
if !localization.PublicTag(rows, "en") || localization.PublicTag(rows, "es") || localization.PublicTag(rows, "") || localization.PublicTag(rows, "de") {
t.Error("public languages are the enabled rows only")
}
})
t.Run("The site text belongs to the default language and to unassigned versions", func(t *testing.T) {
if !localization.SiteTextAllowed("en", "en") || !localization.SiteTextAllowed("en", "") || localization.SiteTextAllowed("en", "fr") {
t.Error("site text rule")
}
if localization.ConfirmedDefaultTag([]localization.Row{{Tag: "en", IsDefault: true}}) != "" {
t.Error("an unconfirmed default is no default")
}
})
t.Run("The title template placeholders have one source", func(t *testing.T) {
if site.DefaultTitleTemplate != site.TitlePlaceholder+" | "+site.SitePlaceholder {
t.Errorf("default template %q", site.DefaultTitleTemplate)
}
})
t.Run("A page window never overflows", func(t *testing.T) {
cases := []struct {
page, size, offset, limit int
}{
{1, 25, 0, 25},
{3, 5, 10, 5},
{0, 5, 0, 5},
{math.MinInt, 5, 0, 5},
{math.MaxInt, 25, math.MaxInt, 25},
{2, -1, 0, 0},
}
for _, c := range cases {
offset, limit := article.Filters{Page: c.page, Size: c.size}.Window()
if offset != c.offset || limit != c.limit {
t.Errorf("page %d size %d: %d %d", c.page, c.size, offset, limit)
}
}
})
}
func TestCheckArticleSEOIsLanguageAware(t *testing.T) {
repo := newMockArticleRepo()
sites := newMockSiteRepo(repo)
journal := sites.seed(1, "Journal", "journal", true)
journal.DefaultDescription = strings.Repeat("Renovation notes. ", 6)
sites.sites[1] = journal
rows := newFakeLocalizationStore(repo)
rows.rows[1] = []localization.Row{{Tag: "en", IsDefault: true, Enabled: true, Confirmed: true}, {Tag: "fr", Enabled: true}}
repo.articles[1] = article.Article{ID: 1, Title: "Harbour", SiteID: 1, Lang: "en", SEODismissed: []string{}}
repo.articles[2] = article.Article{ID: 2, Title: "Port", SiteID: 1, Lang: "fr", SEODismissed: []string{}}
check := useCases.NewCheckArticleSEOUseCase(repo, sites, newMockImageRepo(), rows)
codes := func(id uint32) []string {
result, err := check.Check(id, ownerCaller(1), useCases.CheckArticleSEOCommand{})
if err != nil {
t.Fatal(err)
}
found := []string{}
for _, suggestion := range result.Suggestions {
found = append(found, suggestion.Code)
}
return found
}
if slices.Contains(codes(1), article.DismissDescShort) {
t.Error("the default language uses the site description")
}
if !slices.Contains(codes(2), article.DismissDescShort) {
t.Error("another language never uses the site description")
}
}