2015-04-03 20:34:12 +00:00
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
|
|
describe Sale do
|
|
|
|
|
|
2015-04-12 18:45:26 +00:00
|
|
|
let(:user) {FactoryGirl.create(:user)}
|
|
|
|
|
let(:user2) {FactoryGirl.create(:user)}
|
|
|
|
|
let(:jam_track) {FactoryGirl.create(:jam_track)}
|
|
|
|
|
|
|
|
|
|
describe "index" do
|
|
|
|
|
it "empty" do
|
|
|
|
|
result = Sale.index(user)
|
|
|
|
|
result[:query].length.should eq(0)
|
|
|
|
|
result[:next].should eq(nil)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "one" do
|
|
|
|
|
sale = Sale.create_jam_track_sale(user)
|
|
|
|
|
shopping_cart = ShoppingCart.create(user, jam_track)
|
|
|
|
|
sale_line_item = SaleLineItem.create_from_shopping_cart(sale, shopping_cart, nil, 'some_adjustment_uuid', nil)
|
|
|
|
|
|
|
|
|
|
result = Sale.index(user)
|
|
|
|
|
result[:query].length.should eq(1)
|
|
|
|
|
result[:next].should eq(nil)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "user filtered correctly" do
|
|
|
|
|
sale = Sale.create_jam_track_sale(user)
|
|
|
|
|
shopping_cart = ShoppingCart.create(user, jam_track)
|
|
|
|
|
sale_line_item = SaleLineItem.create_from_shopping_cart(sale, shopping_cart, nil, 'some_adjustment_uuid', nil)
|
|
|
|
|
|
|
|
|
|
result = Sale.index(user)
|
|
|
|
|
result[:query].length.should eq(1)
|
|
|
|
|
result[:next].should eq(nil)
|
|
|
|
|
|
|
|
|
|
sale2 = Sale.create_jam_track_sale(user2)
|
|
|
|
|
shopping_cart = ShoppingCart.create(user2, jam_track)
|
|
|
|
|
sale_line_item2 = SaleLineItem.create_from_shopping_cart(sale2, shopping_cart, nil, 'some_adjustment_uuid', nil)
|
|
|
|
|
|
|
|
|
|
result = Sale.index(user)
|
|
|
|
|
result[:query].length.should eq(1)
|
|
|
|
|
result[:next].should eq(nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
|
|
|
|
|
describe "place_order" do
|
2015-04-03 20:34:12 +00:00
|
|
|
|
|
|
|
|
let(:user) {FactoryGirl.create(:user)}
|
2015-04-10 20:19:08 +00:00
|
|
|
let(:jamtrack) { FactoryGirl.create(:jam_track) }
|
|
|
|
|
let(:jam_track_price_in_cents) { (jamtrack.price * 100).to_i }
|
|
|
|
|
let(:client) { RecurlyClient.new }
|
|
|
|
|
let(:billing_info) {
|
|
|
|
|
info = {}
|
|
|
|
|
info[:first_name] = user.first_name
|
|
|
|
|
info[:last_name] = user.last_name
|
|
|
|
|
info[:address1] = 'Test Address 1'
|
|
|
|
|
info[:address2] = 'Test Address 2'
|
|
|
|
|
info[:city] = user.city
|
|
|
|
|
info[:state] = user.state
|
|
|
|
|
info[:country] = user.country
|
|
|
|
|
info[:zip] = '12345'
|
|
|
|
|
info[:number] = '4111-1111-1111-1111'
|
|
|
|
|
info[:month] = '08'
|
|
|
|
|
info[:year] = '2017'
|
|
|
|
|
info[:verification_value] = '111'
|
|
|
|
|
info
|
|
|
|
|
}
|
2015-04-03 20:34:12 +00:00
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
after(:each) do
|
|
|
|
|
if user.recurly_code
|
|
|
|
|
account = Recurly::Account.find(user.recurly_code)
|
|
|
|
|
if account.present?
|
|
|
|
|
account.destroy
|
|
|
|
|
end
|
|
|
|
|
end
|
2015-04-03 20:34:12 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
it "for a free jam track" do
|
|
|
|
|
shopping_cart = ShoppingCart.create user, jamtrack, 1, true
|
|
|
|
|
client.find_or_create_account(user, billing_info)
|
|
|
|
|
|
|
|
|
|
sales = Sale.place_order(user, [shopping_cart])
|
|
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
user.sales.length.should eq(1)
|
|
|
|
|
|
|
|
|
|
sales.should eq(user.sales)
|
|
|
|
|
sale = sales[0]
|
2015-05-15 17:34:35 +00:00
|
|
|
sale.recurly_invoice_id.should be_nil
|
2015-04-10 20:19:08 +00:00
|
|
|
|
2015-05-15 17:34:35 +00:00
|
|
|
sale.recurly_subtotal_in_cents.should eq(0)
|
2015-04-10 20:19:08 +00:00
|
|
|
sale.recurly_tax_in_cents.should eq(0)
|
|
|
|
|
sale.recurly_total_in_cents.should eq(0)
|
|
|
|
|
sale.recurly_currency.should eq('USD')
|
|
|
|
|
sale.order_total.should eq(0)
|
|
|
|
|
sale.sale_line_items.length.should == 1
|
|
|
|
|
sale_line_item = sale.sale_line_items[0]
|
|
|
|
|
sale_line_item.recurly_tax_in_cents.should eq(0)
|
2015-05-15 17:34:35 +00:00
|
|
|
sale_line_item.recurly_total_in_cents.should eq(0)
|
2015-04-10 20:19:08 +00:00
|
|
|
sale_line_item.recurly_currency.should eq('USD')
|
|
|
|
|
sale_line_item.recurly_discount_in_cents.should eq(0)
|
|
|
|
|
sale_line_item.product_type.should eq(JamTrack::PRODUCT_TYPE)
|
|
|
|
|
sale_line_item.unit_price.should eq(jamtrack.price)
|
|
|
|
|
sale_line_item.quantity.should eq(1)
|
|
|
|
|
sale_line_item.free.should eq(1)
|
|
|
|
|
sale_line_item.sales_tax.should be_nil
|
|
|
|
|
sale_line_item.shipping_handling.should eq(0)
|
|
|
|
|
sale_line_item.recurly_plan_code.should eq(jamtrack.plan_code)
|
|
|
|
|
sale_line_item.product_id.should eq(jamtrack.id)
|
|
|
|
|
sale_line_item.recurly_subscription_uuid.should be_nil
|
2015-05-15 17:34:35 +00:00
|
|
|
sale_line_item.recurly_adjustment_uuid.should be_nil
|
|
|
|
|
sale_line_item.recurly_adjustment_credit_uuid.should be_nil
|
2015-04-10 20:19:08 +00:00
|
|
|
sale_line_item.recurly_adjustment_uuid.should eq(user.jam_track_rights.last.recurly_adjustment_uuid)
|
|
|
|
|
sale_line_item.recurly_adjustment_credit_uuid.should eq(user.jam_track_rights.last.recurly_adjustment_credit_uuid)
|
|
|
|
|
|
|
|
|
|
# verify subscription is in Recurly
|
|
|
|
|
recurly_account = client.get_account(user)
|
|
|
|
|
adjustments = recurly_account.adjustments
|
|
|
|
|
adjustments.should_not be_nil
|
2015-05-15 17:34:35 +00:00
|
|
|
adjustments.should have(0).items
|
2015-04-10 20:19:08 +00:00
|
|
|
|
|
|
|
|
invoices = recurly_account.invoices
|
2015-05-15 17:34:35 +00:00
|
|
|
invoices.should have(0).items
|
|
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
|
|
|
|
|
# verify jam_track_rights data
|
|
|
|
|
user.jam_track_rights.should_not be_nil
|
|
|
|
|
user.jam_track_rights.should have(1).items
|
|
|
|
|
user.jam_track_rights.last.jam_track.id.should eq(jamtrack.id)
|
|
|
|
|
user.jam_track_rights.last.redeemed.should be_true
|
|
|
|
|
user.has_redeemable_jamtrack.should be_false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "for a normally priced jam track" do
|
|
|
|
|
user.has_redeemable_jamtrack = false
|
|
|
|
|
user.save!
|
|
|
|
|
shopping_cart = ShoppingCart.create user, jamtrack, 1, false
|
|
|
|
|
client.find_or_create_account(user, billing_info)
|
|
|
|
|
|
|
|
|
|
sales = Sale.place_order(user, [shopping_cart])
|
|
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
user.sales.length.should eq(1)
|
|
|
|
|
|
|
|
|
|
sales.should eq(user.sales)
|
|
|
|
|
sale = sales[0]
|
|
|
|
|
sale.recurly_invoice_id.should_not be_nil
|
|
|
|
|
|
|
|
|
|
sale.recurly_subtotal_in_cents.should eq(jam_track_price_in_cents)
|
|
|
|
|
sale.recurly_tax_in_cents.should eq(0)
|
|
|
|
|
sale.recurly_total_in_cents.should eq(jam_track_price_in_cents)
|
|
|
|
|
sale.recurly_currency.should eq('USD')
|
|
|
|
|
|
|
|
|
|
sale.order_total.should eq(jamtrack.price)
|
|
|
|
|
sale.sale_line_items.length.should == 1
|
|
|
|
|
sale_line_item = sale.sale_line_items[0]
|
|
|
|
|
# validate we are storing pricing info from recurly
|
|
|
|
|
sale_line_item.recurly_tax_in_cents.should eq(0)
|
|
|
|
|
sale_line_item.recurly_total_in_cents.should eq(jam_track_price_in_cents)
|
|
|
|
|
sale_line_item.recurly_currency.should eq('USD')
|
|
|
|
|
sale_line_item.recurly_discount_in_cents.should eq(0)
|
|
|
|
|
sale_line_item.product_type.should eq(JamTrack::PRODUCT_TYPE)
|
|
|
|
|
sale_line_item.unit_price.should eq(jamtrack.price)
|
|
|
|
|
sale_line_item.quantity.should eq(1)
|
|
|
|
|
sale_line_item.free.should eq(0)
|
|
|
|
|
sale_line_item.sales_tax.should be_nil
|
|
|
|
|
sale_line_item.shipping_handling.should eq(0)
|
|
|
|
|
sale_line_item.recurly_plan_code.should eq(jamtrack.plan_code)
|
|
|
|
|
sale_line_item.product_id.should eq(jamtrack.id)
|
|
|
|
|
sale_line_item.recurly_subscription_uuid.should be_nil
|
|
|
|
|
sale_line_item.recurly_adjustment_uuid.should_not be_nil
|
|
|
|
|
sale_line_item.recurly_adjustment_credit_uuid.should be_nil
|
|
|
|
|
sale_line_item.recurly_adjustment_uuid.should eq(user.jam_track_rights.last.recurly_adjustment_uuid)
|
|
|
|
|
|
|
|
|
|
# verify subscription is in Recurly
|
|
|
|
|
recurly_account = client.get_account(user)
|
|
|
|
|
adjustments = recurly_account.adjustments
|
|
|
|
|
adjustments.should_not be_nil
|
|
|
|
|
adjustments.should have(1).items
|
|
|
|
|
purchase= adjustments[0]
|
|
|
|
|
purchase.unit_amount_in_cents.should eq((jamtrack.price * 100).to_i)
|
|
|
|
|
purchase.accounting_code.should eq(ShoppingCart::PURCHASE_NORMAL)
|
|
|
|
|
purchase.description.should eq("JamTrack: " + jamtrack.name)
|
|
|
|
|
purchase.state.should eq('invoiced')
|
|
|
|
|
purchase.uuid.should eq(sale_line_item.recurly_adjustment_uuid)
|
|
|
|
|
|
|
|
|
|
invoices = recurly_account.invoices
|
|
|
|
|
invoices.should have(1).items
|
|
|
|
|
invoice = invoices[0]
|
|
|
|
|
invoice.uuid.should eq(sale.recurly_invoice_id)
|
|
|
|
|
invoice.line_items.should have(1).items # should have single adjustment associated
|
|
|
|
|
invoice.line_items[0].should eq(purchase)
|
|
|
|
|
invoice.subtotal_in_cents.should eq((jamtrack.price * 100).to_i)
|
|
|
|
|
invoice.total_in_cents.should eq((jamtrack.price * 100).to_i)
|
|
|
|
|
invoice.state.should eq('collected')
|
|
|
|
|
|
|
|
|
|
# verify jam_track_rights data
|
|
|
|
|
user.jam_track_rights.should_not be_nil
|
|
|
|
|
user.jam_track_rights.should have(1).items
|
|
|
|
|
user.jam_track_rights.last.jam_track.id.should eq(jamtrack.id)
|
|
|
|
|
user.jam_track_rights.last.redeemed.should be_false
|
|
|
|
|
user.has_redeemable_jamtrack.should be_false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "for a jamtrack already owned" do
|
|
|
|
|
shopping_cart = ShoppingCart.create user, jamtrack, 1, true
|
|
|
|
|
client.find_or_create_account(user, billing_info)
|
|
|
|
|
|
|
|
|
|
sales = Sale.place_order(user, [shopping_cart])
|
|
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
user.sales.length.should eq(1)
|
|
|
|
|
|
|
|
|
|
shopping_cart = ShoppingCart.create user, jamtrack, 1, false
|
|
|
|
|
sales = Sale.place_order(user, [shopping_cart])
|
|
|
|
|
sales.should have(0).items
|
|
|
|
|
# also, verify that no earlier adjustments were affected
|
|
|
|
|
recurly_account = client.get_account(user)
|
|
|
|
|
adjustments = recurly_account.adjustments
|
2015-05-15 17:34:35 +00:00
|
|
|
adjustments.should have(0).items # because the only successful purchase was a freebie, there should be no recurly adjustments
|
2015-04-10 20:19:08 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# this test counts on the fact that two adjustments are made when buying a free JamTrack
|
|
|
|
|
# so if we make the second adjustment invalid from Recurly's standpoint, then
|
|
|
|
|
# we can see if the first one is ultimately destroyed
|
|
|
|
|
it "rolls back created adjustments if error" do
|
|
|
|
|
|
2015-05-15 17:34:35 +00:00
|
|
|
shopping_cart = ShoppingCart.create user, jamtrack, 1, false
|
2015-04-10 20:19:08 +00:00
|
|
|
|
|
|
|
|
# grab the real response; we will modify it to make a nil accounting code
|
|
|
|
|
adjustment_attrs = shopping_cart.create_adjustment_attributes(user)
|
|
|
|
|
client.find_or_create_account(user, billing_info)
|
|
|
|
|
|
2015-05-15 17:34:35 +00:00
|
|
|
adjustment_attrs[0][:unit_amount_in_cents] = nil # invalid amount
|
2015-04-10 20:19:08 +00:00
|
|
|
ShoppingCart.any_instance.stub(:create_adjustment_attributes).and_return(adjustment_attrs)
|
|
|
|
|
|
|
|
|
|
expect { Sale.place_order(user, [shopping_cart]) }.to raise_error(JamRuby::RecurlyClientError)
|
|
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
user.sales.should have(0).items
|
|
|
|
|
|
|
|
|
|
recurly_account = client.get_account(user)
|
|
|
|
|
recurly_account.adjustments.should have(0).items
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "rolls back adjustments created before the order" do
|
2015-05-15 17:34:35 +00:00
|
|
|
shopping_cart = ShoppingCart.create user, jamtrack, 1, false
|
2015-04-10 20:19:08 +00:00
|
|
|
client.find_or_create_account(user, billing_info)
|
|
|
|
|
|
|
|
|
|
# create a single adjustment on the account
|
|
|
|
|
adjustment_attrs = shopping_cart.create_adjustment_attributes(user)
|
|
|
|
|
recurly_account = client.get_account(user)
|
|
|
|
|
adjustment = recurly_account.adjustments.new (adjustment_attrs[0])
|
|
|
|
|
adjustment.save
|
|
|
|
|
adjustment.errors.any?.should be_false
|
|
|
|
|
|
|
|
|
|
sales = Sale.place_order(user, [shopping_cart])
|
|
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
|
|
|
|
|
recurly_account = client.get_account(user)
|
|
|
|
|
adjustments = recurly_account.adjustments
|
2015-05-15 17:34:35 +00:00
|
|
|
adjustments.should have(1).items # two adjustments are created for a free jamtrack; that should be all there is
|
2015-04-10 20:19:08 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
describe "check_integrity_of_jam_track_sales" do
|
|
|
|
|
|
|
|
|
|
let(:user) { FactoryGirl.create(:user) }
|
|
|
|
|
let(:jam_track) { FactoryGirl.create(:jam_track) }
|
|
|
|
|
|
|
|
|
|
it "empty" do
|
|
|
|
|
check_integrity = Sale.check_integrity_of_jam_track_sales
|
|
|
|
|
check_integrity.length.should eq(1)
|
2015-04-03 20:34:12 +00:00
|
|
|
r = check_integrity[0]
|
2015-04-10 20:19:08 +00:00
|
|
|
r.total.to_i.should eq(0)
|
2015-04-03 20:34:12 +00:00
|
|
|
r.voided.to_i.should eq(0)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "one succeeded sale" do
|
2015-04-10 20:19:08 +00:00
|
|
|
sale = Sale.create_jam_track_sale(user)
|
2015-04-03 20:34:12 +00:00
|
|
|
shopping_cart = ShoppingCart.create(user, jam_track)
|
2015-04-10 20:19:08 +00:00
|
|
|
SaleLineItem.create_from_shopping_cart(sale, shopping_cart, nil, 'some_recurly_invoice_id', nil)
|
2015-04-03 20:34:12 +00:00
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
check_integrity = Sale.check_integrity_of_jam_track_sales
|
2015-04-03 20:34:12 +00:00
|
|
|
r = check_integrity[0]
|
|
|
|
|
r.total.to_i.should eq(1)
|
|
|
|
|
r.voided.to_i.should eq(0)
|
|
|
|
|
end
|
|
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
|
|
|
|
|
it "one voided sale" do
|
|
|
|
|
sale = Sale.create_jam_track_sale(user)
|
|
|
|
|
sale.recurly_invoice_id = 'some_recurly_invoice_id'
|
|
|
|
|
sale.save!
|
2015-04-03 20:34:12 +00:00
|
|
|
shopping_cart = ShoppingCart.create(user, jam_track)
|
2015-04-10 20:19:08 +00:00
|
|
|
SaleLineItem.create_from_shopping_cart(sale, shopping_cart, nil, 'some_recurly_invoice_id', nil)
|
|
|
|
|
FactoryGirl.create(:recurly_transaction_web_hook, transaction_type: RecurlyTransactionWebHook::VOID, invoice_id: 'some_recurly_invoice_id')
|
2015-04-03 20:34:12 +00:00
|
|
|
|
2015-04-10 20:19:08 +00:00
|
|
|
check_integrity = Sale.check_integrity_of_jam_track_sales
|
2015-04-03 20:34:12 +00:00
|
|
|
r = check_integrity[0]
|
|
|
|
|
r.total.to_i.should eq(1)
|
2015-04-10 20:19:08 +00:00
|
|
|
r.voided.to_i.should eq(1)
|
2015-04-03 20:34:12 +00:00
|
|
|
end
|
2015-04-10 20:19:08 +00:00
|
|
|
|
2015-04-03 20:34:12 +00:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|