houdini/spec/lib/update/update_donation_spec.rb

416 lines
16 KiB
Ruby

# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
require 'rails_helper'
describe UpdateDonation do
before {
Timecop.freeze(2020, 2, 3)
}
after {
Timecop.return
}
let(:np) {force_create(:nonprofit)}
let(:supporter) {force_create(:supporter, nonprofit: np)}
let(:donation) {force_create(:donation, nonprofit: np,
dedication: initial_dedication,
comment: initial_comment,
designation: initial_designation,
amount: initial_amount,
date: initial_date,
supporter: supporter)}
let(:payment) {force_create(:payment, nonprofit: np, donation: donation,
towards: initial_designation,
date: initial_date,
gross_amount: initial_amount,
fee_total: initial_fee,
net_amount: initial_amount - initial_fee,
supporter: supporter
)}
let(:offsite_payment) {force_create(:offsite_payment, payment: payment, nonprofit: np, donation: donation,
check_number: initial_check_number,
gross_amount: initial_amount,
date: initial_date,
supporter: supporter)}
let(:payment2) {force_create(:payment, nonprofit: np, donation: donation,
towards: initial_designation,
date: payment2_date,
gross_amount: initial_amount,
fee_total: initial_fee,
net_amount: initial_amount - initial_fee
)}
let(:campaign) {force_create(:campaign, nonprofit: np)}
let(:event) {force_create(:event, nonprofit: np)}
let(:other_campaign) {force_create(:campaign)}
let(:other_event) {force_create(:event)}
let(:initial_date) {Date.new(2020, 4, 5).to_time}
let(:initial_dedication) {"initial dedication"}
let(:initial_comment) {"comment"}
let(:initial_amount) {4000}
let(:initial_designation) {"designation"}
let(:initial_fee) {555}
let(:initial_check_number) {"htoajmioeth"}
let(:new_date_input) { '2020-05-05'}
let(:new_date) {Date.new(2020, 5, 5)}
let(:new_dedication) {"new dedication"}
let(:new_comment) {"new comment"}
let(:new_amount) {5646}
let(:new_designation) {"new designation"}
let(:new_fee) {54}
let(:new_check_number) {"new check number"}
let(:initial_time) {Time.now}
let(:payment2_date) {initial_date + 10.days}
before(:each) {
initial_time
payment
}
describe '.update_payment' do
describe 'param validation' do
it 'basic validation' do
expect {UpdateDonation.update_payment(nil, nil)}.to raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, [{key: :id, name: :required},
{key: :id, name: :is_reference},
{key: :data, name: :required},
{key: :data, name: :is_hash}])
}
end
it 'validates whether payment is valid' do
expect{ UpdateDonation.update_payment(5555, {})}.to raise_error{|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, [{key: :id}])
expect(error.message).to eq "5555 is does not correspond to a valid donation"
}
end
describe 'data validation' do
let(:initial_invalid_arguments) {{
designation: 1,
dedication: 1,
comment: 1,
campaign_id: nil,
event_id: nil}}
let(:expanded_invalid_arguments) {
initial_invalid_arguments.merge({
fee_total: 'fun',
gross_amount: 'fun',
check_number: Time.now,
date: 'INVALID DATE'})
}
let(:initial_validation_errors) {[
{key: :designation, name: :is_a},
{key: :dedication, name: :is_a},
{key: :comment, name: :is_a},
{key: :campaign_id, name: :is_reference},
{key: :campaign_id, name: :required},
{key: :event_id, name: :is_reference},
{key: :event_id, name: :required}
]}
it 'for offsite donations' do
offsite_payment
expect {UpdateDonation.update_payment(donation.id, expanded_invalid_arguments)}.to(raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, initial_validation_errors.concat([
{key: :fee_total, name: :is_integer},
{key: :gross_amount, name: :is_integer},
{key: :gross_amount, name: :min},
{key: :check_number, name: :is_a},
{key: :date, name: :can_be_date}
]))
})
end
it 'for online donation' do
expect {UpdateDonation.update_payment(donation.id, expanded_invalid_arguments)}.to(raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, initial_validation_errors)
})
end
end
it 'validate campaign_id' do
expect {UpdateDonation.update_payment(donation.id, {campaign_id: 444, event_id: 444})}.to(raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, [{key: :campaign_id}])
})
end
it 'validate event_id' do
expect {UpdateDonation.update_payment(donation.id, {event_id: 4444, campaign_id: campaign.id})}.to(raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, [{key: :event_id}])
})
end
it 'validates campaign belongs to payment org' do
campaign_belongs {UpdateDonation.update_payment(donation.id, {campaign_id: other_campaign.id, event_id: event.id})}
end
it 'validates event belongs to payment org' do
event_belongs {UpdateDonation.update_payment(donation.id, {event_id: other_event.id, campaign_id:campaign.id})}
end
end
describe 'most of the values arent changed if not provided' do
it 'online donation' do
payment2
result = verify_nothing_changed
expect(result).to eq (donation.attributes.merge({payment: payment2.attributes}))
end
it 'offsite donation' do
offsite_payment
result = verify_nothing_changed
p2_attributes = payment2.attributes
payment2.reload
expect(p2_attributes).to eq payment2.attributes
o_attributes = offsite_payment.attributes
offsite_payment.reload
expect(o_attributes).to eq offsite_payment.attributes
expect(result).to eq (donation.attributes.merge({payment: payment.attributes, offsite_payment: offsite_payment.attributes}))
end
def verify_nothing_changed
result = UpdateDonation.update_payment(donation.id, {campaign_id: '', event_id: ''})
p_attributes = payment.attributes
payment.reload
expect(p_attributes).to eq payment.attributes
d_attributes = donation.attributes
donation.reload
expect(d_attributes).to eq donation.attributes
result
end
end
describe 'test everything changed' do
let(:new_data) {{designation: new_designation,
dedication: new_dedication,
comment: new_comment,
campaign_id: campaign.id,
event_id: event.id,
gross_amount: new_amount,
fee_total: new_fee,
check_number: new_check_number,
date: new_date_input
}}
it 'online donation' do
payment2
Timecop.freeze(1.day) do
result = UpdateDonation.update_payment(donation.id, new_data)
expected_donation = donation.attributes.merge({designation: new_designation,
dedication: new_dedication,
comment: new_comment,
campaign_id: campaign.id,
event_id: event.id,
updated_at: Time.now}).with_indifferent_access
donation.reload
expect(donation.attributes).to eq expected_donation
expected_p1 = payment.attributes.merge({towards: new_designation, updated_at: Time.now}).with_indifferent_access
payment.reload
expect(payment.attributes).to eq expected_p1
expected_p2 = payment2.attributes.merge({towards: new_designation, updated_at: Time.now}).with_indifferent_access
payment2.reload
expect(payment2.attributes).to eq expected_p2
expected_offsite = offsite_payment.attributes
offsite_payment.reload
expect(offsite_payment.attributes).to eq expected_offsite
expect(result).to eq create_expected_result(donation, payment2)
end
end
it 'offline donation' do
offsite_payment
Timecop.freeze(1.day) do
result = UpdateDonation.update_payment(donation.id, new_data)
expected_donation = donation.attributes.merge({
date: new_date,
amount: new_amount,
designation: new_designation,
dedication: new_dedication,
comment: new_comment,
campaign_id: campaign.id,
event_id: event.id,
updated_at: Time.now,
}).with_indifferent_access
donation.reload
expect(donation.attributes).to eq expected_donation
expected_p1 = payment.attributes.merge({towards: new_designation, updated_at: Time.now, date: new_date, gross_amount: new_amount, fee_total: new_fee, net_amount: new_amount-new_fee}).with_indifferent_access
payment.reload
expect(payment.attributes).to eq expected_p1
expect(Payment.count).to eq 1
expected_offsite_payment= offsite_payment.attributes.merge({check_number:new_check_number, date: new_date.in_time_zone, gross_amount: new_amount, updated_at: Time.now}).with_indifferent_access
offsite_payment.reload
expect(offsite_payment.attributes).to eq expected_offsite_payment
expect(result).to eq create_expected_result(donation, payment, offsite_payment)
end
end
describe 'test blank but existent data will rewrite' do
let(:blank_data) {{designation: '',
dedication: '',
comment: '',
campaign_id: '',
event_id: '',
gross_amount: new_amount,
fee_total: new_fee,
check_number: '',
date: new_date_input
}}
it 'online donation' do
payment2
Timecop.freeze(1.day) do
UpdateDonation.update_payment(donation.id, new_data)
result = UpdateDonation.update_payment(donation.id, blank_data)
expected_donation = donation.attributes.merge({designation: '',
dedication: '',
comment: '',
campaign_id: nil,
event_id: nil,
updated_at: Time.now}).with_indifferent_access
donation.reload
expect(donation.attributes).to eq expected_donation
expected_p1 = payment.attributes.merge({towards: '', updated_at: Time.now}).with_indifferent_access
payment.reload
expect(payment.attributes).to eq expected_p1
expected_p2 = payment2.attributes.merge({towards: '', updated_at: Time.now}).with_indifferent_access
payment2.reload
expect(payment2.attributes).to eq expected_p2
expected_offsite = offsite_payment.attributes
offsite_payment.reload
expect(offsite_payment.attributes).to eq expected_offsite
expect(result).to eq create_expected_result(donation, payment2)
end
end
it 'offline donation' do
offsite_payment
Timecop.freeze(1.day) do
UpdateDonation.update_payment(donation.id, new_data)
result = UpdateDonation.update_payment(donation.id, blank_data)
expected_donation = donation.attributes.merge({
date: new_date.in_time_zone,
amount: new_amount,
designation: '',
dedication: '',
comment: '',
campaign_id: nil,
event_id: nil,
updated_at: Time.now,
}).with_indifferent_access
donation.reload
expect(donation.attributes).to eq expected_donation
expected_p1 = payment.attributes.merge({towards: '', updated_at: Time.now, date: new_date.in_time_zone, gross_amount: new_amount, fee_total: new_fee, net_amount: new_amount-new_fee}).with_indifferent_access
payment.reload
expect(payment.attributes).to eq expected_p1
expect(Payment.count).to eq 1
expected_offsite_payment= offsite_payment.attributes.merge({check_number:'', date: new_date.in_time_zone, gross_amount: new_amount, updated_at: Time.now}).with_indifferent_access
offsite_payment.reload
expect(offsite_payment.attributes).to eq expected_offsite_payment
expect(result).to eq create_expected_result(donation, payment, offsite_payment)
end
end
end
end
end
def event_belongs
expect {yield}.to(raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, [{key: :event_id}])
expect(error.message).to include 'event does not belong to this nonprofit'
})
end
def campaign_belongs
expect {yield}.to(raise_error {|error|
expect(error).to be_a ParamValidation::ValidationError
expect_validation_errors(error.data, [{key: :campaign_id}])
expect(error.message).to include 'campaign does not belong to this nonprofit'
})
end
def create_expected_result(donation, payment, offsite_payment = nil)
ret = donation.attributes
ret[:payment] = payment.attributes
if offsite_payment
ret[:offsite_payment] = offsite_payment.attributes
end
ret
end
end