302 lines
7.7 KiB
Ruby
302 lines
7.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 Recurrence, type: :model do
|
|
around do |example|
|
|
Timecop.freeze(2020, 5, 4) do
|
|
example.run
|
|
end
|
|
end
|
|
|
|
describe 'recurrence with donations, designation and dedication' do
|
|
subject { create(:recurrence) }
|
|
|
|
def trx_assignment_match # rubocop:disable Metrics/MethodLength
|
|
{
|
|
assignment_object: 'donation',
|
|
amount: 500,
|
|
dedication: {
|
|
contact: {
|
|
email: 'email@ema.com'
|
|
},
|
|
name: 'our loved one',
|
|
note: 'we miss them dearly',
|
|
type: 'memory'
|
|
},
|
|
designation: 'designated for soup kitchen'
|
|
}
|
|
end
|
|
|
|
def trx_assignment_json
|
|
trx_assignment_match.merge({ amount: { cents: 500, currency: 'usd' } })
|
|
end
|
|
|
|
def invoice_template_match
|
|
{
|
|
|
|
amount: 500,
|
|
supporter: an_instance_of(Supporter),
|
|
payment_method: {
|
|
type: 'stripe'
|
|
},
|
|
trx_assignments: [trx_assignment_match]
|
|
}
|
|
end
|
|
|
|
def invoice_template_json
|
|
invoice_template_match.merge(trx_assignments: [trx_assignment_json]).deep_stringify_keys
|
|
end
|
|
|
|
it {
|
|
is_expected.to have_attributes(
|
|
supporter: an_instance_of(Supporter),
|
|
nonprofit: an_instance_of(Nonprofit),
|
|
start_date: Time.current,
|
|
id: match_houid('recur')
|
|
)
|
|
}
|
|
|
|
it {
|
|
is_expected.to have_attributes(recurrences: contain_exactly(
|
|
{
|
|
start: Time.current.beginning_of_day,
|
|
interval: 1,
|
|
type: 'monthly'
|
|
}
|
|
))
|
|
}
|
|
|
|
it { is_expected.to be_persisted }
|
|
|
|
it do
|
|
is_expected.to have_attributes(
|
|
invoice_template: invoice_template_match
|
|
)
|
|
end
|
|
|
|
describe '.to_builder' do
|
|
subject { JSON.parse(recurrence.to_builder.target!) }
|
|
|
|
let(:recurrence) { create(:recurrence) }
|
|
let(:invoice_template) { subject['invoice_template'] }
|
|
|
|
it do # rubocop:disable RSpec/ExampleLength
|
|
is_expected.to match_json(
|
|
{
|
|
object: 'recurrence',
|
|
nonprofit: kind_of(Numeric),
|
|
supporter: kind_of(Numeric),
|
|
id: match_houid('recur'),
|
|
start_date: Time.current.to_i,
|
|
recurrences: [
|
|
{
|
|
start: Time.new(2020, 5, 4).to_i,
|
|
interval: 1,
|
|
type: 'monthly'
|
|
}
|
|
],
|
|
invoice_template: {
|
|
supporter: kind_of(Numeric),
|
|
amount: { 'cents' => 500, 'currency' => 'usd' },
|
|
payment_method: { 'type' => 'stripe' },
|
|
trx_assignments: [trx_assignment_json]
|
|
}
|
|
}
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'recurrence_with_paydate_later_in_month' do
|
|
subject { create(:recurrence_with_paydate_later_in_month) }
|
|
|
|
def trx_assignment_match # rubocop:disable Metrics/MethodLength
|
|
{
|
|
assignment_object: 'donation',
|
|
amount: 500,
|
|
dedication: {
|
|
contact: {
|
|
email: 'email@ema.com'
|
|
},
|
|
name: 'our loved one',
|
|
note: 'we miss them dearly',
|
|
type: 'memory'
|
|
},
|
|
designation: 'designated for soup kitchen'
|
|
}
|
|
end
|
|
|
|
def trx_assignment_json
|
|
trx_assignment_match.merge({ amount: { cents: 500, currency: 'usd' } })
|
|
end
|
|
|
|
def invoice_template_match
|
|
{
|
|
|
|
amount: 500,
|
|
supporter: an_instance_of(Supporter),
|
|
payment_method: {
|
|
type: 'stripe'
|
|
},
|
|
trx_assignments: [trx_assignment_match]
|
|
}
|
|
end
|
|
|
|
def invoice_template_json
|
|
invoice_template_match.merge(trx_assignments: [trx_assignment_json]).deep_stringify_keys
|
|
end
|
|
|
|
it {
|
|
is_expected.to have_attributes(
|
|
supporter: an_instance_of(Supporter),
|
|
nonprofit: an_instance_of(Nonprofit),
|
|
start_date: Time.current,
|
|
id: match_houid('recur')
|
|
)
|
|
}
|
|
|
|
it {
|
|
is_expected.to have_attributes(recurrences: contain_exactly(
|
|
{
|
|
start: Time.new(2020, 5, 5).utc,
|
|
interval: 1,
|
|
type: 'monthly'
|
|
}
|
|
))
|
|
}
|
|
|
|
it { is_expected.to be_persisted }
|
|
|
|
it do
|
|
is_expected.to have_attributes(
|
|
invoice_template: invoice_template_match
|
|
)
|
|
end
|
|
|
|
describe '.to_builder' do
|
|
subject { JSON.parse(recurrence.to_builder.target!) }
|
|
|
|
let(:recurrence) { create(:recurrence_with_paydate_later_in_month) }
|
|
let(:invoice_template) { subject['invoice_template'] }
|
|
|
|
it do
|
|
is_expected.to match_json({
|
|
object: 'recurrence',
|
|
nonprofit: kind_of(Numeric),
|
|
supporter: kind_of(Numeric),
|
|
id: match_houid('recur'),
|
|
start_date: Time.current.to_i,
|
|
recurrences: [
|
|
{
|
|
start: Time.new(2020, 5, 5).to_i,
|
|
interval: 1,
|
|
type: 'monthly'
|
|
}
|
|
],
|
|
invoice_template: { supporter: kind_of(Numeric),
|
|
amount: { 'cents' => 500, 'currency' => 'usd' },
|
|
payment_method: { 'type' => 'stripe' },
|
|
trx_assignments: [trx_assignment_json] }
|
|
})
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'recurrence_with_paydate_earlier_in_month' do
|
|
subject { create(:recurrence_with_paydate_earlier_in_month) }
|
|
|
|
def trx_assignment_match # rubocop:disable Metrics/MethodLength
|
|
{
|
|
assignment_object: 'donation',
|
|
amount: 500,
|
|
dedication: {
|
|
contact: {
|
|
email: 'email@ema.com'
|
|
},
|
|
name: 'our loved one',
|
|
note: 'we miss them dearly',
|
|
type: 'memory'
|
|
},
|
|
designation: 'designated for soup kitchen'
|
|
}
|
|
end
|
|
|
|
def trx_assignment_json
|
|
trx_assignment_match.merge({ amount: { cents: 500, currency: 'usd' } })
|
|
end
|
|
|
|
def invoice_template_match
|
|
{
|
|
|
|
amount: 500,
|
|
supporter: an_instance_of(Supporter),
|
|
payment_method: {
|
|
type: 'stripe'
|
|
},
|
|
trx_assignments: [trx_assignment_match]
|
|
}
|
|
end
|
|
|
|
def invoice_template_json
|
|
invoice_template_match.merge(trx_assignments: [trx_assignment_json]).deep_stringify_keys
|
|
end
|
|
|
|
it {
|
|
is_expected.to have_attributes(
|
|
supporter: an_instance_of(Supporter),
|
|
nonprofit: an_instance_of(Nonprofit),
|
|
start_date: Time.current,
|
|
id: match_houid('recur')
|
|
)
|
|
}
|
|
|
|
it {
|
|
is_expected.to have_attributes(recurrences: contain_exactly(
|
|
{
|
|
start: Time.new(2020, 6, 3).utc,
|
|
interval: 1,
|
|
type: 'monthly'
|
|
}
|
|
))
|
|
}
|
|
|
|
it { is_expected.to be_persisted }
|
|
|
|
it do
|
|
is_expected.to have_attributes(
|
|
invoice_template: invoice_template_match
|
|
)
|
|
end
|
|
|
|
describe '.to_builder' do
|
|
subject { JSON.parse(recurrence.to_builder.target!) }
|
|
|
|
let(:recurrence) { create(:recurrence_with_paydate_earlier_in_month) }
|
|
let(:invoice_template) { subject['invoice_template'] }
|
|
|
|
it do
|
|
is_expected.to match_json({
|
|
object: 'recurrence',
|
|
nonprofit: kind_of(Numeric),
|
|
supporter: kind_of(Numeric),
|
|
id: match_houid('recur'),
|
|
start_date: Time.current.to_i,
|
|
recurrences: [
|
|
{
|
|
start: Time.new(2020, 6, 3).to_i,
|
|
interval: 1,
|
|
type: 'monthly'
|
|
}
|
|
],
|
|
invoice_template: { supporter: kind_of(Numeric),
|
|
amount: { 'cents' => 500, 'currency' => 'usd' },
|
|
payment_method: { 'type' => 'stripe' },
|
|
trx_assignments: [trx_assignment_json] }
|
|
})
|
|
end
|
|
end
|
|
end
|
|
end
|