require 'rails_helper' require 'timecop' describe PayRecurringDonation do before(:all) do #@data = PsqlFixtures.init # @result = @data['recurring_donation'] end let(:today) {Time.current.to_date} describe '.with_donation', :pending => true do # describe 'create a valid charge and payment when due' do # # end # it 'creates a new valid charge and payment when due' do # h = Timecop.freeze(Time.parse("2020-02-02").utc) do # VCR.use_cassette('PayRecurringDonation/h1') do # PayRecurringDonation.with_stripe(@result['recurring_donation']['id']) # end # end # expect(h['charge']['stripe_charge_id']).to be_present # expect(h['charge']['card_id']).to eq(@data['donor']['card']['id']) # expect(h['charge']['supporter_id']).to eq(@data['donor']['supporter']['id']) # expect(h['charge']['amount']).to eq(@data['recurring_donation']['recurring_donation']['amount']) # expect(h['charge']['donation_id']).to eq(@result['donation']['id']) # expect(h['charge']['nonprofit_id']).to eq(@data['np']['id']) # expect(h['charge']['status']).to eq('pending') # expect(h['charge']['payment_id']).to eq(h['payment']['id']) # expect(h['payment']['nonprofit_id']).to eq(@data['np']['id']) # expect(h['payment']['date']).to eq(h['payment']['created_at']) # expect(h['payment']['supporter_id']).to eq(@data['donor']['supporter']['id']) # expect(h['payment']['donation_id']).to eq(@result['donation']['id']) # expect(h['payment']['gross_amount']).to eq(@data['recurring_donation']['recurring_donation']['amount']) # expect(h['payment']['kind']).to eq('RecurringDonation') # # Wipe out data for other tests # Psql.execute("DELETE FROM charges WHERE id = #{h['charge']['id']}") # Psql.execute("DELETE FROM payments WHERE id = #{h['payment']['id']}") # end # # it 'returns a failed charge without a payment when the card is declined, increments n_failures, and is still due' do # Psql.execute("UPDATE donations SET card_id=#{@data['donor']['bad_card']['id']} WHERE id=#{@result['donation']['id']}") # h = Timecop.freeze(Time.parse("2020-02-01").utc) do # VCR.use_cassette('PayRecurringDonation/bad_card') do # PayRecurringDonation.with_stripe(@result['recurring_donation']['id']) # end # end # expect(h['charge']['status']).to eq 'failed' # expect(h['recurring_donation']['n_failures']).to eq 1 # Timecop.freeze(Time.parse("2020-02-01").utc) do # expect(QueryRecurringDonations.is_due?(h['recurring_donation']['id'])).to be true # end # Psql.execute("UPDATE donations SET card_id=#{@data['donor']['card']['id']} WHERE id=#{@result['donation']['id']}") # end # # it 'returns false when not due' do # Timecop.freeze(Time.parse("2020-01-01").utc) do # expect(PayRecurringDonation.with_stripe(@result['recurring_donation']['id'])).to be false # end # end end describe '.pay_all_due_with_stripe', :pending => true do # it 'queues a job to pay each due recurring donation' do # Timecop.freeze(Time.parse("2020-02-01").utc) do # VCR.use_cassette('PayRecurringDonation/pay_all_due_with_stripe') do # PayRecurringDonation.pay_all_due_with_stripe # end # end # jerbz = Psql.execute("SELECT * FROM delayed_jobs WHERE queue='rec-don-payments'") # handlers = jerbz.map{|j| YAML.load(j['handler'])} # expect(handlers.count).to eq(handlers.select{|h| h.method_name == :with_stripe}.count) # expect(handlers.count).to eq(handlers.select{|h| h.object == PayRecurringDonation}.count) # expect(handlers.map{|h| h.args}.flatten).to include(@result['recurring_donation']['id']) # Psql.execute("DELETE FROM delayed_jobs WHERE queue='rec-don-payments'") # end end describe '.ULTIMATE_VERIFICATION' do it 'returns false' do Timecop.freeze(Time.parse('2020-02-01').utc) do expect(PayRecurringDonation.ULTIMATE_VERIFICATION('2020-02-02', true, true, false, 'run_dangerously')).to be_falsey expect(PayRecurringDonation.ULTIMATE_VERIFICATION('2020-02-01', false, true, false, 'run_dangerously')).to be_falsey expect(PayRecurringDonation.ULTIMATE_VERIFICATION('2020-02-01', true, false, false, 'run_dangerously')).to be_falsey expect(PayRecurringDonation.ULTIMATE_VERIFICATION('2020-02-01', true, true, true, 'run_dangerously')).to be_falsey expect(PayRecurringDonation.ULTIMATE_VERIFICATION('2020-02-01', true, true, false, 'rd')).to be_falsey end end it 'returns true' do Timecop.freeze(Time.parse('2020-02-01').utc) do expect(PayRecurringDonation.ULTIMATE_VERIFICATION('2020-02-01', true, true, false, 'run dangerously')).to be_truthy end end end end