269 lines
6.7 KiB
Ruby
269 lines
6.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later
|
|
# Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE
|
|
require 'rails_helper'
|
|
|
|
RSpec.describe OfflineTransactionRefund, type: :model do
|
|
let!(:nonprofit) { create(:nm_justice) }
|
|
let!(:supporter) { force_create(:supporter, nonprofit: nonprofit) }
|
|
|
|
let(:offline_transaction_refund) do
|
|
build(
|
|
:offline_transaction_refund,
|
|
payment:
|
|
force_create(
|
|
:payment,
|
|
gross_amount: 500,
|
|
net_amount: 400,
|
|
fee_total: 100,
|
|
date: Time.zone.now,
|
|
nonprofit: nonprofit,
|
|
supporter: supporter
|
|
)
|
|
)
|
|
end
|
|
let(:offline_transaction_charge) do
|
|
build(
|
|
:offline_transaction_charge,
|
|
payment:
|
|
force_create(
|
|
:payment,
|
|
gross_amount: 400,
|
|
net_amount: 300,
|
|
fee_total: 100,
|
|
date: Time.zone.now,
|
|
nonprofit: nonprofit,
|
|
supporter: supporter
|
|
)
|
|
)
|
|
end
|
|
|
|
let(:offline_transaction) { build(:offline_transaction) }
|
|
let(:transaction) do
|
|
trx = supporter.transactions.build(amount: 500)
|
|
trx.build_subtransaction(
|
|
subtransactable: OfflineTransaction.new(amount: 500),
|
|
subtransaction_payments: [
|
|
build(:subtransaction_payment, paymentable: offline_transaction_refund),
|
|
build(:subtransaction_payment, paymentable: offline_transaction_charge)
|
|
]
|
|
)
|
|
trx.save!
|
|
trx
|
|
end
|
|
|
|
let(:event_publisher) { double }
|
|
|
|
let(:expected_event) do
|
|
{
|
|
'data' => {
|
|
'object' => {
|
|
'created' => kind_of(Numeric),
|
|
'fee_total' => { 'cents' => 100, 'currency' => nonprofit.currency },
|
|
'gross_amount' => { 'cents' => 500, 'currency' => nonprofit.currency },
|
|
'id' => match_houid('offtrxrfnd'),
|
|
'net_amount' => { 'cents' => 400, 'currency' => nonprofit.currency },
|
|
'nonprofit' => {
|
|
'id' => nonprofit.id,
|
|
'name' => nonprofit.name,
|
|
'object' => 'nonprofit'
|
|
},
|
|
'object' => 'offline_transaction_refund',
|
|
'subtransaction' => {
|
|
'created' => kind_of(Numeric),
|
|
'id' => match_houid('offlinetrx'),
|
|
'initial_amount' => { 'cents' => 500, 'currency' => nonprofit.currency },
|
|
'net_amount' => { 'cents' => 700, 'currency' => nonprofit.currency },
|
|
'nonprofit' => nonprofit.id,
|
|
'object' => 'offline_transaction',
|
|
'payments' => [
|
|
{
|
|
'id' => match_houid('offtrxrfnd'),
|
|
'object' => 'offline_transaction_refund',
|
|
'type' => 'payment'
|
|
}, {
|
|
'id' => match_houid('offtrxchrg'),
|
|
'object' => 'offline_transaction_charge',
|
|
'type' => 'payment'
|
|
}
|
|
],
|
|
'supporter' => supporter.id,
|
|
'transaction' => match_houid('trx'),
|
|
'type' => 'subtransaction'
|
|
},
|
|
'supporter' => {
|
|
'anonymous' => false,
|
|
'deleted' => false,
|
|
'id' => supporter.id,
|
|
'merged_into' => nil,
|
|
'name' => supporter.name,
|
|
'nonprofit' => kind_of(Numeric),
|
|
'object' => 'supporter',
|
|
'organization' => nil,
|
|
'phone' => nil,
|
|
'supporter_addresses' => [kind_of(Numeric)]
|
|
},
|
|
'transaction' => {
|
|
'amount' => { 'cents' => 500, 'currency' => nonprofit.currency },
|
|
'created' => kind_of(Numeric),
|
|
'id' => match_houid('trx'),
|
|
'nonprofit' => kind_of(Numeric),
|
|
'object' => 'transaction',
|
|
'subtransaction' => {
|
|
'id' => match_houid('offlinetrx'),
|
|
'object' => 'offline_transaction',
|
|
'type' => 'subtransaction'
|
|
},
|
|
'subtransaction_payments' => [
|
|
{
|
|
'id' => match_houid('offtrxrfnd'),
|
|
'object' => 'offline_transaction_refund',
|
|
'type' => 'payment'
|
|
}, {
|
|
'id' => match_houid('offtrxchrg'),
|
|
'object' => 'offline_transaction_charge',
|
|
'type' => 'payment'
|
|
}
|
|
],
|
|
'supporter' => supporter.id,
|
|
'transaction_assignments' => []
|
|
},
|
|
'type' => 'payment'
|
|
}
|
|
},
|
|
'id' => match_houid('objevt'),
|
|
'object' => 'object_event',
|
|
'type' => 'event_type'
|
|
}
|
|
end
|
|
|
|
before do
|
|
allow(Houdini)
|
|
.to receive(:event_publisher)
|
|
.and_return(event_publisher)
|
|
transaction
|
|
end
|
|
|
|
describe 'offline transaction refund' do
|
|
subject { offline_transaction_refund }
|
|
|
|
it do
|
|
is_expected
|
|
.to have_attributes(
|
|
nonprofit: an_instance_of(Nonprofit),
|
|
id: match_houid('offtrxrfnd')
|
|
)
|
|
end
|
|
|
|
it { is_expected.to be_persisted }
|
|
end
|
|
|
|
describe '.to_builder' do
|
|
subject { JSON.parse(offline_transaction_refund.to_builder.target!) }
|
|
|
|
it do
|
|
is_expected
|
|
.to match_json(
|
|
{
|
|
object: 'offline_transaction_refund',
|
|
nonprofit: kind_of(Numeric),
|
|
supporter: kind_of(Numeric),
|
|
id: match_houid('offtrxrfnd'),
|
|
type: 'payment',
|
|
fee_total: { cents: 100, currency: nonprofit.currency },
|
|
net_amount: { cents: 400, currency: nonprofit.currency },
|
|
gross_amount: { cents: 500, currency: nonprofit.currency },
|
|
created: kind_of(Numeric),
|
|
subtransaction: {
|
|
id: match_houid('offlinetrx'),
|
|
object: 'offline_transaction',
|
|
type: 'subtransaction'
|
|
},
|
|
transaction: match_houid('trx')
|
|
}
|
|
)
|
|
end
|
|
end
|
|
|
|
describe '.publish_created' do
|
|
before do
|
|
expected_event['type'] = 'offline_transaction_refund.created'
|
|
|
|
allow(event_publisher)
|
|
.to receive(:announce)
|
|
.with(:payment_created, anything)
|
|
allow(event_publisher)
|
|
.to receive(:announce)
|
|
.with(
|
|
:offline_transaction_refund_created,
|
|
expected_event
|
|
)
|
|
end
|
|
|
|
it 'announces offline_transaction_refund.created event' do
|
|
offline_transaction_refund.publish_created
|
|
|
|
expect(event_publisher)
|
|
.to have_received(:announce)
|
|
.with(
|
|
:offline_transaction_refund_created,
|
|
expected_event
|
|
)
|
|
end
|
|
end
|
|
|
|
describe '.publish_updated' do
|
|
before do
|
|
expected_event['type'] = 'offline_transaction_refund.updated'
|
|
|
|
allow(event_publisher)
|
|
.to receive(:announce)
|
|
.with(:payment_updated, anything)
|
|
allow(event_publisher)
|
|
.to receive(:announce)
|
|
.with(
|
|
:offline_transaction_refund_updated,
|
|
expected_event
|
|
)
|
|
end
|
|
|
|
it 'announces offline_transaction_refund.updated event' do
|
|
offline_transaction_refund.publish_updated
|
|
|
|
expect(event_publisher)
|
|
.to have_received(:announce)
|
|
.with(
|
|
:offline_transaction_refund_updated,
|
|
expected_event
|
|
)
|
|
end
|
|
end
|
|
|
|
describe '.publish_deleted' do
|
|
before do
|
|
expected_event['type'] = 'offline_transaction_refund.deleted'
|
|
|
|
allow(event_publisher)
|
|
.to receive(:announce)
|
|
.with(:payment_deleted, anything)
|
|
allow(event_publisher)
|
|
.to receive(:announce)
|
|
.with(
|
|
:offline_transaction_refund_deleted,
|
|
expected_event
|
|
)
|
|
end
|
|
|
|
it 'announces offline_transaction_refund.deleted event' do
|
|
offline_transaction_refund.publish_deleted
|
|
|
|
expect(event_publisher)
|
|
.to have_received(:announce)
|
|
.with(
|
|
:offline_transaction_refund_deleted,
|
|
expected_event
|
|
)
|
|
end
|
|
end
|
|
end
|