require_relative './environment.rb' require 'rack/test' include Rack::Test::Methods def app Sinatra::Application end describe 'email blasting' do before do EmailWorker.jobs.clear @admin_site = Fabricate :site, is_admin: true end it 'works' do DB['update sites set changed_count=?', 0].first relevant_emails = [] sites_emailed_count = Site::EMAIL_BLAST_MAXIMUM_PER_DAY*2 sites_emailed_count.times { site = Fabricate :site, updated_at: Time.now, changed_count: 1 relevant_emails << site.email } EmailWorker.jobs.clear time = Time.now Timecop.freeze(time) do post '/admin/email', { :csrf_token => 'abcd', :subject => 'Subject Test', :body => 'Body Test'}, { 'rack.session' => { 'id' => @admin_site.id, '_csrf_token' => 'abcd' } } relevant_jobs = EmailWorker.jobs.select{|j| relevant_emails.include?(j['args'].first['to']) } relevant_jobs.length.must_equal sites_emailed_count relevant_jobs.each do |job| args = job['args'].first args['from'].must_equal 'Kyle from Neocities ' args['subject'].must_equal 'Subject Test' args['body'].must_equal 'Body Test' end relevant_jobs.select {|j| j['at'].nil? || j['at'] == Time.now.to_f}.length.must_equal 1 relevant_jobs.select {|j| j['at'] == (Time.now + 0.5).to_f}.length.must_equal 1 relevant_jobs.select {|j| j['at'] == (time+1.day.to_i).to_f}.length.must_equal 1 relevant_jobs.select {|j| j['at'] == (time+1.day.to_i+0.5).to_f}.length.must_equal 1 end end end