deer-flow/frontend/tests/unit/core/suggestions/placeholders.test.ts
MeloMei f122594419
refactor(frontend): extract placeholder detection utility with unit tests (follow-up to #3764) (#3783)
* refactor(frontend): extract placeholder detection utility with unit tests

* fix(frontend): pass prompt text directly to onSelectPlaceholder to avoid stale DOM read

The onSelectPlaceholder callback was reading textarea.value immediately
after textInput.setInput(prompt), but React state updates are async so
the DOM had not yet reflected the new value. This caused the placeholder
auto-selection to silently fail when the textarea was previously empty.

Fix: accept the new text as a parameter instead of reading from the DOM.

* fix(frontend): resolve duplicate findSuggestionTemplatePlaceholder identifier

After rebasing onto main, the function existed both inline in
input-box-helpers.ts (from #3764) and as an import from our new
placeholders module, causing TS2300 duplicate identifier errors.

- Remove duplicate import in input-box.tsx
- Replace inline function in input-box-helpers with re-export from
  @/core/suggestions/placeholders
- Export SUGGESTION_TEMPLATE_PLACEHOLDER_PATTERN from placeholders module

* refactor(frontend): remove dead hasUnreplacedPlaceholder export

No production call site uses this boolean wrapper — both existing
checks need the {start,end} range from findSuggestionTemplatePlaceholder.
Drop the function and its two unit tests.
2026-07-06 15:44:24 +08:00

58 lines
1.8 KiB
TypeScript

import { describe, expect, test } from "@rstest/core";
import { findSuggestionTemplatePlaceholder } from "@/core/suggestions/placeholders";
describe("findSuggestionTemplatePlaceholder", () => {
test("finds Chinese [主题] and returns correct range", () => {
const result = findSuggestionTemplatePlaceholder(
"深入浅出的研究一下[主题],并总结发现。",
);
expect(result).toEqual({ start: 9, end: 13 });
});
test("finds English [topic] and returns correct range", () => {
const result = findSuggestionTemplatePlaceholder(
"Write a blog post about the latest trends on [topic]",
);
expect(result).toEqual({ start: 45, end: 52 });
});
test("finds Chinese [来源] placeholder", () => {
const result =
findSuggestionTemplatePlaceholder("从[来源]收集数据并创建报告。");
expect(result).not.toBeNull();
});
test("finds English [source] placeholder", () => {
const result = findSuggestionTemplatePlaceholder(
"Collect data from [source] and create a report.",
);
expect(result).not.toBeNull();
});
test("returns null for normal text without brackets", () => {
expect(
findSuggestionTemplatePlaceholder("研究一下2025年最流行的Python框架"),
).toBeNull();
});
test("returns null for text with unrelated brackets", () => {
expect(
findSuggestionTemplatePlaceholder("check [this link] for details"),
).toBeNull();
});
test("returns null for empty text", () => {
expect(findSuggestionTemplatePlaceholder("")).toBeNull();
});
test("detects placeholder case-insensitively for English", () => {
expect(
findSuggestionTemplatePlaceholder("Research [Topic] deeply"),
).not.toBeNull();
expect(
findSuggestionTemplatePlaceholder("Research [TOPIC] deeply"),
).not.toBeNull();
});
});