diff --git a/lib/mcp/annotations.rb b/lib/mcp/annotations.rb index 540588a6..f8562f22 100644 --- a/lib/mcp/annotations.rb +++ b/lib/mcp/annotations.rb @@ -2,9 +2,14 @@ module MCP class Annotations + SUPPORTED_AUDIENCES = ["user", "assistant"].freeze + attr_reader :audience, :priority, :last_modified def initialize(audience: nil, priority: nil, last_modified: nil) + if audience && !(audience.is_a?(Array) && audience.all? { |role| SUPPORTED_AUDIENCES.include?(role) }) + raise ArgumentError, 'The value of audience must be an array of "user" or "assistant".' + end raise ArgumentError, "The value of priority must be between 0 and 1." if priority && !priority.between?(0, 1) @audience = audience diff --git a/test/mcp/annotations_test.rb b/test/mcp/annotations_test.rb index a82b9552..1e5d3df2 100644 --- a/test/mcp/annotations_test.rb +++ b/test/mcp/annotations_test.rb @@ -5,24 +5,24 @@ module MCP class AnnotationsTest < ActiveSupport::TestCase def test_initialization - annotations = Annotations.new(audience: ["developers"], priority: 0.8) + annotations = Annotations.new(audience: ["user"], priority: 0.8) - assert_equal(["developers"], annotations.audience) + assert_equal(["user"], annotations.audience) assert_equal(0.8, annotations.priority) assert_nil(annotations.last_modified) - assert_equal({ audience: ["developers"], priority: 0.8 }, annotations.to_h) + assert_equal({ audience: ["user"], priority: 0.8 }, annotations.to_h) end def test_initialization_with_all_attributes timestamp = Time.utc(2025, 1, 12, 15, 0, 58).iso8601 - annotations = Annotations.new(audience: ["developers"], priority: 0.8, last_modified: timestamp) + annotations = Annotations.new(audience: ["user"], priority: 0.8, last_modified: timestamp) - assert_equal(["developers"], annotations.audience) + assert_equal(["user"], annotations.audience) assert_equal(0.8, annotations.priority) assert_equal(timestamp, annotations.last_modified) - assert_equal({ audience: ["developers"], priority: 0.8, lastModified: timestamp }, annotations.to_h) + assert_equal({ audience: ["user"], priority: 0.8, lastModified: timestamp }, annotations.to_h) end def test_initialization_by_default @@ -36,13 +36,13 @@ def test_initialization_by_default end def test_initialization_with_partial_attributes - annotations = Annotations.new(audience: ["developers"]) + annotations = Annotations.new(audience: ["user"]) - assert_equal(["developers"], annotations.audience) + assert_equal(["user"], annotations.audience) assert_nil(annotations.priority) assert_nil(annotations.last_modified) - assert_equal({ audience: ["developers"] }, annotations.to_h) + assert_equal({ audience: ["user"] }, annotations.to_h) end def test_initialization_with_last_modified_only @@ -81,5 +81,50 @@ def test_invalid_priority_below_lower_bound end assert_equal("The value of priority must be between 0 and 1.", exception.message) end + + def test_valid_audience_with_user + assert_nothing_raised do + Annotations.new(audience: ["user"]) + end + end + + def test_valid_audience_with_assistant + assert_nothing_raised do + Annotations.new(audience: ["assistant"]) + end + end + + def test_valid_audience_with_multiple_roles + assert_nothing_raised do + Annotations.new(audience: ["user", "assistant"]) + end + end + + def test_valid_audience_with_empty_array + assert_nothing_raised do + Annotations.new(audience: []) + end + end + + def test_invalid_audience_with_unknown_role + exception = assert_raises(ArgumentError) do + Annotations.new(audience: ["developers"]) + end + assert_equal('The value of audience must be an array of "user" or "assistant".', exception.message) + end + + def test_invalid_audience_with_mixed_roles + exception = assert_raises(ArgumentError) do + Annotations.new(audience: ["user", "developers"]) + end + assert_equal('The value of audience must be an array of "user" or "assistant".', exception.message) + end + + def test_invalid_audience_when_not_array + exception = assert_raises(ArgumentError) do + Annotations.new(audience: "user") + end + assert_equal('The value of audience must be an array of "user" or "assistant".', exception.message) + end end end