require 'spec_helper'

module Ransack
  module Nodes
    describe Grouping do
      before do
        @g = 1
      end

      let(:context) { Context.for(Person) }

      subject { described_class.new(context) }

      describe '#attribute_method?' do
        context 'for attributes of the context' do
          it 'is true' do
            expect(subject.attribute_method?('name')).to be true
          end

          context "when the attribute contains '_and_'" do
            it 'is true' do
              expect(subject.attribute_method?('terms_and_conditions')).to be true
            end
          end

          context "when the attribute contains '_or_'" do
            it 'is true' do
              expect(subject.attribute_method?('true_or_false')).to be true
            end
          end

          context "when the attribute ends with '_start'" do
            it 'is true' do
              expect(subject.attribute_method?('life_start')).to be true
            end
          end

          context "when the attribute ends with '_end'" do
            it 'is true' do
              expect(subject.attribute_method?('stop_end')).to be true
            end
          end
        end

        context 'for unknown attributes' do
          it 'is false' do
            expect(subject.attribute_method?('not_an_attribute')).to be false
          end
        end
      end

      describe '#conditions=' do
        context 'when conditions are identical' do
          let(:conditions) do
            {
              '0' => {
                'a' => { '0'=> { 'name' => 'name', 'ransacker_args' => '' } },
                'p' => 'cont',
                'v' => { '0' => { 'value' => 'John' } }
              },
              '1' => {
                'a' => { '0' => { 'name' => 'name', 'ransacker_args' => '' } },
                'p' => 'cont',
                'v' => { '0' => { 'value' => 'John' } }
              }
            }
          end

          before { subject.conditions = conditions }

          it 'expect duplicates to be removed' do
            expect(subject.conditions.count).to eq 1
          end
        end

        context 'when conditions differ only by ransacker_args' do
          let(:conditions) do
            {
              '0' => {
                'a' => {
                  '0' => {
                    'name' => 'with_arguments',
                    'ransacker_args' => [1, 2]
                  }
                },
                'p' => 'eq',
                'v' => { '0' => { 'value' => '10' } }
              },
              '1' => {
                'a' => {
                  '0' => {
                    'name' => 'with_arguments',
                    'ransacker_args' => [3, 4]
                  }
                },
                'p' => 'eq',
                'v' => { '0' => { 'value' => '10' } }
              }
            }
          end

          before { subject.conditions = conditions }

          it 'expect them to be parsed as different and not as duplicates' do
            expect(subject.conditions.count).to eq 2
          end
        end
      end
    end
  end
end
