thread-master/apps/backend/internal/module/scout/usecase/quality_fixture_test.go

69 lines
1.9 KiB
Go
Raw Permalink Normal View History

2026-08-13 02:22:24 +00:00
package usecase
import (
"encoding/json"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
)
type qualityFixture struct {
ID string `json:"id"`
Intent string `json:"intent"`
Terms []string `json:"terms"`
Target int `json:"target"`
Cases []qualityCandidate `json:"cases"`
}
type qualityCandidate struct {
URL string `json:"url"`
Text string `json:"text"`
Relevant bool `json:"relevant"`
}
func loadQualityFixtures(t *testing.T) []qualityFixture {
t.Helper()
raw, err := os.ReadFile(filepath.Join("testdata", "topic_quality_cases.json"))
require.NoError(t, err)
var fixtures []qualityFixture
require.NoError(t, json.Unmarshal(raw, &fixtures))
require.NotEmpty(t, fixtures)
return fixtures
}
func TestQualityFixturesCoverRepresentativeIntentSignals(t *testing.T) {
fixtures := loadQualityFixtures(t)
require.GreaterOrEqual(t, len(fixtures), 4)
for _, fixture := range fixtures {
require.NotEmpty(t, fixture.ID)
require.NotEmpty(t, fixture.Intent)
require.NotEmpty(t, fixture.Terms)
require.NotEmpty(t, fixture.Cases)
for _, candidate := range fixture.Cases {
require.NotEmpty(t, candidate.URL, fixture.ID)
require.NotEmpty(t, candidate.Text, fixture.ID)
got := textMatchesSearchTerm(candidate.Text, fixture.Terms[0])
require.Equal(t, candidate.Relevant, got, "%s candidate=%q", fixture.ID, candidate.Text)
}
}
}
func TestQualityFixturesCanonicalizeAliasWithoutHostnameDuplicates(t *testing.T) {
fixtures := loadQualityFixtures(t)
var alias *qualityFixture
for i := range fixtures {
if fixtures[i].ID == "alias-shortcode" {
alias = &fixtures[i]
break
}
}
require.NotNil(t, alias)
require.Len(t, alias.Cases, 2)
require.Equal(t, canonicalPostIdentity(alias.Cases[0].URL), canonicalPostIdentity(alias.Cases[1].URL))
require.Equal(t, "threads-post:SameCode", canonicalPostIdentity(alias.Cases[0].URL))
}