require 'spec_helper' describe Mongoid::Scroll::Cursor do context 'an empty cursor' do subject do Mongoid::Scroll::Cursor.new nil, field_name: 'a_string', field_type: String end its(:tiebreak_id) { should be_nil } its(:value) { should be_nil } its(:criteria) { should eq({}) } end context 'an invalid cursor' do it 'raises InvalidCursorError' do expect { Mongoid::Scroll::Cursor.new 'invalid', field_name: 'a_string', field_type: String }.to raise_error Mongoid::Scroll::Errors::InvalidCursorError, /The cursor supplied is invalid: invalid./ end end context 'a string field cursor' do let(:feed_item) { Feed::Item.create!(a_string: 'astring') } subject do Mongoid::Scroll::Cursor.new "#{feed_item.a_string}:#{feed_item.id}", field_name: 'a_string', field_type: String end its(:value) { should eq feed_item.a_string } its(:tiebreak_id) { should eq feed_item.id } its(:criteria) { should eq('$or' => [ { 'a_string' => { '$gt' => feed_item.a_string } }, { 'a_string' => feed_item.a_string, :_id => { '$gt' => feed_item.id } } ]) } end context 'an integer field cursor' do let(:feed_item) { Feed::Item.create!(a_integer: 10) } subject do Mongoid::Scroll::Cursor.new "#{feed_item.a_integer}:#{feed_item.id}", field_name: 'a_integer', field_type: Integer end its(:value) { should eq feed_item.a_integer } its(:tiebreak_id) { should eq feed_item.id } its(:criteria) { should eq('$or' => [ { 'a_integer' => { '$gt' => feed_item.a_integer } }, { 'a_integer' => feed_item.a_integer, :_id => { '$gt' => feed_item.id } } ]) } end context 'a date/time field cursor' do let(:feed_item) { Feed::Item.create!(a_datetime: DateTime.new(2013, 12, 21, 1, 42, 3)) } subject do Mongoid::Scroll::Cursor.new "#{feed_item.a_datetime.to_i}:#{feed_item.id}", field_name: 'a_datetime', field_type: DateTime end its(:value) { should eq feed_item.a_datetime } its(:tiebreak_id) { should eq feed_item.id } its(:to_s) { should eq "#{feed_item.a_datetime.to_i}:#{feed_item.id}" } its(:criteria) { should eq('$or' => [ { 'a_datetime' => { '$gt' => feed_item.a_datetime } }, { 'a_datetime' => feed_item.a_datetime, :_id => { '$gt' => feed_item.id } } ]) } end context 'a date field cursor' do let(:feed_item) { Feed::Item.create!(a_date: Date.new(2013, 12, 21)) } subject do Mongoid::Scroll::Cursor.new "#{feed_item.a_date.to_datetime.to_i}:#{feed_item.id}", field_name: 'a_date', field_type: Date end its(:value) { should eq feed_item.a_date } its(:tiebreak_id) { should eq feed_item.id } its(:to_s) { should eq "#{feed_item.a_date.to_datetime.to_i}:#{feed_item.id}" } its(:criteria) { should eq('$or' => [ { 'a_date' => { '$gt' => feed_item.a_date.to_datetime } }, { 'a_date' => feed_item.a_date.to_datetime, :_id => { '$gt' => feed_item.id } } ]) } end context 'a time field cursor' do let(:feed_item) { Feed::Item.create!(a_time: Time.new(2013, 12, 21, 1, 2, 3)) } subject do Mongoid::Scroll::Cursor.new "#{feed_item.a_time.to_i}:#{feed_item.id}", field_name: 'a_time', field_type: Time end its(:value) { should eq feed_item.a_time } its(:tiebreak_id) { should eq feed_item.id } its(:to_s) { should eq "#{feed_item.a_time.to_i}:#{feed_item.id}" } its(:criteria) { should eq('$or' => [ { 'a_time' => { '$gt' => feed_item.a_time } }, { 'a_time' => feed_item.a_time, :_id => { '$gt' => feed_item.id } } ]) } end context 'a time field cursor with a field option' do let(:feed_item) { Feed::Item.create!(a_time: Time.new(2013, 12, 21, 1, 2, 3)) } subject do Mongoid::Scroll::Cursor.new "#{feed_item.a_time.to_i}:#{feed_item.id}", field: Feed::Item.fields['a_time'] end its(:value) { should eq feed_item.a_time } its(:tiebreak_id) { should eq feed_item.id } its(:to_s) { should eq "#{feed_item.a_time.to_i}:#{feed_item.id}" } its(:criteria) { should eq('$or' => [ { 'a_time' => { '$gt' => feed_item.a_time } }, { 'a_time' => feed_item.a_time, :_id => { '$gt' => feed_item.id } } ]) } end context 'an array field cursor' do let(:feed_item) { Feed::Item.create!(a_array: ['x', 'y']) } it 'is not supported' do expect { Mongoid::Scroll::Cursor.from_record feed_item, field_name: 'a_array', field_type: Array }.to raise_error Mongoid::Scroll::Errors::UnsupportedFieldTypeError, /The type of the field 'a_array' is not supported: Array./ end end context 'an invalid field cursor' do it 'raises ArgumentError' do expect { Mongoid::Scroll::Cursor.new 'invalid:whatever', {} }.to raise_error ArgumentError end end end