package service import ( "context" "strings" "testing" "github.com/Tencent/WeKnora/internal/models/chat" "github.com/Tencent/WeKnora/internal/types" "github.com/stretchr/testify/require" ) func TestWikiPageInputBudgetRejectsOversizedCombinedEvidenceWithoutCallingModel(t *testing.T) { input := map[string]string{ "NewContent": strings.Repeat("证", wikiPageInputRunes/2), "ExistingContent": strings.Repeat("据", wikiPageInputRunes/2), "SharedSourceContexts": "不能丢弃的限定条件", } calls := 0 model := &wikiScriptedChat{id: t.Name(), call: func(context.Context, []chat.Message) (*types.ChatResponse, error) { calls++ return &types.ChatResponse{Content: "SUMMARY: invalid\nShould never be called"}, nil }} output, err := (&wikiIngestService{}).generateWikiPageModification(context.Background(), model, input) require.ErrorContains(t, err, "未截断证据或标记完成") require.Empty(t, output) require.Zero(t, calls, "oversize is not an output repair or a provider retry") require.Equal(t, "不能丢弃的限定条件", input["SharedSourceContexts"]) require.Len(t, input["NewContent"], wikiPageInputRunes/2*3) } func TestWikiPageInputBudgetCountsUnicodeAndIncludesAllContext(t *testing.T) { require.NoError(t, validateWikiPageInputBudget(map[string]string{"NewContent": strings.Repeat("中", wikiPageInputRunes)})) require.Error(t, validateWikiPageInputBudget(map[string]string{ "NewContent": strings.Repeat("中", wikiPageInputRunes), "DeletedContent": "一", })) }