# frozen_string_literal: true require "test_helper" module MCP class Resource class ContentsTest < ActiveSupport::TestCase test "Contents#to_h returns hash with mimeType" do contents = Resource::Contents.new( uri: "test://example", mime_type: "text/plain", ) result = contents.to_h assert_equal "test://example", result[:uri] assert_equal "text/plain", result[:mimeType] refute result.key?(:mime_type), "Should use camelCase 'mimeType' not snake_case 'mime_type'" end test "Contents#to_h omits mimeType when nil" do contents = Resource::Contents.new(uri: "test://example") result = contents.to_h assert_equal({ uri: "test://example" }, result) refute result.key?(:mimeType) end test "TextContents#to_h returns hash with text and mimeType" do text_contents = Resource::TextContents.new( uri: "test://text", mime_type: "text/plain", text: "Hello, world!", ) result = text_contents.to_h assert_equal "test://text", result[:uri] assert_equal "text/plain", result[:mimeType] assert_equal "Hello, world!", result[:text] refute result.key?(:mime_type), "Should use camelCase 'mimeType' not snake_case 'mime_type'" end test "BlobContents#to_h returns hash with blob and mimeType" do blob_contents = Resource::BlobContents.new( uri: "test://binary", mime_type: "image/png", data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==", ) result = blob_contents.to_h assert_equal "test://binary", result[:uri] assert_equal "image/png", result[:mimeType] assert_equal "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==", result[:blob] refute result.key?(:data), "Should use 'blob' not 'data' per MCP specification" refute result.key?(:mime_type), "Should use camelCase 'mimeType' not snake_case 'mime_type'" end test "BlobContents#to_h omits mimeType when nil" do blob_contents = Resource::BlobContents.new( uri: "test://binary", mime_type: nil, data: "base64data", ) result = blob_contents.to_h assert_equal({ uri: "test://binary", blob: "base64data" }, result) refute result.key?(:mimeType) end test "Contents#to_h omits _meta when nil" do contents = Resource::Contents.new(uri: "test://example", mime_type: "text/plain") refute contents.to_h.key?(:_meta) end test "Contents#to_h includes _meta when present" do meta = { "application/vnd.ant.mcp-app" => { "csp" => "default-src 'self'" } } contents = Resource::Contents.new(uri: "test://example", mime_type: "text/plain", meta: meta) assert_equal meta, contents.to_h[:_meta] end test "TextContents#to_h includes _meta when present" do meta = { "application/vnd.ant.mcp-app" => { "csp" => "default-src 'self'" } } text_contents = Resource::TextContents.new( uri: "test://text", mime_type: "text/plain", text: "Hello", meta: meta, ) result = text_contents.to_h assert_equal meta, result[:_meta] assert_equal "Hello", result[:text] end test "TextContents#to_h omits _meta when nil" do text_contents = Resource::TextContents.new( uri: "test://text", mime_type: "text/plain", text: "Hello", ) refute text_contents.to_h.key?(:_meta) end test "BlobContents#to_h includes _meta when present" do meta = { "application/vnd.ant.mcp-app" => { "csp" => "default-src 'self'" } } blob_contents = Resource::BlobContents.new( uri: "test://binary", mime_type: "image/png", data: "base64data", meta: meta, ) result = blob_contents.to_h assert_equal meta, result[:_meta] assert_equal "base64data", result[:blob] end test "BlobContents#to_h omits _meta when nil" do blob_contents = Resource::BlobContents.new( uri: "test://binary", mime_type: "image/png", data: "base64data", ) refute blob_contents.to_h.key?(:_meta) end test "Contents#to_h preserves empty _meta hash" do contents = Resource::Contents.new(uri: "test://example", mime_type: "text/plain", meta: {}) result = contents.to_h assert result.key?(:_meta) assert_equal({}, result[:_meta]) end end end end