<commit_before>require 'rails_helper'

RSpec.describe KeywordMute, type: :model do
  let(:alice) { Fabricate(:account, username: 'alice').tap(&:save!) }
  let(:bob) { Fabricate(:account, username: 'bob').tap(&:save!) }

  describe '.matcher_for' do
    let(:matcher) { KeywordMute.matcher_for(alice) }

    describe 'with no KeywordMutes for an account' do
      before do
        KeywordMute.delete_all
      end

      it 'does not match' do
        expect(matcher =~ 'This is a hot take').to be_falsy
      end
    end

    describe 'with KeywordMutes for an account' do
      it 'does not match keywords set by a different account' do
        KeywordMute.create!(account: bob, keyword: 'take')

        expect(matcher =~ 'This is a hot take').to be_falsy
      end

      it 'does not match if no keywords match the status text' do
        KeywordMute.create!(account: alice, keyword: 'cold')

        expect(matcher =~ 'This is a hot take').to be_falsy
      end

      it 'does not match substrings matching keywords' do
        KeywordMute.create!(account: alice, keyword: 'take')

        expect(matcher =~ 'This is a shiitake mushroom').to be_falsy
      end

      it 'matches keywords at the beginning of the text' do
        KeywordMute.create!(account: alice, keyword: 'take')

        expect(matcher =~ 'Take this').to be_truthy
      end

      it 'matches keywords at the beginning of the text' do
        KeywordMute.create!(account: alice, keyword: 'take')

        expect(matcher =~ 'This is a hot take').to be_truthy
      end

      it 'matches if at least one keyword case-insensitively matches the text' do
        KeywordMute.create!(account: alice, keyword: 'hot')

        expect(matcher =~ 'This is a hot take').to be_truthy<commit_msg>Fix case-insensitive match scenario; test some word ornamentation.  #164.<commit_after>require 'rails_helper'

RSpec.describe KeywordMute, type: :model do
  let(:alice) { Fabricate(:account, username: 'alice').tap(&:save!) }
  let(:bob) { Fabricate(:account, username: 'bob').tap(&:save!) }

  describe '.matcher_for' do
    let(:matcher) { KeywordMute.matcher_for(alice) }

    describe 'with no KeywordMutes for an account' do
      before do
        KeywordMute.delete_all
      end

      it 'does not match' do
        expect(matcher =~ 'This is a hot take').to be_falsy
      end
    end

    describe 'with KeywordMutes for an account' do
      it 'does not match keywords set by a different account' do
        KeywordMute.create!(account: bob, keyword: 'take')

        expect(matcher =~ 'This is a hot take').to be_falsy
      end

      it 'does not match if no keywords match the status text' do
        KeywordMute.create!(account: alice, keyword: 'cold')

        expect(matcher =~ 'This is a hot take').to be_falsy
      end

      it 'does not match substrings matching keywords' do
        KeywordMute.create!(account: alice, keyword: 'take')

        expect(matcher =~ 'This is a shiitake mushroom').to be_falsy
      end

      it 'matches keywords at the beginning of the text' do
        KeywordMute.create!(account: alice, keyword: 'take')

        expect(matcher =~ 'Take this').to be_truthy
      end

      it 'matches keywords at the beginning of the text' do
        KeywordMute.create!(account: alice, keyword: 'take')

        expect(matcher =~ 'This is a hot take').to be_truthy
      end

      it 'matches if at least one keyword case-insensitively matches the text' do
        KeywordMute.create!(account: alice, keyword: 'hot')

        expect(matcher =~ 'This is a HOT take').to be_truthy
      end

      it 'matches keywords surrounded by non-alphanumeric ornamentation' do
        KeywordMute.create!(account: alice, keyword: 'hot')

        expect(matcher =~ 'This is a ~*HOT*~ take').to be_truthy
{'fraction_non_alphanumeric': 0.10160568570676494, 'fraction_numerical': 0.0007896814951302974, 'mean_word_length': 2.881511746680286, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '647069', 'n_tokens_mistral': 1217, 'n_tokens_neox': 1161, 'n_words': 395}