spec/beso/job_spec.rb in beso-0.0.1 vs spec/beso/job_spec.rb in beso-0.1.0
- old
+ new
@@ -1,81 +1,283 @@
require 'spec_helper'
describe Beso::Job do
+ before do
+ User.destroy_all
+ end
+
describe 'to_csv' do
subject { Beso::Job.new :message_sent, :table => :users }
- before do
- User.destroy_all
- end
-
let!( :foo ){ User.create! :name => 'Foo' }
let!( :bar ){ User.create! :name => 'Bar' }
- context 'with the default properties' do
+ context 'without an identity defined' do
+ before do
+ subject.timestamp :created_at
+ end
+ it 'should raise an error' do
+ expect { subject.to_csv }.to raise_error( Beso::MissingIdentityError )
+ end
+ end
+
+ context 'without a timestamp defined' do
+ before do
+ subject.identity { |user| user.id }
+ end
+ it 'should raise an error' do
+ expect { subject.to_csv }.to raise_error( Beso::MissingTimestampError )
+ end
+ end
+
+ context 'with a timestamp that is not a symbol' do
+ it 'should raise an error' do
+ expect { subject.timestamp 123 }.to raise_error( Beso::InvalidTimestampError )
+ end
+ end
+
+ context 'with only the mandatory columns defined' do
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ end
+
its( :to_csv ){ should eq( <<-EOS
Identity,Timestamp,Event
#{foo.id},#{foo.created_at.to_i},Message Sent
#{bar.id},#{bar.created_at.to_i},Message Sent
EOS
) }
end
- context 'with a custom property' do
+ context 'with custom properties defined' do
before do
- subject.prop :name
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ subject.prop( :user_name ){ |user| user.name }
end
its( :to_csv ){ should eq( <<-EOS
-Identity,Timestamp,Event,Prop:Name
-#{foo.id},#{foo.created_at.to_i},Message Sent,#{foo.name}
-#{bar.id},#{bar.created_at.to_i},Message Sent,#{bar.name}
+Identity,Timestamp,Event,Prop:User Name
+#{foo.id},#{foo.created_at.to_i},Message Sent,Foo
+#{bar.id},#{bar.created_at.to_i},Message Sent,Bar
EOS
) }
end
- context 'with a custom property with a custom title' do
+ context 'with literal properties defined' do
before do
- subject.prop :name, 'Handle'
+ subject.identity 22
+ subject.timestamp :created_at
+ subject.prop :foo, 'bar'
end
its( :to_csv ){ should eq( <<-EOS
-Identity,Timestamp,Event,Prop:Handle
+Identity,Timestamp,Event,Prop:Foo
+22,#{foo.created_at.to_i},Message Sent,bar
+22,#{bar.created_at.to_i},Message Sent,bar
+ EOS
+ ) }
+ end
+
+ context 'with symbol properties defined' do
+ before do
+ subject.identity :id
+ subject.timestamp :created_at
+ subject.prop :name
+ end
+
+ its( :to_csv ){ should eq( <<-EOS
+Identity,Timestamp,Event,Prop:Name
#{foo.id},#{foo.created_at.to_i},Message Sent,#{foo.name}
#{bar.id},#{bar.created_at.to_i},Message Sent,#{bar.name}
EOS
) }
end
- context 'with a custom property and a block' do
+ context 'with 10 custom properties defined' do
before do
- subject.prop :name do |name|
- name.length
+ subject.identity 22
+ subject.timestamp :created_at
+ (1..10).each do |i|
+ subject.prop :"foo #{i}", i
end
end
its( :to_csv ){ should eq( <<-EOS
-Identity,Timestamp,Event,Prop:Name
-#{foo.id},#{foo.created_at.to_i},Message Sent,#{foo.name.length}
-#{bar.id},#{bar.created_at.to_i},Message Sent,#{bar.name.length}
+Identity,Timestamp,Event,Prop:Foo 1,Prop:Foo 2,Prop:Foo 3,Prop:Foo 4,Prop:Foo 5,Prop:Foo 6,Prop:Foo 7,Prop:Foo 8,Prop:Foo 9,Prop:Foo 10
+22,#{foo.created_at.to_i},Message Sent,1,2,3,4,5,6,7,8,9,10
+22,#{bar.created_at.to_i},Message Sent,1,2,3,4,5,6,7,8,9,10
EOS
- )}
+ ) }
end
- context 'with a custom property with a custom title and a block' do
+ context 'with more than 10 custom properties defined' do
before do
- subject.prop :name, 'Name Length' do |name|
- name.length
- end
+ subject.identity 22
+ subject.timestamp :created_at
end
+ it 'should raise an error' do
+ expect {
+ (1..11).each do |i|
+ subject.prop :"foo #{i}", i
+ end
+ }.to raise_error Beso::TooManyPropertiesError
+ end
+ end
+ context 'with custom options given to #to_csv' do
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ end
+
+ it 'should support all options that CSV supports' do
+ subject.to_csv( :force_quotes => true, :col_sep => ';' ).should eq( <<-EOS
+"Identity";"Timestamp";"Event"
+"#{foo.id}";"#{foo.created_at.to_i}";"Message Sent"
+"#{bar.id}";"#{bar.created_at.to_i}";"Message Sent"
+ EOS
+ )
+ end
+ end
+
+ context 'with custom options given to constructor' do
+ subject { Beso::Job.new :message_sent, :table => :users, :col_sep => ';' }
+
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ end
+
its( :to_csv ){ should eq( <<-EOS
-Identity,Timestamp,Event,Prop:Name Length
-#{foo.id},#{foo.created_at.to_i},Message Sent,#{foo.name.length}
-#{bar.id},#{bar.created_at.to_i},Message Sent,#{bar.name.length}
+Identity;Timestamp;Event
+#{foo.id};#{foo.created_at.to_i};Message Sent
+#{bar.id};#{bar.created_at.to_i};Message Sent
EOS
- )}
+ ) }
end
+
+ context 'when no records match the query' do
+ subject { Beso::Job.new :message_sent, :table => :users }
+
+ before do
+ User.destroy_all
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ end
+
+ its( :to_csv ){ should be_nil }
+ end
end
+ describe 'with since specified' do
+ let!( :foo ){ User.create :name => 'Foo', :created_at => 100, :updated_at => 300 }
+ let!( :bar ){ User.create :name => 'Bar', :created_at => 200, :updated_at => 200 }
+ let!( :baz ){ User.create :name => 'Baz', :created_at => 300, :updated_at => 300 }
+
+ context 'in the constructor' do
+ context 'and the timestamp keyed on `created_at`' do
+ subject { Beso::Job.new :message_sent, :table => :users, :since => 101 }
+
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ end
+
+ its( :to_csv ){ should eq( <<-EOS
+Identity,Timestamp,Event
+#{bar.id},#{bar.created_at.to_i},Message Sent
+#{baz.id},#{baz.created_at.to_i},Message Sent
+ EOS
+ ) }
+ end
+ end
+
+ context 'in to_csv' do
+ context 'and the timestamp keyed on `created_at`' do
+ subject { Beso::Job.new :message_sent, :table => :users }
+
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :created_at
+ end
+
+ it 'should find records after `since`' do
+ subject.to_csv( :since => 101 ).should eq( <<-EOS
+Identity,Timestamp,Event
+#{bar.id},#{bar.created_at.to_i},Message Sent
+#{baz.id},#{baz.created_at.to_i},Message Sent
+ EOS
+ )
+ end
+ end
+ end
+
+ context 'in the constructor' do
+ context 'and the timestamp keyed on `updated_at`' do
+ subject { Beso::Job.new :message_sent, :table => :users, :since => 201 }
+
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :updated_at
+ end
+
+ its( :to_csv ){ should eq( <<-EOS
+Identity,Timestamp,Event
+#{foo.id},#{foo.updated_at.to_i},Message Sent
+#{baz.id},#{baz.updated_at.to_i},Message Sent
+ EOS
+ ) }
+ end
+ end
+
+ context 'in to_csv' do
+ context 'and the timestamp keyed on `updated_at`' do
+ subject { Beso::Job.new :message_sent, :table => :users }
+
+ before do
+ subject.identity { |user| user.id }
+ subject.timestamp :updated_at
+ end
+
+ it 'should find records after `since`' do
+ subject.to_csv( :since => 201 ).should eq( <<-EOS
+Identity,Timestamp,Event
+#{foo.id},#{foo.updated_at.to_i},Message Sent
+#{baz.id},#{baz.updated_at.to_i},Message Sent
+ EOS
+ )
+ end
+ end
+ end
+ end
+
+ describe '#last_timestamp' do
+ let!( :foo ){ User.create :name => 'Foo', :created_at => 100, :updated_at => 301 }
+ let!( :bar ){ User.create :name => 'Bar', :created_at => 200, :updated_at => 200 }
+ let!( :baz ){ User.create :name => 'Baz', :created_at => 300, :updated_at => 300 }
+
+ subject { Beso::Job.new :message_sent, :table => :users }
+
+ before do
+ subject.identity :id
+ end
+
+ context 'with the timestamp keyed on `created_at`' do
+ before do
+ subject.timestamp :created_at
+ end
+
+ its( :last_timestamp ){ should eq( 300 ) }
+ end
+
+ context 'with the timestamp keyed on `updated_at`' do
+ before do
+ subject.timestamp :updated_at
+ end
+
+ its( :last_timestamp ){ should eq( 301 ) }
+ end
+ end
end