require_relative 'spec_helper.rb'
require_relative '../lib/philtre/predicate_splitter.rb'
require_relative '../lib/philtre/predicates.rb'

# for blank?
Sequel.extension :blank

describe Philtre::PredicateSplitter do
  describe '#split_key' do
    describe 'successful' do
      let(:splitter){ Philtre::PredicateSplitter.new( 'birth_year_like', 'fifteeen' ) }

      it 'returns true' do
        splitter.split_key( :like ).should be_truthy
      end

      it 'keeps field as symbol' do
        splitter.split_key :like
        splitter.field.should == :birth_year
      end

      it 'keeps op as symbol' do
        splitter.split_key :like
        splitter.op.should == :like
      end
    end

    describe 'unsuccessful' do
      let(:splitter){ Philtre::PredicateSplitter.new 'birth_year', 'fifteeen' }

      it 'returns false' do
        splitter.split_key( :like ).should be_falsey
      end

      it 'keeps key as symbol' do
        splitter.split_key :like
        splitter.field.should == :birth_year
      end

      it 'op is nil' do
        splitter.split_key :like
        splitter.op.should be_nil
      end
    end

    describe 'custom predicate' do
      it 'accepts the whole thing, undeterred by _' do
        splitter = Philtre::PredicateSplitter.new 'custom_predicate', 'fifteeen'
        (splitter === :custom_predicate).should === 0
      end
    end

    describe "'ware the false matches, laddie" do
      Philtre::Predicates::DefaultPredicates.instance_methods.each do |suffix|
        word = Faker::Lorem.words(rand(1..3)) * '_'

        let(:suffix){suffix}
        let(:word){word}

        it "#{word}#{suffix} unsplit" do
          splitter = Philtre::PredicateSplitter.new "#{word}#{suffix}", 'blabla'
          splitter.split_key(suffix).should be_falsey
        end

        it "#{word}_#{suffix} split" do
          splitter = Philtre::PredicateSplitter.new "#{word}_#{suffix}", 'unbla'
          splitter.split_key suffix
          splitter.field.should == word.to_sym
        end
      end
    end
  end
end