2021-01-15 23:10:37 +00:00
|
|
|
# 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 CampaignGiftOption, type: :model do
|
|
|
|
include_context :shared_donation_charge_context
|
|
|
|
let(:name) {"CUSTOM GIFT OPTION"}
|
|
|
|
let(:amount_one_time) { 400}
|
|
|
|
let(:amount_recurring) { 100}
|
|
|
|
let(:description) { " Fun description!"}
|
|
|
|
let(:to_ship) { true}
|
|
|
|
let(:order) { 3}
|
|
|
|
|
|
|
|
let(:campaign_gift_option) do
|
|
|
|
campaign.campaign_gift_options.create(description: description,
|
|
|
|
amount_one_time: amount_one_time, amount_recurring: amount_recurring,
|
|
|
|
name: name, to_ship: to_ship, order: order
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
# campaign_gift_option with quantity but no to_ship
|
|
|
|
let(:campaign_gift_option_2) do
|
|
|
|
campaign.campaign_gift_options.create(description: description,
|
|
|
|
amount_one_time: amount_one_time, amount_recurring: amount_recurring,
|
|
|
|
name: name, quantity: 40, hide_contributions: true, order: order
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'validate' do
|
|
|
|
it 'has no errors on first example' do
|
|
|
|
expect(campaign_gift_option.errors).to be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has no errors on second example' do
|
|
|
|
expect(campaign_gift_option_2.errors).to be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'create' do
|
|
|
|
it 'announces create for first example' do
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_create, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_created, {
|
2021-01-21 22:15:24 +00:00
|
|
|
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
|
2021-01-15 23:10:37 +00:00
|
|
|
'object' => 'object_event',
|
|
|
|
'type' => 'campaign_gift_option.created',
|
|
|
|
'data' => {
|
|
|
|
'object' => {
|
|
|
|
'campaign' => {
|
|
|
|
'id' => campaign.id,
|
|
|
|
'name' => campaign.name,
|
|
|
|
'nonprofit' => nonprofit.id,
|
|
|
|
'object' => 'campaign'
|
|
|
|
},
|
|
|
|
'deleted' => false,
|
|
|
|
'description' => description,
|
|
|
|
'gift_option_amount' => [
|
|
|
|
{'amount' => {value_in_cents:amount_one_time, currency: nonprofit.currency}},
|
|
|
|
{
|
|
|
|
'amount' => {value_in_cents:amount_recurring, currency: nonprofit.currency},
|
|
|
|
'recurrence' => { interval: 1, type: 'monthly'}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'id'=> kind_of(Numeric),
|
|
|
|
'hide_contributions' => false,
|
|
|
|
'name' => name,
|
|
|
|
'nonprofit'=> {
|
|
|
|
'id' => nonprofit.id,
|
|
|
|
'name' => nonprofit.name,
|
|
|
|
'object' => 'nonprofit'
|
|
|
|
},
|
|
|
|
'object' => 'campaign_gift_option',
|
|
|
|
'order' => order,
|
|
|
|
'to_ship' => true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
campaign_gift_option
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'announces create for second example' do
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_create, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_created, {
|
2021-01-21 22:15:24 +00:00
|
|
|
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
|
2021-01-15 23:10:37 +00:00
|
|
|
'object' => 'object_event',
|
|
|
|
'type' => 'campaign_gift_option.created',
|
|
|
|
'data' => {
|
|
|
|
'object' => {
|
|
|
|
'campaign' => {
|
|
|
|
'id' => campaign.id,
|
|
|
|
'name' => campaign.name,
|
|
|
|
'nonprofit' => nonprofit.id,
|
|
|
|
'object' => 'campaign'
|
|
|
|
},
|
|
|
|
'deleted' => false,
|
|
|
|
'description' => description,
|
|
|
|
'gift_option_amount' => [
|
|
|
|
{'amount' => {value_in_cents:amount_one_time, currency: nonprofit.currency}},
|
|
|
|
{
|
|
|
|
'amount' => {value_in_cents:amount_recurring, currency: nonprofit.currency},
|
|
|
|
'recurrence' => { interval: 1, type: 'monthly'}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'id'=> kind_of(Numeric),
|
|
|
|
'hide_contributions' => true,
|
|
|
|
'name' => name,
|
|
|
|
'nonprofit'=> {
|
|
|
|
'id' => nonprofit.id,
|
|
|
|
'name' => nonprofit.name,
|
|
|
|
'object' => 'nonprofit'
|
|
|
|
},
|
|
|
|
'object' => 'campaign_gift_option',
|
|
|
|
'order' => order,
|
|
|
|
'quantity' => 40,
|
|
|
|
'to_ship' => false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
campaign_gift_option_2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'update' do
|
|
|
|
let(:cgo_update) do
|
|
|
|
campaign_gift_option.amount_one_time = nil
|
|
|
|
campaign_gift_option.save
|
|
|
|
campaign_gift_option
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:cgo2_update) do
|
|
|
|
campaign_gift_option_2.amount_recurring = nil
|
|
|
|
campaign_gift_option_2.hide_contributions = false
|
|
|
|
campaign_gift_option_2.save
|
|
|
|
campaign_gift_option_2
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is without error on first example' do
|
|
|
|
expect(cgo_update.errors).to be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'announces update for first example' do
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_create, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_created, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_updated, {
|
2021-01-21 22:15:24 +00:00
|
|
|
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
|
2021-01-15 23:10:37 +00:00
|
|
|
'object' => 'object_event',
|
|
|
|
'type' => 'campaign_gift_option.updated',
|
|
|
|
'data' => {
|
|
|
|
'object' => {
|
|
|
|
'campaign' => {
|
|
|
|
'id' => campaign.id,
|
|
|
|
'name' => campaign.name,
|
|
|
|
'nonprofit' => nonprofit.id,
|
|
|
|
'object' => 'campaign'
|
|
|
|
},
|
|
|
|
'deleted' => false,
|
|
|
|
'description' => description,
|
|
|
|
'gift_option_amount' => [
|
|
|
|
{
|
|
|
|
'amount' => {value_in_cents:amount_recurring, currency: nonprofit.currency},
|
|
|
|
'recurrence' => { interval: 1, type: 'monthly'}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'id'=> kind_of(Numeric),
|
|
|
|
'hide_contributions' => false,
|
|
|
|
'name' => name,
|
|
|
|
'nonprofit'=> {
|
|
|
|
'id' => nonprofit.id,
|
|
|
|
'name' => nonprofit.name,
|
|
|
|
'object' => 'nonprofit'
|
|
|
|
},
|
|
|
|
'object' => 'campaign_gift_option',
|
|
|
|
'order' => order,
|
|
|
|
'to_ship' => true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}).ordered
|
|
|
|
|
|
|
|
cgo_update
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is without error on second example' do
|
|
|
|
expect(cgo_update.errors).to be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'announces update for second example' do
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_create, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_created, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_updated, {
|
2021-01-21 22:15:24 +00:00
|
|
|
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
|
2021-01-15 23:10:37 +00:00
|
|
|
'object' => 'object_event',
|
|
|
|
'type' => 'campaign_gift_option.updated',
|
|
|
|
'data' => {
|
|
|
|
'object' => {
|
|
|
|
'campaign' => {
|
|
|
|
'id' => campaign.id,
|
|
|
|
'name' => campaign.name,
|
|
|
|
'nonprofit' => nonprofit.id,
|
|
|
|
'object' => 'campaign'
|
|
|
|
},
|
|
|
|
'deleted' => false,
|
|
|
|
'description' => description,
|
|
|
|
'gift_option_amount' => [
|
|
|
|
{'amount' => {value_in_cents:amount_one_time, currency: nonprofit.currency}},
|
|
|
|
],
|
|
|
|
'id'=> kind_of(Numeric),
|
|
|
|
'hide_contributions' => false,
|
|
|
|
'name' => name,
|
|
|
|
'nonprofit'=> {
|
|
|
|
'id' => nonprofit.id,
|
|
|
|
'name' => nonprofit.name,
|
|
|
|
'object' => 'nonprofit'
|
|
|
|
},
|
|
|
|
'object' => 'campaign_gift_option',
|
|
|
|
'order' => order,
|
|
|
|
'quantity' => 40,
|
|
|
|
'to_ship' => false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}).ordered
|
|
|
|
|
|
|
|
cgo2_update
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
describe 'deleted' do
|
|
|
|
it 'is without error on first example' do
|
|
|
|
campaign_gift_option.destroy
|
|
|
|
expect(campaign_gift_option).to_not be_persisted
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'announces deleted for first example' do
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_create, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_created, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_deleted, {
|
2021-01-21 22:15:24 +00:00
|
|
|
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
|
2021-01-15 23:10:37 +00:00
|
|
|
'object' => 'object_event',
|
|
|
|
'type' => 'campaign_gift_option.deleted',
|
|
|
|
'data' => {
|
|
|
|
'object' => {
|
|
|
|
'campaign' => {
|
|
|
|
'id' => campaign.id,
|
|
|
|
'name' => campaign.name,
|
|
|
|
'nonprofit' => nonprofit.id,
|
|
|
|
'object' => 'campaign'
|
|
|
|
},
|
|
|
|
'deleted' => true,
|
|
|
|
'description' => description,
|
|
|
|
'gift_option_amount' => [
|
|
|
|
{'amount' => {value_in_cents:amount_one_time, currency: nonprofit.currency}},
|
|
|
|
{
|
|
|
|
'amount' => {value_in_cents:amount_recurring, currency: nonprofit.currency},
|
|
|
|
'recurrence' => { interval: 1, type: 'monthly'}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'id'=> kind_of(Numeric),
|
|
|
|
'hide_contributions' => false,
|
|
|
|
'name' => name,
|
|
|
|
'nonprofit'=> {
|
|
|
|
'id' => nonprofit.id,
|
|
|
|
'name' => nonprofit.name,
|
|
|
|
'object' => 'nonprofit'
|
|
|
|
},
|
|
|
|
'object' => 'campaign_gift_option',
|
|
|
|
'order' => order,
|
|
|
|
'to_ship' => true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
campaign_gift_option.destroy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is without error on second example' do
|
|
|
|
campaign_gift_option_2.destroy
|
|
|
|
expect(campaign_gift_option_2).to_not be_persisted
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'announces deleted for second example' do
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_create, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_created, anything).ordered
|
|
|
|
expect(Houdini.event_publisher).to receive(:announce).with(:campaign_gift_option_deleted, {
|
2021-01-21 22:15:24 +00:00
|
|
|
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
|
2021-01-15 23:10:37 +00:00
|
|
|
'object' => 'object_event',
|
|
|
|
'type' => 'campaign_gift_option.deleted',
|
|
|
|
'data' => {
|
|
|
|
'object' => {
|
|
|
|
'campaign' => {
|
|
|
|
'id' => campaign.id,
|
|
|
|
'name' => campaign.name,
|
|
|
|
'nonprofit' => nonprofit.id,
|
|
|
|
'object' => 'campaign'
|
|
|
|
},
|
|
|
|
'deleted' => true,
|
|
|
|
'description' => description,
|
|
|
|
'gift_option_amount' => [
|
|
|
|
{'amount' => {value_in_cents:amount_one_time, currency: nonprofit.currency}},
|
|
|
|
{
|
|
|
|
'amount' => {value_in_cents:amount_recurring, currency: nonprofit.currency},
|
|
|
|
'recurrence' => { interval: 1, type: 'monthly'}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'id'=> kind_of(Numeric),
|
|
|
|
'hide_contributions' => true,
|
|
|
|
'name' => name,
|
|
|
|
'nonprofit'=> {
|
|
|
|
'id' => nonprofit.id,
|
|
|
|
'name' => nonprofit.name,
|
|
|
|
'object' => 'nonprofit'
|
|
|
|
},
|
|
|
|
'object' => 'campaign_gift_option',
|
|
|
|
'order' => order,
|
|
|
|
'quantity' => 40,
|
|
|
|
'to_ship' => false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
campaign_gift_option_2.destroy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|