require 'spec_helper' describe 'Ransack Query' do let(:parser) { NQL::SyntaxParser.new } context 'Single comparisons' do it 'Equals' do q = parser.parse('id = 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'eq' q[:c][0].should have_value '1234' end it 'Not equals' do q = parser.parse('id != 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'not_eq' q[:c][0].should have_value '1234' end it 'Greater than' do q = parser.parse('id > 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'gt' q[:c][0].should have_value '1234' end it 'Greater or equals than' do q = parser.parse('id >= 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'gteq' q[:c][0].should have_value '1234' end it 'Less than' do q = parser.parse('id < 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'lt' q[:c][0].should have_value '1234' end it 'Less or equals than' do q = parser.parse('id <= 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'lteq' q[:c][0].should have_value '1234' end it 'Contains' do q = parser.parse('id % 1234').to_ransack q[:c][0].should have_attribute 'id' q[:c][0].should have_predicate 'cont' q[:c][0].should have_value '1234' end it 'Model references' do q = parser.parse('models.id = 1234').to_ransack q[:c][0].should have_attribute 'models_id' q[:c][0].should have_predicate 'eq' q[:c][0].should have_value '1234' end end context 'Coordinated comparisons' do it 'And' do q = parser.parse('id > 1234 & name = abcd').to_ransack q[:g][0][:m].should eq 'and' q[:g][0][:c][0].should have_attribute 'id' q[:g][0][:c][0].should have_predicate 'gt' q[:g][0][:c][0].should have_value '1234' q[:g][0][:c][1].should have_attribute 'name' q[:g][0][:c][1].should have_predicate 'eq' q[:g][0][:c][1].should have_value 'abcd' end it 'Or' do q = parser.parse('id < 1234 | name % abcd').to_ransack q[:g][0][:m].should eq 'or' q[:g][0][:c][0].should have_attribute 'id' q[:g][0][:c][0].should have_predicate 'lt' q[:g][0][:c][0].should have_value '1234' q[:g][0][:c][1].should have_attribute 'name' q[:g][0][:c][1].should have_predicate 'cont' q[:g][0][:c][1].should have_value 'abcd' end it 'And then Or' do q = parser.parse('id > 1234 & name = abcd | name % efgh').to_ransack q[:g][0][:m].should eq 'and' q[:g][0][:c][0].should have_attribute 'id' q[:g][0][:c][0].should have_predicate 'gt' q[:g][0][:c][0].should have_value '1234' q[:g][0][:g][0][:m].should eq 'or' q[:g][0][:g][0][:c][0].should have_attribute 'name' q[:g][0][:g][0][:c][0].should have_predicate 'eq' q[:g][0][:g][0][:c][0].should have_value 'abcd' q[:g][0][:g][0][:c][1].should have_attribute 'name' q[:g][0][:g][0][:c][1].should have_predicate 'cont' q[:g][0][:g][0][:c][1].should have_value 'efgh' end it 'With parentheses' do q = parser.parse('(id > 1234 & name = abcd) | name % efgh').to_ransack q[:g][0][:g][0][:m].should eq 'and' q[:g][0][:g][0][:c][0].should have_attribute 'id' q[:g][0][:g][0][:c][0].should have_predicate 'gt' q[:g][0][:g][0][:c][0].should have_value '1234' q[:g][0][:g][0][:c][1].should have_attribute 'name' q[:g][0][:g][0][:c][1].should have_predicate 'eq' q[:g][0][:g][0][:c][1].should have_value 'abcd' q[:g][0][:m].should eq 'or' q[:g][0][:c][0].should have_attribute 'name' q[:g][0][:c][0].should have_predicate 'cont' q[:g][0][:c][0].should have_value 'efgh' end end end