defmodule Anthropic.Test do
@moduledoc """
Anthropic-specific test helpers.
Provides SSE event builders that construct valid Anthropic streaming
event sequences for use in tests.
"""
@doc """
Builds a complete Anthropic SSE event sequence for a text response.
Returns a list of 6 event maps representing a streamed text reply.
"""
@spec text_events(String.t()) :: [map()]
def text_events(text) do
msg_id = "msg_test_#{:erlang.unique_integer([:positive])}"
[
%{
"type" => "message_start",
"message" => %{"id" => msg_id, "role" => "assistant", "content" => []}
},
%{
"type" => "content_block_start",
"index" => 0,
"content_block" => %{"type" => "text", "text" => ""}
},
%{
"type" => "content_block_delta",
"index" => 0,
"delta" => %{"type" => "text_delta", "text" => text}
},
%{"type" => "content_block_stop", "index" => 0},
%{"type" => "message_delta", "delta" => %{"stop_reason" => "end_turn"}},
%{"type" => "message_stop"}
]
end
@doc """
Builds a complete Anthropic SSE event sequence for a tool call response.
Returns a list of 6 event maps representing a streamed tool call
with the given `name` and `input`.
"""
@spec tool_call_events(String.t(), map()) :: [map()]
def tool_call_events(name, input) do
msg_id = "msg_test_#{:erlang.unique_integer([:positive])}"
tool_call_id = "tc_test_#{:erlang.unique_integer([:positive])}"
[
%{
"type" => "message_start",
"message" => %{"id" => msg_id, "role" => "assistant", "content" => []}
},
%{
"type" => "content_block_start",
"index" => 0,
"content_block" => %{
"type" => "tool_use",
"id" => tool_call_id,
"name" => name,
"input" => %{}
}
},
%{
"type" => "content_block_delta",
"index" => 0,
"delta" => %{"type" => "input_json_delta", "partial_json" => Jason.encode!(input)}
},
%{"type" => "content_block_stop", "index" => 0},
%{"type" => "message_delta", "delta" => %{"stop_reason" => "tool_use"}},
%{"type" => "message_stop"}
]
end
end