diff --git a/lib/mcp/annotations.rb b/lib/mcp/annotations.rb index 9674c73e..4481cab6 100644 --- a/lib/mcp/annotations.rb +++ b/lib/mcp/annotations.rb @@ -2,9 +2,15 @@ module MCP class Annotations + SUPPORTED_AUDIENCES = ["user", "assistant"] + 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 + @audience = audience @priority = priority @last_modified = last_modified diff --git a/test/mcp/annotations_test.rb b/test/mcp/annotations_test.rb index 60bfa722..1ada1b08 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 @@ -55,5 +55,37 @@ def test_initialization_with_last_modified_only assert_equal({ lastModified: timestamp }, annotations.to_h) 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_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_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