diff --git a/enterprise/app/services/captain/audience_matcher.rb b/enterprise/app/services/captain/audience_matcher.rb index 007960871..ba707e179 100644 --- a/enterprise/app/services/captain/audience_matcher.rb +++ b/enterprise/app/services/captain/audience_matcher.rb @@ -42,14 +42,14 @@ class Captain::AudienceMatcher def matches_leaf?(leaf) key = leaf[:attribute_key] actual = attribute_value(key) - expected = Array(leaf[:values]).first + values = Array(leaf[:values]) case leaf[:filter_operator] when 'is_present' then actual.present? when 'is_not_present' then actual.blank? - when 'equal_to' then value_equal?(key, actual, expected) - when 'not_equal_to' then !value_equal?(key, actual, expected) - else matches_text_or_range?(leaf[:filter_operator], actual, expected) + when 'equal_to' then values.any? { |expected| value_equal?(key, actual, expected) } + when 'not_equal_to' then values.none? { |expected| value_equal?(key, actual, expected) } + else matches_text_or_range?(leaf[:filter_operator], actual, values.first) end end diff --git a/spec/enterprise/services/captain/audience_matcher_spec.rb b/spec/enterprise/services/captain/audience_matcher_spec.rb index 279e0439c..2a6604007 100644 --- a/spec/enterprise/services/captain/audience_matcher_spec.rb +++ b/spec/enterprise/services/captain/audience_matcher_spec.rb @@ -77,6 +77,16 @@ RSpec.describe Captain::AudienceMatcher do expect(matches?(leaf('labels', 'equal_to', 'vip'))).to be(true) expect(matches?(leaf('labels', 'equal_to', 'enterprise'))).to be(false) end + + it 'matches any of multiple selected labels' do + expect(matches?(leaf('labels', 'equal_to', %w[enterprise vip]))).to be(true) + expect(matches?(leaf('labels', 'equal_to', %w[enterprise smb]))).to be(false) + end + + it 'not_equal_to rejects contacts carrying any selected label' do + expect(matches?(leaf('labels', 'not_equal_to', %w[enterprise vip]))).to be(false) + expect(matches?(leaf('labels', 'not_equal_to', %w[enterprise smb]))).to be(true) + end end context 'with conversation language fields' do