diff --git a/app/models/dmail_filter.rb b/app/models/dmail_filter.rb index ad5b16d24..6cd8f58f1 100644 --- a/app/models/dmail_filter.rb +++ b/app/models/dmail_filter.rb @@ -1,4 +1,6 @@ class DmailFilter < ApplicationRecord + extend Memoist + belongs_to :user validates_presence_of :user before_validation :initialize_user @@ -18,6 +20,9 @@ class DmailFilter < ApplicationRecord end def regexp - @regexp ||= /\b#{Regexp.union(words.split(/[[:space:]]+/))}\b/ + union = words.split(/[[:space:]]+/).map { |word| Regexp.escape(word) }.join("|") + /\b#{union}\b/i end + + memoize :regexp end diff --git a/test/unit/dmail_filter_test.rb b/test/unit/dmail_filter_test.rb index 2c62ae506..c476ed6b5 100644 --- a/test/unit/dmail_filter_test.rb +++ b/test/unit/dmail_filter_test.rb @@ -28,6 +28,11 @@ class DmailFilterTest < ActiveSupport::TestCase create_dmail("okay", "banned") assert_equal(true, @receiver.dmails.last.is_read?) end + + should "be case insensitive" do + create_dmail("Banned.", "okay") + assert_equal(true, @receiver.dmails.last.is_read?) + end end context "a dmail filter for a user name" do @@ -40,4 +45,13 @@ class DmailFilterTest < ActiveSupport::TestCase assert_equal(true, @receiver.dmails.last.is_read?) end end + + context "a dmail filter containing multiple words" do + should "filter dmails containing any of the words" do + @receiver.create_dmail_filter(words: "foo bar spam") + create_dmail("this is a test (not *SPAM*)", "hello world") + + assert_equal(true, @receiver.dmails.last.is_read?) + end + end end