# frozen_string_literal: true require "test_helper" module MCP class Tool class ResponseTest < ActiveSupport::TestCase test "#initialize with content" do content = [{ type: "text", text: "Unauthorized", }] response = Response.new(content) assert_equal content, response.content refute response.error? end test "#content_provided? distinguishes empty content from omitted or nil content" do assert Response.new([]).content_provided? refute Response.new.content_provided? refute Response.new(nil).content_provided? end test "#initialize with content and error set to true" do content = [{ type: "text", text: "Unauthorized", }] response = Response.new(content, error: true) assert_equal content, response.content assert response.error? end test "#initialize with content and error explicitly set to false" do content = [{ type: "text", text: "Unauthorized", }] response = Response.new(content, error: false) assert_equal content, response.content refute response.error? end test "#initialize with content and structuredContent" do content = [{ type: "text", text: "{\"code\":401,\"message\":\"Unauthorized\"}", }] structured_content = { code: 401, message: "Unauthorized" } response = Response.new(content, structured_content: structured_content) assert_equal content, response.content assert_equal structured_content, response.structured_content refute response.error? end test "#error? for a standard response" do response = Response.new(nil, error: false) refute response.error? end test "#error? for an error response" do response = Response.new(nil, error: true) assert response.error? end test "#to_h for a standard response" do content = [{ type: "text", text: "Unauthorized", }] response = Response.new(content) actual = response.to_h assert_equal [:content, :isError], actual.keys assert_equal content, actual[:content] refute actual[:isError] end test "#to_h for an error response" do content = [{ type: "text", text: "Unauthorized", }] response = Response.new(content, error: true) actual = response.to_h assert_equal [:content, :isError], actual.keys assert_equal content, actual[:content] assert actual[:isError] end test "#to_h for a standard response with content and structured content" do content = [{ type: "text", text: "{\"code\":401,\"message\":\"Unauthorized\"}", }] structured_content = { code: 401, message: "Unauthorized" } response = Response.new(content, structured_content: structured_content) actual = response.to_h assert_equal [:content, :isError, :structuredContent], actual.keys assert_equal content, actual[:content] assert_equal structured_content, actual[:structuredContent] refute actual[:isError] end test "#to_h for a standard response with nil content and structured content" do structured_content = { code: 401, message: "Unauthorized" } response = Response.new(nil, structured_content: structured_content) actual = response.to_h assert_equal [:content, :isError, :structuredContent], actual.keys assert_equal([], actual[:content]) assert_equal structured_content, actual[:structuredContent] refute actual[:isError] end test "#to_h for a standard response with structured content only" do structured_content = { code: 401, message: "Unauthorized" } response = Response.new(structured_content: structured_content) actual = response.to_h assert_equal [:content, :isError, :structuredContent], actual.keys assert_equal([], actual[:content]) assert_equal structured_content, actual[:structuredContent] refute actual[:isError] end test "#to_h includes _meta when present" do meta = { "application/vnd.ant.mcp-app" => { "csp" => "default-src 'self'" } } response = Response.new([{ type: "text", text: "ok" }], meta: meta) actual = response.to_h assert_equal meta, actual[:_meta] end test "#to_h omits _meta when nil" do response = Response.new([{ type: "text", text: "ok" }]) refute response.to_h.key?(:_meta) end end end end