Close TD-16 frontmatter robustness

This commit is contained in:
2026-06-12 13:27:39 +02:00
parent f7e1662bca
commit 8224b3d59f
4 changed files with 112 additions and 24 deletions

View File

@@ -104,25 +104,19 @@ defmodule BDS.AI.ChatStreamingTest do
server = start_supervised!({Bandit, plug: StreamingChatPlug, port: 0, startup_log: false})
{:ok, {_address, port}} = ThousandIsland.listener_info(server)
assert {:ok, _endpoint} =
BDS.AI.put_endpoint(:online, %{
url: "http://127.0.0.1:#{port}/v1",
api_key: "sk-stream",
model: "stream-model"
})
assert :ok = BDS.AI.set_airplane_mode(false)
assert {:ok, conversation} = BDS.AI.start_chat(%{model: "stream-model"})
{:ok, conversation: conversation}
{:ok, conversation: conversation, streaming_port: port}
end
test "incremental content events arrive before the final reply and persistence matches", %{
conversation: conversation
conversation: conversation,
streaming_port: port
} do
conversation_id = conversation.id
configure_streaming_runtime!(port)
assert {:ok, reply} =
BDS.AI.send_chat_message(conversation_id, "tell me a story",
event_target: self()
@@ -142,11 +136,16 @@ defmodule BDS.AI.ChatStreamingTest do
assert assistant_message.token_usage_output == 4
end
test "cancel_chat mid-stream aborts the HTTP request", %{conversation: conversation} do
test "cancel_chat mid-stream aborts the HTTP request", %{
conversation: conversation,
streaming_port: port
} do
Application.put_env(:bds, :chat_stream_scenario, :endless)
conversation_id = conversation.id
test_pid = self()
configure_streaming_runtime!(port)
task =
Task.async(fn ->
BDS.AI.send_chat_message(conversation_id, "stream forever", event_target: test_pid)
@@ -161,4 +160,16 @@ defmodule BDS.AI.ChatStreamingTest do
# The server notices the closed connection — the request was truly aborted.
assert_receive :sse_client_disconnected, 2_000
end
defp configure_streaming_runtime!(port) do
assert {:ok, _endpoint} =
BDS.AI.put_endpoint(:online, %{
url: "http://127.0.0.1:#{port}/v1",
api_key: "sk-stream",
model: "stream-model"
})
assert :ok = BDS.AI.put_model_preference(:chat, "stream-model")
assert :ok = BDS.AI.set_airplane_mode(false)
end
end

View File

@@ -0,0 +1,30 @@
defmodule BDS.FrontmatterTest do
use ExUnit.Case, async: true
test "parse_document accepts CRLF frontmatter documents" do
contents = "---\r\ntitle: Hello\r\ntags:\r\n - elixir\r\n---\r\nBody\r\n"
assert {:ok, %{fields: fields, body: body}} = BDS.Frontmatter.parse_document(contents)
assert fields["title"] == "Hello"
assert fields["tags"] == ["elixir"]
assert body == "Body"
end
test "serialize_document roundtrips quoted strings with embedded quotes and escapes" do
fields = [
{"title", "He said \"hi\" \\\\ there"},
{"summary", "Ends with a quote\""},
{"excerpt", "first line\nsecond line"}
]
contents = BDS.Frontmatter.serialize_document(fields, "Body")
assert {:ok, %{fields: parsed_fields, body: body}} =
BDS.Frontmatter.parse_document(contents)
assert parsed_fields["title"] == "He said \"hi\" \\\\ there"
assert parsed_fields["summary"] == "Ends with a quote\""
assert parsed_fields["excerpt"] == "first line\nsecond line"
assert body == "Body"
end
end