Support for campaign_gift_option events
This commit is contained in:
parent
0a1f07e76b
commit
6097ad68b7
10 changed files with 501 additions and 69 deletions
|
@ -18,15 +18,12 @@ class CampaignGiftOptionsController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
campaign = current_campaign
|
||||
json_saved CreateCampaignGiftOption.create(campaign, campaign_gift_option_params),
|
||||
json_saved CreateCampaignGiftOption.create(current_campaign, campaign_gift_option_params),
|
||||
'Gift option successfully created!'
|
||||
end
|
||||
|
||||
def update
|
||||
@campaign = current_campaign
|
||||
gift_option = @campaign.campaign_gift_options.find params[:id]
|
||||
json_saved UpdateCampaignGiftOption.update(gift_option, campaign_gift_option_params), 'Successfully updated'
|
||||
json_saved UpdateCampaignGiftOption.update(current_campaign_gift_option, campaign_gift_option_params), 'Successfully updated'
|
||||
end
|
||||
|
||||
# put /nonprofits/:nonprofit_id/campaigns/:campaign_id/campaign_gift_options/update_order
|
||||
|
@ -37,9 +34,7 @@ class CampaignGiftOptionsController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
@campaign = current_campaign
|
||||
|
||||
render_json { DeleteCampaignGiftOption.delete(@campaign, params[:id]) }
|
||||
render_json { DeleteCampaignGiftOption.delete(current_campaign_gift_option) }
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -47,4 +42,8 @@ class CampaignGiftOptionsController < ApplicationController
|
|||
def campaign_gift_option_params
|
||||
params.require(:campaign_gift_option).permit(:amount_one_time, :amount_recurring, :amount_dollars, :description, :name, :campaign, :quantity, :to_ship, :order, :hide_contributions)
|
||||
end
|
||||
|
||||
def current_campaign_gift_option
|
||||
campaign.campaign_gift_options.find(params[:id])
|
||||
end
|
||||
end
|
||||
|
|
|
@ -195,4 +195,12 @@ class Campaign < ApplicationRecord
|
|||
where('campaigns.id = ? OR campaigns.parent_campaign_id = ? ',campaign, campaign)
|
||||
end
|
||||
|
||||
def to_builder(*expand)
|
||||
Jbuilder.new do |json|
|
||||
json.(self, :id, :name)
|
||||
json.object "campaign"
|
||||
json.nonprofit nonprofit.id
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
# 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
|
||||
class CampaignGiftOption < ApplicationRecord
|
||||
include ObjectEvent::ModelExtensions
|
||||
object_eventable
|
||||
# :amount_one_time, #int (cents)
|
||||
# :amount_recurring, #int (cents)
|
||||
# :amount_dollars, #str, gets converted to amount
|
||||
|
@ -23,6 +25,10 @@ class CampaignGiftOption < ApplicationRecord
|
|||
validates :amount_one_time, presence: true, numericality: { only_integer: true }, unless: :amount_recurring
|
||||
validates :amount_recurring, presence: true, numericality: { only_integer: true }, unless: :amount_one_time
|
||||
|
||||
after_create_commit :publish_created
|
||||
after_update_commit :publish_updated
|
||||
after_destroy_commit :publish_deleted
|
||||
|
||||
def total_gifts
|
||||
campaign_gifts.count
|
||||
end
|
||||
|
@ -32,4 +38,71 @@ class CampaignGiftOption < ApplicationRecord
|
|||
h[:total_gifts] = total_gifts
|
||||
h
|
||||
end
|
||||
|
||||
def to_builder(*expand)
|
||||
|
||||
gift_option_amount = []
|
||||
if amount_one_time
|
||||
gift_option_amount.push({
|
||||
amount:{
|
||||
value_in_cents: amount_one_time,
|
||||
currency: campaign.nonprofit.currency
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if amount_recurring
|
||||
gift_option_amount.push({
|
||||
amount:{
|
||||
value_in_cents: amount_recurring,
|
||||
currency: campaign.nonprofit.currency
|
||||
},
|
||||
recurrence: {
|
||||
type: 'monthly',
|
||||
interval: 1
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
Jbuilder.new do |json|
|
||||
json.(self, :id, :name, :description,
|
||||
:hide_contributions, :order, :to_ship)
|
||||
|
||||
if quantity
|
||||
json.quantity quantity
|
||||
end
|
||||
json.object 'campaign_gift_option'
|
||||
json.deleted !persisted?
|
||||
|
||||
json.gift_option_amount gift_option_amount do |desc|
|
||||
json.amount desc[:amount]
|
||||
json.recurrence(desc[:recurrence]) if desc[:recurrence]
|
||||
end
|
||||
|
||||
if expand.include? :nonprofit
|
||||
json.nonprofit campaign.nonprofit.to_builder
|
||||
else
|
||||
json.nonprofit campaign.nonprofit.id
|
||||
end
|
||||
|
||||
if expand.include? :campaign
|
||||
json.campaign campaign.to_builder
|
||||
else
|
||||
json.campaign campaign.id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def publish_created
|
||||
Houdini.event_publisher.announce(:campaign_gift_option_created, to_event('campaign_gift_option.created', :nonprofit, :campaign).attributes!)
|
||||
end
|
||||
|
||||
def publish_updated
|
||||
Houdini.event_publisher.announce(:campaign_gift_option_updated, to_event('campaign_gift_option.updated', :nonprofit, :campaign).attributes!)
|
||||
end
|
||||
|
||||
def publish_deleted
|
||||
Houdini.event_publisher.announce(:campaign_gift_option_deleted, to_event('campaign_gift_option.deleted', :nonprofit, :campaign).attributes!)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
// License: LGPL-3.0-or-later
|
||||
import type { IdType, HoudiniObject, HoudiniEvent, Amount, RecurrenceRule } from '../../common';
|
||||
import type Nonprofit from '..';
|
||||
import type Campaign from '.';
|
||||
|
||||
interface OneTimeGiftOptionAmount {
|
||||
amount: Amount;
|
||||
}
|
||||
|
||||
interface RecurringGiftOptionAmount {
|
||||
amount: Amount;
|
||||
recurrence: RecurrenceRule;
|
||||
}
|
||||
|
||||
export interface CampaignGiftOption extends HoudiniObject {
|
||||
campaign: IdType | Campaign;
|
||||
deleted: boolean;
|
||||
description: string;
|
||||
gift_option_amount: Array<RecurringGiftOptionAmount | OneTimeGiftOptionAmount>;
|
||||
hide_contributions: boolean;
|
||||
name: string;
|
||||
nonprofit: IdType | Nonprofit;
|
||||
object: "campaign_gift_option";
|
||||
order: number;
|
||||
quantity?: number;
|
||||
to_ship: boolean;
|
||||
}
|
||||
|
||||
export type CampaignGiftOptionCreated = HoudiniEvent<'campaign_gift_option.created', CampaignGiftOption>;
|
||||
export type CampaignGiftOptionUpdated = HoudiniEvent<'campaign_gift_option.updated', CampaignGiftOption>;
|
||||
export type CampaignGiftOptionDeleted = HoudiniEvent<'campaign_gift_option.deleted', CampaignGiftOption>;
|
11
docs/event_definitions/Nonprofit/Campaign/index.ts
Normal file
11
docs/event_definitions/Nonprofit/Campaign/index.ts
Normal file
|
@ -0,0 +1,11 @@
|
|||
// License: LGPL-3.0-or-later
|
||||
import { IdType, HoudiniObject } from '../../common';
|
||||
import Nonprofit from '../';
|
||||
|
||||
export default interface Campaign extends HoudiniObject {
|
||||
name: string;
|
||||
nonprofit: IdType | Nonprofit;
|
||||
object: "campaign";
|
||||
}
|
||||
|
||||
export * from './CampaignGiftOption';
|
|
@ -18,6 +18,38 @@ export type Amount = { currency: string, value_in_cents: string };
|
|||
*/
|
||||
export type FlexibleAmount = Amount | string | number;
|
||||
|
||||
/**
|
||||
* A rule for something recurring. Used for recurring donations. Based on `ice_cube` gem format
|
||||
*
|
||||
* @example
|
||||
* // Recur once a month, for 3 times
|
||||
* { count: 3, interval: 1, type: 'monthly' }
|
||||
* @example
|
||||
* // Recur every other month, stop on June 1, 2021
|
||||
* { interval: 2, type: 'monthly', until: new Date(2021, 6, 1) }
|
||||
* @example
|
||||
* // Recur every year
|
||||
* { interval: 1, type: 'yearly' }
|
||||
*/
|
||||
export type RecurrenceRule = {
|
||||
/**
|
||||
* The number of times we should run the recurrence
|
||||
*/
|
||||
count?: number;
|
||||
/**
|
||||
* Interval of `type` for the event to recur
|
||||
*/
|
||||
interval: number;
|
||||
/**
|
||||
* The scale of the recurrence
|
||||
*/
|
||||
type: 'monthly' | 'year';
|
||||
/**
|
||||
* The the point after which the rule should not recur anymore.
|
||||
*/
|
||||
until?: Date;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Every object controlled by the Houdini event publisher must meet this standard interface
|
||||
|
|
|
@ -3,30 +3,15 @@
|
|||
# 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
|
||||
module DeleteCampaignGiftOption
|
||||
def self.delete(campaign, campaign_gift_option_id)
|
||||
ParamValidation.new({ campaign: campaign,
|
||||
campaign_gift_option_id: campaign_gift_option_id },
|
||||
campaign: {
|
||||
required: true,
|
||||
is_a: Campaign
|
||||
},
|
||||
campaign_gift_option_id: {
|
||||
required: true,
|
||||
is_integer: true
|
||||
})
|
||||
Qx.transaction do
|
||||
cgo = campaign.campaign_gift_options.where('id = ? ', campaign_gift_option_id).first
|
||||
unless cgo
|
||||
raise ParamValidation::ValidationError.new("#{campaign_gift_option_id} is not a valid gift option for campaign #{campaign.id}", key: :campaign_gift_option_id)
|
||||
def self.delete(campaign_gift_option)
|
||||
CampaignGiftOption.transaction do
|
||||
if campaign_gift_option.campaign_gifts.any?
|
||||
raise ParamValidation::ValidationError.new("#{campaign_gift_option&.id} already has campaign gifts. It can't be deleted for safety reasons.", key: :campaign_gift_option_id)
|
||||
end
|
||||
|
||||
if cgo.campaign_gifts.any?
|
||||
raise ParamValidation::ValidationError.new("#{campaign_gift_option_id} already has campaign gifts. It can't be deleted for safety reasons.", key: :campaign_gift_option_id)
|
||||
end
|
||||
campaign_gift_option.destroy
|
||||
|
||||
cgo.destroy
|
||||
|
||||
return cgo
|
||||
campaign_gift_option
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -127,7 +127,8 @@ describe CreateCampaignGift do
|
|||
|
||||
describe 'successful insert' do
|
||||
let(:profile) { force_create(:profile, user: force_create(:user)) }
|
||||
let(:campaign) { force_create(:campaign, profile: profile) }
|
||||
let(:nonprofit) {create(:nm_justice)}
|
||||
let(:campaign) { force_create(:campaign, profile: profile, nonprofit: nonprofit) }
|
||||
|
||||
describe 'insert with no option quantity limit' do
|
||||
let(:campaign_gift_option) { force_create(:campaign_gift_option, campaign: campaign, amount_recurring: 300, amount_one_time: 5000) }
|
||||
|
|
|
@ -6,51 +6,16 @@ require 'rails_helper'
|
|||
|
||||
describe DeleteCampaignGiftOption do
|
||||
describe '.delete' do
|
||||
let(:nonprofit) { create(:nm_justice)}
|
||||
let(:profile) { force_create(:profile, user: force_create(:user)) }
|
||||
let(:campaign) { force_create(:campaign, profile: profile) }
|
||||
let(:campaign) { force_create(:campaign, profile: profile, nonprofit:nonprofit) }
|
||||
let(:campaign_gift_option) { force_create(:campaign_gift_option, campaign: campaign) }
|
||||
let(:campaign_gift) { force_create(:campaign_gift, campaign_gift_option: campaign_gift_option) }
|
||||
describe 'param validation' do
|
||||
it 'does basic validation' do
|
||||
expect do
|
||||
DeleteCampaignGiftOption.delete(nil,
|
||||
nil)
|
||||
end
|
||||
.to(raise_error do |error|
|
||||
expect(error).to be_a ParamValidation::ValidationError
|
||||
expect_validation_errors(error.data, [
|
||||
{
|
||||
key: :campaign,
|
||||
name: :required
|
||||
},
|
||||
{
|
||||
key: :campaign,
|
||||
name: :is_a
|
||||
},
|
||||
{
|
||||
key: :campaign_gift_option_id,
|
||||
name: :required
|
||||
},
|
||||
{
|
||||
key: :campaign_gift_option_id,
|
||||
name: :is_integer
|
||||
}
|
||||
])
|
||||
end)
|
||||
end
|
||||
|
||||
it 'does cgo verification' do
|
||||
expect { DeleteCampaignGiftOption.delete(campaign, 5555) }.to(raise_error do |error|
|
||||
expect(error).to be_a ParamValidation::ValidationError
|
||||
expect_validation_errors(error.data, [{ key: :campaign_gift_option_id }])
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
it 'cgo deletion is rejected because a gift has already been sold' do
|
||||
campaign_gift_option
|
||||
campaign_gift
|
||||
expect { DeleteCampaignGiftOption.delete(campaign, campaign_gift_option.id) }.to(raise_error do |error|
|
||||
expect { DeleteCampaignGiftOption.delete(campaign_gift_option) }.to(raise_error do |error|
|
||||
expect(error).to be_a ParamValidation::ValidationError
|
||||
expect_validation_errors(error.data, [{ key: :campaign_gift_option_id }])
|
||||
expect(error.message).to eq("#{campaign_gift_option.id} already has campaign gifts. It can't be deleted for safety reasons.")
|
||||
|
@ -62,7 +27,7 @@ describe DeleteCampaignGiftOption do
|
|||
it 'cgo deletion succeeds' do
|
||||
Timecop.freeze(2020, 10, 12) do
|
||||
campaign_gift_option
|
||||
result = DeleteCampaignGiftOption.delete(campaign, campaign_gift_option.id)
|
||||
result = DeleteCampaignGiftOption.delete(campaign_gift_option)
|
||||
expect(result).to be_a CampaignGiftOption
|
||||
expect(result.attributes).to eq campaign_gift_option.attributes
|
||||
expect(CampaignGiftOption.any?).to eq false
|
||||
|
|
327
spec/models/campaign_gift_option_spec.rb
Normal file
327
spec/models/campaign_gift_option_spec.rb
Normal file
|
@ -0,0 +1,327 @@
|
|||
# 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, {
|
||||
'id' => kind_of(String),
|
||||
'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, {
|
||||
'id' => kind_of(String),
|
||||
'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, {
|
||||
'id' => kind_of(String),
|
||||
'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, {
|
||||
'id' => kind_of(String),
|
||||
'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, {
|
||||
'id' => kind_of(String),
|
||||
'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, {
|
||||
'id' => kind_of(String),
|
||||
'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
|
Loading…
Reference in a new issue