houdini/spec/models/ticket_level_spec.rb

305 lines
9.3 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 TicketLevel, type: :model do
include_context :shared_donation_charge_context
let(:ticket_level_name) {"TICKET LEVEL"}
let(:order) { 3}
let(:free_amount) { 0}
let(:non_free_amount) {7500}
let(:ticket_limit) {4}
let(:description) {"Description"}
let(:ticket_level_1) { event.ticket_levels.create(
name: ticket_level_name,
limit: ticket_limit,
admin_only: true,
order: order,
amount: free_amount,
description: description
) }
let(:ticket_level_2) {
event.ticket_levels.create(
name: ticket_level_name,
limit: nil,
admin_only: false,
order: order,
amount: non_free_amount,
description: description
)
}
describe 'create' do
describe 'ticket_level_1' do
it 'is without error' do
expect(ticket_level_1.errors).to be_empty
end
it 'announces create' do
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_created, {
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
'object' => 'object_event',
'type' => 'ticket_level.created',
'data' => {
'object' => {
'amount' => {'amount' => 0, 'currency' => 'usd'},
'available_to' => 'admins',
'deleted' => false,
'description' => description,
'event' => {
'id' => event.id,
'name' => event.name,
'object' => 'event',
'nonprofit' => nonprofit.id
},
'id'=> kind_of(Numeric),
'limit' => 4,
'name' => ticket_level_name,
'nonprofit'=> {
'id' => nonprofit.id,
'name' => nonprofit.name,
'object' => 'nonprofit'
},
'event_discounts' => [],
'object' => 'ticket_level',
'order' => order
}
}
})
ticket_level_1
end
end
describe 'ticket_level_2' do
it 'is without error' do
expect(ticket_level_2.errors).to be_empty
end
it 'announces create' do
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_created, {
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
'object' => 'object_event',
'type' => 'ticket_level.created',
'data' => {
'object' => {
'amount' => {'amount' => non_free_amount, 'currency' => 'usd'},
'available_to' => 'everyone',
'deleted' => false,
'description' => description,
'event' => {
'id' => event.id,
'name' => event.name,
'object' => 'event',
'nonprofit' => nonprofit.id
},
'id'=> kind_of(Numeric),
'limit' => nil,
'name' => ticket_level_name,
'nonprofit'=> {
'id' => nonprofit.id,
'name' => nonprofit.name,
'object' => 'nonprofit'
},
'event_discounts' => [],
'object' => 'ticket_level',
'order' => order
}
}
})
ticket_level_2
end
end
end
describe 'update' do
describe 'ticket_level_1' do
it 'is without error' do
ticket_level_1.amount = 5000
ticket_level_1.save
expect(ticket_level_1.errors).to be_empty
end
it 'announces updated' do
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_created, anything).ordered
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_updated, {
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
'object' => 'object_event',
'type' => 'ticket_level.updated',
'data' => {
'object' => {
'amount' => {'amount' => 5000, 'currency' => 'usd'},
'available_to' => 'admins',
'deleted' => false,
'description' => description,
'event' => {
'id' => event.id,
'name' => event.name,
'object' => 'event',
'nonprofit' => nonprofit.id
},
'id'=> kind_of(Numeric),
'limit' => 4,
'name' => ticket_level_name,
'nonprofit'=> {
'id' => nonprofit.id,
'name' => nonprofit.name,
'object' => 'nonprofit'
},
'event_discounts' => [],
'object' => 'ticket_level',
'order' => order
}
}
})
ticket_level_1
ticket_level_1.amount = 5000
ticket_level_1.save
end
end
describe 'ticket_level_2' do
it 'is without error' do
ticket_level_2.amount = 0
ticket_level_2.save
expect(ticket_level_2.errors).to be_empty
end
it 'announces updated' do
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_created, anything).ordered
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_updated, {
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
'object' => 'object_event',
'type' => 'ticket_level.updated',
'data' => {
'object' => {
'amount' => {'amount' => 0, 'currency' => 'usd'},
'available_to' => 'everyone',
'deleted' => false,
'description' => description,
'event' => {
'id' => event.id,
'name' => event.name,
'object' => 'event',
'nonprofit' => nonprofit.id
},
'id'=> kind_of(Numeric),
'limit' => nil,
'name' => ticket_level_name,
'nonprofit'=> {
'id' => nonprofit.id,
'name' => nonprofit.name,
'object' => 'nonprofit'
},
'event_discounts' => [],
'object' => 'ticket_level',
'order' => order
}
}
})
ticket_level_2
ticket_level_2.amount = 0
ticket_level_2.save
end
end
end
describe 'deleted' do
describe 'ticket_level_1' do
it 'is without error' do
ticket_level_1.discard!
expect(ticket_level_1.deleted).to eq true
end
it 'announces deleted' do
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_created, anything).ordered
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_deleted, {
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
'object' => 'object_event',
'type' => 'ticket_level.deleted',
'data' => {
'object' => {
'amount' => {'amount' => 0, 'currency' => 'usd'},
'available_to' => 'admins',
'deleted' => true,
'description' => description,
'event' => {
'id' => event.id,
'name' => event.name,
'object' => 'event',
'nonprofit' => nonprofit.id
},
'id'=> kind_of(Numeric),
'limit' => 4,
'name' => ticket_level_name,
'nonprofit'=> {
'id' => nonprofit.id,
'name' => nonprofit.name,
'object' => 'nonprofit'
},
'event_discounts' => [],
'object' => 'ticket_level',
'order' => order
}
}
}).ordered
ticket_level_1.discard!
end
end
describe 'ticket_level_2' do
it 'is without error' do
expect(ticket_level_2.errors).to be_empty
end
it 'announces deleted' do
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_created, anything).ordered
expect(Houdini.event_publisher).to receive(:announce).with(:ticket_level_deleted, {
'id' => match(/objevt_[a-zA-Z0-9]{22}/),
'object' => 'object_event',
'type' => 'ticket_level.deleted',
'data' => {
'object' => {
'amount' => {'amount' => non_free_amount, 'currency' => 'usd'},
'available_to' => 'everyone',
'deleted' => true,
'description' => description,
'event' => {
'id' => event.id,
'name' => event.name,
'object' => 'event',
'nonprofit' => nonprofit.id
},
'id'=> kind_of(Numeric),
'limit' => nil,
'name' => ticket_level_name,
'nonprofit'=> {
'id' => nonprofit.id,
'name' => nonprofit.name,
'object' => 'nonprofit'
},
'event_discounts' => [],
'object' => 'ticket_level',
'order' => order
}
}
})
ticket_level_2.discard!
end
end
end
end