feat: enable initial-consonant search everywhere

This commit is contained in:
2026-07-27 01:48:32 +09:00
parent 8cad072cf0
commit e3b174eec7
22 changed files with 738 additions and 45 deletions

View File

@@ -366,6 +366,62 @@ public sealed class LegacyThemeWorkflowTests
Assert.Equal("theme-result-5000", snapshot.SearchResults[^1].ResultId);
}
[Fact]
public async Task SearchAsync_AcceptsConservativeTruncationAfterInitialFiltering()
{
var service = new FakeThemeSelectionService
{
SearchHandler = (query, session) => new ThemeSearchResult(
query,
session,
DateTimeOffset.UtcNow,
[
Selector(
ThemeMarket.Krx,
ThemeSession.NotApplicable,
"삼성 테마",
"00000001")
],
IsTruncated: true)
};
var workflow = new LegacyThemeWorkflow(service);
var snapshot = await workflow.SearchAsync(
workflow.CreateInitial(),
"ㅅㅅ",
ThemeSession.PreMarket);
Assert.Equal("삼성 테마", Assert.Single(snapshot.SearchResults).DisplayTitle);
Assert.True(snapshot.SearchIsTruncated);
}
[Fact]
public async Task SearchAsync_StillRejectsImpossiblePartialTruncationForOrdinaryText()
{
var service = new FakeThemeSelectionService
{
SearchHandler = (query, session) => new ThemeSearchResult(
query,
session,
DateTimeOffset.UtcNow,
[
Selector(
ThemeMarket.Krx,
ThemeSession.NotApplicable,
"AI",
"00000001")
],
IsTruncated: true)
};
var workflow = new LegacyThemeWorkflow(service);
await Assert.ThrowsAsync<LegacyThemeWorkflowDataException>(() =>
workflow.SearchAsync(
workflow.CreateInitial(),
"AI",
ThemeSession.PreMarket));
}
[Fact]
public async Task SelectAsync_UsesOpaqueResultIdAndCopiesValidatedPreview()
{