require 'spec_helper' describe EmailBatch do after(:each) do Timecop.return end describe 'all users' do # before { pending } let (:email_batch) { FactoryGirl.create(:email_batch) } before(:each) do BatchMailer.deliveries.clear end it 'has test emails setup' do expect(email_batch.test_emails.present?).to be true expect(email_batch.pending?).to be true users = email_batch.test_users expect(email_batch.test_count).to eq(users.count) end end describe 'new musician' do before { pending } let (:new_musician_batch) { FactoryGirl.create(:email_batch_new_musician) } before(:each) do @u1 = FactoryGirl.create(:user, :lat => 37.791649, :lng => -122.394395, :email => 'jonathan@jamkazam.com', :subscribe_email => true, :created_at => Time.now - 3.weeks) @u2 = FactoryGirl.create(:user, :lat => 37.791649, :lng => -122.394395, :subscribe_email => true) @u3 = FactoryGirl.create(:user, :lat => 37.791649, :lng => -122.394395, :subscribe_email => false, :created_at => Time.now - 3.weeks) @u4 = FactoryGirl.create(:user, :lat => 37.791649, :lng => -122.394395, :subscribe_email => true, :created_at => Time.now - 3.weeks) end it 'find new musicians with good score' do new_musician_batch.fetch_recipients do |new_musicians| expect(new_musicians.count).to eq(2) num = (new_musicians.keys.map(&:id) - [@u1.id, @u4.id]).count expect(num).to eq(0) end end it 'cycles through states properly' do new_musician_batch.deliver_batch expect(UserMailer.deliveries.length).to eq(2) new_musician_batch.reload expect(new_musician_batch.delivered?).to eq(true) expect(new_musician_batch.sent_count).to eq(2) end end context 'user progress' do before { pending } describe 'one at a time' do let(:batchp) { FactoryGirl.create(:email_batch_progression, :sub_type => :client_notdl) } let(:user_existing) { FactoryGirl.create(:user, :created_at => Time.now - (2 * batchp.days_past_for_trigger_index(2)).days) } after(:each) do batchp.clear_batch_sets! Timecop.return end it 'sends one email' do user_existing batchp.deliver_batch expect(ProgressMailer.deliveries.length).to eq(1) end end describe 'client not downloaded' do before { pending } let(:batchp) { FactoryGirl.create(:email_batch_progression, :sub_type => :client_notdl) } let(:user_) { FactoryGirl.create(:user) } let(:user_existing) { FactoryGirl.create(:user, :created_at => Time.now - (2 * batchp.days_past_for_trigger_index(2)).days) } after(:each) do batchp.clear_batch_sets! Timecop.return end it 'returns no users' do user_ expect(batchp.fetch_recipients.count).to eq(0) end it 'returns user first trigger' do user_ expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) dd = user_.created_at + batchp.days_past_for_trigger_index(0).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(1) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) batchp.make_set(user_, 0) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) dd = dd + batchp.days_past_for_trigger_index(1).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(1) expect(batchp.fetch_recipients(2).count).to eq(0) batchp.make_set(user_, 1) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) dd = dd + batchp.days_past_for_trigger_index(2).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(1) batchp.make_set(user_, 2) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) end it 'handles existing users' do user_existing expect(batchp.fetch_recipients(0).count).to eq(1) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) dd = user_existing.created_at + batchp.days_past_for_trigger_index(0).days Timecop.travel(dd) batchp.make_set(user_existing, 0) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) dd = dd + batchp.days_past_for_trigger_index(1).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(1) expect(batchp.fetch_recipients(2).count).to eq(0) batchp.make_set(user_existing, 1) dd = dd + batchp.days_past_for_trigger_index(2).days Timecop.travel(dd) expect(batchp.fetch_recipients(2).count).to eq(1) batchp.make_set(user_existing, 2) expect(batchp.fetch_recipients(2).count).to eq(0) dd = dd + 1 Timecop.travel(dd) expect(batchp.fetch_recipients(2).count).to eq(0) end it 'skips some days' do user_ dd = user_.created_at + batchp.days_past_for_trigger_index(1).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(1) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(0) batchp.make_set(user_, 0) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) dd = dd + batchp.days_past_for_trigger_index(1).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(1) expect(batchp.fetch_recipients(2).count).to eq(0) batchp.make_set(user_, 1) expect(batchp.fetch_recipients(2).count).to eq(0) dd = dd + batchp.days_past_for_trigger_index(2).days Timecop.travel(dd) expect(batchp.fetch_recipients(0).count).to eq(0) expect(batchp.fetch_recipients(1).count).to eq(0) expect(batchp.fetch_recipients(2).count).to eq(1) batchp.make_set(user_, 2) expect(batchp.fetch_recipients(2).count).to eq(0) end end describe 'loop bunch of users' do let(:batchp) { FactoryGirl.create(:email_batch_progression, :sub_type => :client_notdl) } it 'returns no users' do users = [] 20.times { |nn| users << FactoryGirl.create(:user) } expect(batchp.fetch_recipients(0,5).count).to eq(0) dd = users[0].created_at + batchp.days_past_for_trigger_index(0).days Timecop.travel(dd) expect(batchp.fetch_recipients(0,5).count).to eq(20) users.each { |uu| batchp.make_set(uu, 0) } expect(batchp.fetch_recipients(0,5).count).to eq(0) end end end end