# 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 "#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_empty 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_empty actual[:content]
        assert_equal structured_content, actual[:structuredContent]
        refute actual[:isError]
      end
    end
  end
end
