# frozen_string_literal: true

require 'rails_helper'

RSpec.describe Admin::SensitiveWord do
  describe '#sensitive?' do
    subject { described_class.sensitive?(text, spoiler_text, local: local) }

    let(:text) { 'This is a ohagi.' }
    let(:spoiler_text) { '' }
    let(:local) { true }

    context 'when a local post' do
      it 'local word hits' do
        Fabricate(:sensitive_word, keyword: 'ohagi', remote: false)
        expect(subject).to be true
      end

      it 'remote word hits' do
        Fabricate(:sensitive_word, keyword: 'ohagi', remote: true)
        expect(subject).to be true
      end
    end

    context 'when a remote post' do
      let(:local) { false }

      it 'local word does not hit' do
        Fabricate(:sensitive_word, keyword: 'ohagi', remote: false)
        expect(subject).to be false
      end

      it 'remote word hits' do
        Fabricate(:sensitive_word, keyword: 'ohagi', remote: true)
        expect(subject).to be true
      end
    end

    context 'when using regexp' do
      it 'regexp hits with enable' do
        Fabricate(:sensitive_word, keyword: 'oha[ghi]i', regexp: true)
        expect(subject).to be true
      end

      it 'regexp does not hit without enable' do
        Fabricate(:sensitive_word, keyword: 'oha[ghi]i', regexp: false)
        expect(subject).to be false
      end
    end

    context 'when spoiler text is set' do
      let(:spoiler_text) { 'amy' }

      it 'sensitive word in content is escaped' do
        Fabricate(:sensitive_word, keyword: 'ohagi', spoiler: false)
        expect(subject).to be false
      end

      it 'sensitive word in content is escaped even if spoiler is true' do
        Fabricate(:sensitive_word, keyword: 'ohagi', spoiler: true)
        expect(subject).to be false
      end

      it 'non-spoiler word does not hit' do
        Fabricate(:sensitive_word, keyword: 'amy', spoiler: false)
        expect(subject).to be false
      end

      it 'spoiler word hits' do
        Fabricate(:sensitive_word, keyword: 'amy', spoiler: true)
        expect(subject).to be true
      end
    end
  end
end