Created
September 23, 2015 17:43
-
-
Save gabeodess/7bc6534d439afbee54ed to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$bundle exec rake | |
Run options: --seed 62924 | |
# Running: | |
................autoprefixer: /home/rof/src/bitbucket.org/sharecoffee/share/app/assets/stylesheets/application.scss:6859:5: Gradient has outdated direction syntax. New syntax is like "to left" instead of "right". | |
autoprefixer: /home/rof/src/bitbucket.org/sharecoffee/share/app/assets/stylesheets/application.scss:6868:5: Gradient has outdated direction syntax. New syntax is like "to left" instead of "right". | |
........................................autoprefixer: /home/rof/src/bitbucket.org/sharecoffee/share/app/assets/stylesheets/coming_soon.scss:6859:5: Gradient has outdated direction syntax. New syntax is like "to left" instead of "right". | |
autoprefixer: /home/rof/src/bitbucket.org/sharecoffee/share/app/assets/stylesheets/coming_soon.scss:6868:5: Gradient has outdated direction syntax. New syntax is like "to left" instead of "right". | |
.............E.............................E........E..E...E..................... | |
Finished in 69.394763s, 1.9742 runs/s, 9.6405 assertions/s. | |
1) Error: | |
GiftsTest#test_recipient_sets_address: | |
ActionController::RoutingError: No route matches [GET] "/system/subcategories/images/original/000/000/018.jpg" | |
2) Error: | |
SubscriptionTest#test_reup_subscription_schedule: | |
RuntimeError: can't modify frozen object | |
test/models/subscription_test.rb:841:in `block in <class:SubscriptionTest>' | |
3) Error: | |
SubscriptionTest#test_switch_plan_tier: | |
RuntimeError: can't modify frozen object | |
test/models/subscription_test.rb:673:in `block in <class:SubscriptionTest>' | |
4) Error: | |
SubscriptionTest#test_switch_plan_size: | |
RuntimeError: can't modify frozen object | |
test/models/subscription_test.rb:647:in `block in <class:SubscriptionTest>' | |
5) Error: | |
SetReferralTest#test_the_truth: | |
ActionController::RoutingError: No route matches [GET] "/system/subcategories/images/original/000/000/066.jpg" | |
137 runs, 669 assertions, 0 failures, 5 errors, 0 skips |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'test_helper' | |
class SubscriptionTest < ActiveSupport::TestCase | |
test "activity" do | |
@subscription = FactoryGirl.create(:subscription) | |
run_timely_jobs | |
assert_difference "@subscription.reload.activity.length" do | |
@subscription.pause! | |
end | |
assert_difference "@subscription.reload.activity.length" do | |
@subscription.activate! | |
end | |
assert_difference "@subscription.reload.activity.length" do | |
@subscription.update_attributes({:away_count => 1, :away_action => 'pause'}) | |
end | |
assert_difference "@subscription.reload.activity.length" do | |
@subscription.update_attribute(:away_count, 0) | |
end | |
end | |
test "activate from away" do | |
@address = FactoryGirl.create(:address) | |
@subscription = FactoryGirl.create(:subscription, :away_address_id => @address.id, :away_action => 'share', :away_count => 3) | |
assert @subscription.temporarily_sharing? | |
@subscription.pause! | |
assert @subscription.paused? | |
@subscription.activate! | |
assert [email protected]_away? | |
assert @subscription.active? | |
end | |
test "add orders remaining" do | |
@subscription = FactoryGirl.create(:subscription) | |
assert_difference "@subscription.orders_remaining" do | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
assert_no_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_no_difference "Invoice.count" do | |
assert_no_difference "InvoiceItem.count" do | |
@subscription.add_orders_remaining(1) | |
end | |
end | |
end | |
end | |
end | |
assert_difference "@subscription.orders_remaining", -1 do | |
@subscription.add_orders_remaining(-1) | |
end | |
end | |
test "away" do | |
@subscription = FactoryGirl.create(:subscription, :tier => 2) | |
run_timely_jobs | |
@date = Date.today | |
# ====================== | |
# = Temporarily Paused = | |
# ====================== | |
@subscription.update_attributes({ | |
:away_action => "pause", | |
:away_count => 1 | |
}) | |
assert_difference "@subscription.reload.away_count.to_i", -1 do | |
assert_no_difference "@subscription.reload.orders_remaining" do | |
@subscription.create_order!(@date) | |
run_timely_jobs | |
end | |
end | |
assert_equal "0", @subscription.away_count | |
assert_no_difference "@subscription.reload.away_count.to_i" do | |
assert_difference "@subscription.reload.orders_remaining", -1 do | |
@subscription.create_order!(@date) | |
end | |
end | |
# ======================= | |
# = Temporarily Sharing = | |
# ======================= | |
@subscription.update_attributes!({ | |
:away_action => 'share', | |
:away_count => 1, | |
:away_address_id => FactoryGirl.create(:address, :user => @subscription.user).id | |
}) | |
assert_not_equal @subscription.away_address_id, @subscription.address_id | |
assert_difference "@subscription.reload.away_count.to_i", -1 do | |
assert_difference "@subscription.reload.orders_remaining", -1 do | |
@order = @subscription.create_order!(@date + 1.week) | |
end | |
end | |
assert_equal @subscription.away_address_id, @order.address.id | |
assert_difference "@subscription.reload.away_count.to_i", 0 do | |
assert_difference "@subscription.reload.orders_remaining", -1 do | |
@order = @subscription.create_order!(@date + 2.weeks) | |
end | |
end | |
assert_equal @subscription.address_id, @order.address.id.to_i | |
end | |
test "delinquent" do | |
@subscription = FactoryGirl.create(:subscription, :status => 'delinquent') | |
@user = @subscription.user | |
run_timely_jobs | |
@subscription.reload.delinquent! | |
assert_equal 'delinquent', @subscription.reload.status | |
@card = @user.add_card!({:number => 123, :exp_month => '01', :exp_year => 1.year.from_now.year}) | |
assert_change "@subscription.reload.status", "active" do | |
@user.update_attribute(:default_source, @card.id) | |
@subscription.reload | |
end | |
end | |
test "downgrade plan" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1', :size => 'medium') | |
run_timely_jobs | |
@user = @subscription.user | |
diff = Subscription::PRICING['1']['medium'] - Subscription::PRICING['1']['small'] | |
assert_difference "@user.reload.account_balance.to_i", -diff do | |
@subscription.process_switch_plan!({:tier => '1', :size => 'small', :great_coffee_ids => @subscription.great_coffee_ids.slice(0,1)}) | |
run_timely_jobs | |
end | |
end | |
# TODO: assert that first time discount is not applied twice for same credit card | |
test "first time discount limitter" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1', :size => 'small') | |
assert_difference "DiscountFlag.count" do | |
run_timely_jobs | |
end | |
assert_equal 0, @subscription.invoices.first.total.to_i | |
@s2 = FactoryGirl.create(:subscription, :tier => '1', :size => 'small') | |
@s2.user.card.stubs({:fingerprint => 'foobar'}) | |
run_timely_jobs | |
assert_equal 0, @s2.invoices.first.total.to_i | |
Stripe::Card.any_instance.stubs({:fingerprint => @subscription.card.fingerprint}) | |
@s3 = FactoryGirl.create(:subscription, :tier => '1', :size => 'small') | |
run_timely_jobs | |
# => assert starter discount of 20% off | |
assert_equal 1300*0.8, @s3.invoices.first.total.to_i | |
end | |
test "processing status" do | |
@subscription = FactoryGirl.create(:subscription) | |
assert_equal 'processing-invoice', @subscription.reload.status | |
assert_change "@subscription.reload.status", 'active' do | |
run_timely_jobs | |
end | |
assert_change "@subscription.reload.status", 'processing-invoice' do | |
@subscription.create_invoice! | |
end | |
assert_change "@subscription.reload.status", "active" do | |
run_timely_jobs | |
end | |
end | |
test "first order free" do | |
assert_difference "Invoice.count" do | |
assert_difference "Stripe::Invoice::STORE.select{|k,v| v.paid and (v.amount == 0)}.length" do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
assert_difference "Stripe::InvoiceItem::STORE.length", 2 do | |
assert_difference "Stripe::InvoiceItem::STORE.select{|k,v| v.amount == -Subscription.first_time_discount}.length" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1', :size => 'small') | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
assert_no_difference "Stripe::InvoiceItem::STORE.select{|k,v| v.amount == -Subscription.first_time_discount}.length" do | |
FactoryGirl.create(:subscription, :user => @subscription.user, :tier => '1', :size => 'small') | |
run_timely_jobs | |
end | |
options = {:tier => '2', :size => 'medium'} | |
diff = Subscription::PRICING[options.tier][options[:size]] - Subscription.first_time_discount | |
assert_difference "Stripe::Invoice::STORE.length" do | |
assert_difference "Stripe::Invoice::STORE.select{|k,v| v.amount == diff}.length" do | |
assert_difference "Stripe::InvoiceItem::STORE.select{|k,v| v.amount == -Subscription.first_time_discount}.length" do | |
@s3 = FactoryGirl.create(:subscription, options) | |
@s3.user.card.stubs({:fingerprint => 'foobar'}) | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
test "idempotency of process_switch_plan!" do | |
@subscription = FactoryGirl.create(:subscription, {:tier => '1'}) | |
run_timely_jobs | |
Stripe::Invoice.stubs(:create).raises(RuntimeError.new('test error')) | |
assert_difference "Stripe::Invoice::STORE.length" do | |
assert_enqueued_with({:job => ChangePlanInvoice::CreateJob}) do | |
@subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
end | |
assert_no_difference "Invoice.count" do | |
assert_no_difference "InvoiceItem.count" do | |
assert_no_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
run_timely_jobs(:silence_errors => true) | |
end | |
end | |
end | |
end | |
Stripe::Invoice.unstub(:create) | |
assert_no_enqueued_jobs do | |
assert_equal false, @subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
assert [email protected]?, 'errors expected' | |
end | |
assert_change "@subscription.reload.status", 'active' do | |
assert_performed_with({:job => ChangePlanInvoice::PayJob}) do | |
run_jobs | |
end | |
end | |
end | |
end | |
test "idempotency of failed call to save!" do | |
@subscription = FactoryGirl.create(:subscription, {:tier => '1'}) | |
run_timely_jobs; @subscription.reload | |
Subscription.any_instance.stubs(:save!).raises(RuntimeError.new('test error foobar')) | |
assert_no_difference "Stripe::Invoice::STORE.select{|k,v| !v.paid }.length" do | |
assert_difference "Stripe::InvoiceItem::STORE.length", 2 do | |
assert_enqueued_with({:job => ChangePlanInvoice::PayJob}) do | |
assert_enqueued_with({:job => ChangePlanInvoice::CreateJob}) do | |
assert_equal 'active', @subscription.status | |
@subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
assert @subscription.errors.empty?, @subscription.errors.full_messages.to_sentence | |
end | |
assert_difference "Stripe::Invoice::STORE.select{|k,v| !v.paid}.length" do | |
assert_difference "Invoice.count" do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
run_timely_jobs(:silence_errors => true ) | |
end | |
end | |
end | |
end | |
Subscription.any_instance.unstub(:save!) | |
assert_no_enqueued_jobs do | |
@subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
end | |
assert_equal 1, enqueued_jobs.length | |
enqueued_jobs.first.reject!{ |k,v| k.to_s == 'at' } | |
assert_no_difference "Invoice.count" do | |
assert_no_difference "InvoiceItem.count" do | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
assert_no_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_difference "Stripe::Invoice::STORE.select{|k,v| v.paid}.length" do | |
assert_change "@subscription.reload.status", 'active' do | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
test "idempotency of failed call to pay" do | |
@subscription = FactoryGirl.create(:subscription, {:tier => '1'}) | |
run_timely_jobs; @subscription.reload | |
Stripe::Invoice.any_instance.stubs(:pay).raises(RuntimeError.new('test error')) | |
assert_enqueued_with({:job => ChangePlanInvoice::CreateJob}) do | |
@subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
end | |
assert_difference "Stripe::Invoice::STORE.select{|k,v| v.closed }.length" do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
assert_difference "Stripe::InvoiceItem::STORE.length", 2 do | |
assert_difference ("Stripe::Invoice::STORE.length") do | |
assert_difference "Stripe::InvoiceItem::STORE.length", 2 do | |
assert_difference "Invoice.count" do | |
assert_difference "InvoiceItem.count", 2 do | |
assert_enqueued_jobs 0 do | |
run_timely_jobs(:silence_errors => true) | |
run_jobs(:silence_errors => true) | |
end | |
end | |
end | |
end | |
end | |
Stripe::Invoice.any_instance.unstub(:pay) | |
assert_no_enqueued_jobs do | |
assert_equal false, @subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
end | |
assert_difference "Stripe::Invoice::STORE.select{|k,v|v.paid}.length" do | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
run_jobs | |
end | |
end | |
end | |
end | |
end | |
end | |
test "create subscription when there are unpaid invoice items" do | |
@user = FactoryGirl.create(:user) | |
Stripe::InvoiceItem.create(:amount => 100, :customer => @user.stripe_customer.id) | |
assert_difference "Invoice.count" do | |
assert_difference "Subscription.count" do | |
# => 1 item for the charge and 1 for first time discount totaling 2 minus unpaid invoice | |
assert_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_difference "InvoiceItem.count", 2 do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
FactoryGirl.create(:subscription, :user => @user, :size => 'small', :tier => '1') | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
end | |
test "reup subscription when there are unpaid invoice items" do | |
@subscription = FactoryGirl.create(:subscription) | |
run_timely_jobs; @subscription.reload | |
@user = @subscription.user | |
@subscription.update_attribute(:orders_remaining, 0) | |
2.times{Stripe::InvoiceItem.create(:amount => 100, :customer => @user.store.id)} | |
assert_difference "Invoice.count" do | |
# => 1 for price and 1 for starter discount | |
assert_difference "InvoiceItem.count", 2 do | |
# => clear 2 orphaned and create invoice item and starter discount itme totalling zero change. | |
assert_no_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
@subscription.reup! | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
test "change plan when there are unpaid invoice items" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1') | |
run_timely_jobs; @subscription.reload | |
@user = @subscription.user | |
@subscription.update_attribute(:orders_remaining, 0) | |
Stripe::InvoiceItem.create(:amount => 100, :customer => @user.store.id) | |
# => delete orphan and create cost. No refund because orders_remaining == 0 | |
assert_no_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
assert_difference "Invoice.count" do | |
assert_difference "InvoiceItem.count" do | |
@subscription.process_switch_plan!({:tier => '2', :size => 'small'}) | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
test "delay create subscription if customer is flagged as processing-invoice" do | |
@user = FactoryGirl.create(:user) | |
@user.flag_as_processing_invoice! | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
assert_no_difference "InvoiceItem.count" do | |
assert_raises Errors::UserAlreadyProcessingInvoice do | |
FactoryGirl.create(:subscription, :user => @user, :size => 'small', :tier => '1') | |
run_timely_jobs(:raise_errors => true) | |
end | |
end | |
end | |
@user.invoice_processing_done! | |
assert_difference "Invoice.count" do | |
assert_difference "Subscription.count" do | |
FactoryGirl.create(:subscription, :user => @user, :size => 'small', :tier => '1') | |
run_timely_jobs | |
end | |
end | |
end | |
test "delay reup if customer is flagged as processing-invoice" do | |
@subscription = FactoryGirl.create(:subscription, :size => 'small', :tier => '1') | |
run_timely_jobs; @subscription.reload | |
assert @subscription.valid?, @subscription.errors.full_messages.to_sentence | |
@subscription.update_attribute(:orders_remaining, 0) | |
@subscription.user.flag_as_processing_invoice! | |
assert_difference "Invoice.count" do | |
assert_no_difference "InvoiceItem.count" do | |
assert_no_difference "Stripe::InvoiceItem::STORE.length" do | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
assert_raises Errors::UserAlreadyProcessingInvoice do | |
@subscription.reup! | |
run_timely_jobs(:raise_errors => true) | |
end | |
end | |
end | |
end | |
end | |
@subscription.user.invoice_processing_done! | |
assert_no_difference "Invoice.count" do | |
@subscription.reup! | |
run_timely_jobs | |
end | |
end | |
test "delay change subscription if customer is flagged as processing-invoice" do | |
@subscription = FactoryGirl.create(:subscription, :size => 'small', :tier => '1') | |
run_timely_jobs | |
assert @subscription.valid?, @subscription.errors.full_messages.to_sentence | |
assert_difference "Invoice.count" do | |
assert_enqueued_with({:job => ChangePlanInvoice::CreateJob}) do | |
@subscription.process_switch_plan!({:tier => '2', :size => 'small'}) | |
assert @subscription.errors.empty?, @subscription.errors.full_messages.to_sentence | |
end | |
run_timely_jobs | |
assert_equal Subscription::TIERS[@subscription.reload.tier], @subscription.reload.orders_remaining | |
end | |
@subscription.user.flag_as_processing_invoice! | |
assert_no_difference "Invoice.count" do | |
assert_no_enqueued_jobs do | |
@subscription.process_switch_plan!({:tier => '3', :size => 'small'}) | |
end | |
end | |
end | |
test "switch plan with bad card" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '2', :size => 'medium') | |
run_timely_jobs; @subscription.reload | |
Stripe::Invoice.any_instance.stubs(:pay).raises(Stripe::CardError.new('Your card was declined.', 'test2','test3')) | |
assert_enqueued_with(job: ChangePlanInvoice::PayJob) do | |
assert_enqueued_with({:job => ChangePlanInvoice::CreateJob}) do | |
@subscription.process_switch_plan!({:tier => '3', :size => 'large', :great_coffee_ids => (1..3).map{ FactoryGirl.create(:great_coffee).id }}) | |
end | |
assert_no_change "@subscription.reload.attributes.slice('tier', 'size', 'orders_remaining')" do | |
assert_no_change "@subscription.subscribed_coffees.pluck(:great_coffee_id).sort" do | |
# assert_difference "Alerter.deliveries.length", 2 do | |
assert_no_difference "Invoice.find_paid.count" do | |
assert_difference "Invoice.count" do | |
assert_no_difference "Stripe::Invoice::STORE.select{|k,v|v.paid}.length" do | |
assert_difference "Stripe::Invoice::STORE.length" do | |
run_timely_jobs(:silence_errors => true) | |
run_jobs(:silence_errors => true) | |
end | |
end | |
end | |
# end | |
end | |
end | |
end | |
end | |
Stripe::Invoice.any_instance.unstub(:pay) | |
assert_equal 1, enqueued_jobs.length | |
assert_change "@subscription.reload.attributes.slice('tier', 'size', 'orders_remaining')" do | |
assert_change "@subscription.subscribed_coffees.pluck(:great_coffee_id).sort" do | |
assert_difference "Stripe::Invoice::STORE.select{|k,v| v.paid}.length" do | |
assert_difference "Invoice.find_paid.count" do | |
assert_no_difference "Invoice.count" do | |
assert_no_difference "Stripe::Invoice::STORE.length" do | |
assert_enqueued_jobs -1 do | |
run_jobs | |
assert_equal 0, enqueued_jobs.length | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
test "create invoice" do | |
assert_difference "Invoice.count" do | |
assert_difference %Q{Invoice.where("invoices.store -> 'paid' = 'true'").count} do | |
@subscription = FactoryGirl.create(:subscription, :tier => 1, :size => 'small') | |
run_timely_jobs | |
end | |
end | |
end | |
test "create" do | |
@subscription = FactoryGirl.create(:subscription, :tier => 1, :size => 'small') | |
run_timely_jobs; @subscription.reload | |
assert_equal 1, @subscription.orders_remaining | |
assert_equal 1, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 1, :size => 'medium') | |
run_timely_jobs; @subscription.reload | |
assert_equal 1, @subscription.orders_remaining | |
assert_equal 2, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 1, :size => 'large') | |
run_timely_jobs; @subscription.reload | |
assert_equal 1, @subscription.orders_remaining | |
assert_equal 3, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 2, :size => 'small') | |
run_timely_jobs; @subscription.reload | |
assert_equal 4, @subscription.orders_remaining | |
assert_equal 1, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 2, :size => 'medium') | |
run_timely_jobs; @subscription.reload | |
assert_equal 4, @subscription.orders_remaining | |
assert_equal 2, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 2, :size => 'large') | |
run_timely_jobs; @subscription.reload | |
assert_equal 4, @subscription.orders_remaining | |
assert_equal 3, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 3, :size => 'small') | |
run_timely_jobs; @subscription.reload | |
assert_equal 26, @subscription.orders_remaining | |
assert_equal 1, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 3, :size => 'medium') | |
run_timely_jobs; @subscription.reload | |
assert_equal 26, @subscription.orders_remaining | |
assert_equal 2, @subscription.subscribed_coffees.count | |
@subscription = FactoryGirl.create(:subscription, :tier => 3, :size => 'large') | |
run_timely_jobs; @subscription.reload | |
assert_equal 26, @subscription.orders_remaining | |
assert_equal 3, @subscription.subscribed_coffees.count | |
# | |
# @subscription = FactoryGirl.create(:subscription, :tier => 5, :size => 'small') | |
# run_timely_jobs; @subscription.reload | |
# assert_equal 52, @subscription.orders_remaining | |
# assert_equal 1, @subscription.subscribed_coffees.count | |
# | |
# @subscription = FactoryGirl.create(:subscription, :tier => 5, :size => 'medium') | |
# run_timely_jobs; @subscription.reload | |
# assert_equal 52, @subscription.orders_remaining | |
# assert_equal 2, @subscription.subscribed_coffees.count | |
# | |
# @subscription = FactoryGirl.create(:subscription, :tier => 5, :size => 'large') | |
# run_timely_jobs; @subscription.reload | |
# assert_equal 52, @subscription.orders_remaining | |
# assert_equal 3, @subscription.subscribed_coffees.count | |
end | |
test "validations" do | |
@subscription = FactoryGirl.build(:subscription) | |
assert @subscription.valid? | |
@subscription.day = nil | |
assert [email protected]? | |
assert @subscription.errors[:day] | |
@subscription.day = Day.first | |
assert @subscription.valid? | |
@subscription.day.update_attribute(:active, false) | |
assert [email protected]? | |
assert @subscription.errors[:active] | |
@subscription.day.update_attribute(:active, true) | |
assert @subscription.valid? | |
@subscription.great_coffees = [] | |
@subscription.subscribed_coffees = [] | |
assert [email protected]? | |
assert @subscription.errors[:subscribed_coffees] | |
@subscription.great_coffees << GreatCoffee.first | |
assert @subscription.valid? | |
@subscription.address = nil | |
assert [email protected]? | |
assert @subscription.errors[:address] | |
@subscription.address = @subscription.user.addresses.first | |
assert @subscription.valid? | |
end | |
# TODO: test switch plan invalid | |
test "switch plan size" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1', :size => 'small') | |
run_timely_jobs; @subscription.reload | |
@day = @subscription.day | |
travel_to(@day.payment_time_for_next_cutoff - 1.second) do | |
diff = Subscription::PRICING['1']['medium'] - Subscription::PRICING['1']['small'] | |
assert_difference(%Q{Invoice.where("invoices.store -> 'amount' = ?", diff.to_s).count}) do | |
assert_difference "Invoice.find_paid.count" do | |
assert_difference "Invoice.count" do | |
# 1 refund InvoiceItem and 1 charge InvoiceItem | |
assert_difference "@subscription.user.invoice_items.count", 2 do | |
assert_no_difference "@subscription.reload.orders_remaining" do | |
@subscription.process_switch_plan!({:tier => @subscription.tier, :size => 'medium', :great_coffee_ids => GreatCoffee.limit(1).pluck(:id)*2}) | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
test "switch plan tier" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1', :size => 'small') | |
run_timely_jobs | |
@day = @subscription.day | |
travel_to(@day.payment_time_for_next_cutoff - 1.second) do | |
orders_remaining = @subscription.reload.orders_remaining | |
diff = Subscription::PRICING['2']['small'] - (Subscription::PRICING['1']['small']/Subscription::TIERS['1']) * @subscription.orders_remaining | |
assert_difference "@subscription.reload.orders_remaining", Subscription::TIERS['2'] - orders_remaining do | |
assert_difference(%Q{Invoice.where("invoices.store -> 'amount' = ?", diff.to_s).count}) do | |
assert_difference "Invoice.find_paid.count" do | |
assert_difference "Invoice.count" do | |
@subscription.process_switch_plan!({:tier => '2', :size => @subscription.size}) | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
end | |
test "auto switch to weekly" do | |
@subscription = FactoryGirl.create(:subscription, :on_end => 'switch-to-base', :tier => 3, :size => 'medium') | |
run_timely_jobs; @subscription.reload | |
assert_equal '3', @subscription.reload.tier | |
assert_equal 26, @subscription.orders_remaining | |
@subscription.update_attribute(:orders_remaining, 1) | |
assert_no_difference "Invoice.find_paid.count" do | |
assert_no_difference "InvoiceItem.count" do | |
assert_no_difference "Invoice.count" do | |
assert_change "@subscription.tier", "1" do | |
assert_no_change "@subscription.size" do | |
@subscription.decrement_orders_remaining! | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
assert_equal '1', @subscription.reload.tier | |
assert_equal 'medium', @subscription.size | |
assert_equal 'active', @subscription.status | |
assert_equal 0, @subscription.orders_remaining | |
end | |
test "cancel subscription" do | |
@subscription = FactoryGirl.create(:subscription) | |
run_timely_jobs | |
assert_change "@subscription.reload.status", 'paused' do | |
@subscription.pause! | |
end | |
assert_no_difference "Invoice.count" do | |
assert_no_difference "@subscription.reload.orders_remaining" do | |
assert_no_difference "Order.count" do | |
@subscription.create_order! | |
end | |
end | |
end | |
assert_no_difference "Invoice.count" do | |
assert_no_difference "@subscription.reload.orders_remaining" do | |
assert_difference "Alerter::MESSAGES.length" do | |
@subscription.reup! | |
end | |
end | |
end | |
end | |
test "put plan on hold" do | |
@subscription = FactoryGirl.create(:subscription, :tier => '1') | |
run_timely_jobs; @subscription.reload | |
@subscription.update_attribute(:orders_remaining, 0) | |
assert_difference "@subscription.reload.orders_remaining" do | |
@subscription.reup!; run_timely_jobs | |
end | |
@subscription.update_attribute(:orders_remaining, 0) | |
@subscription.pause! | |
assert_no_difference "@subscription.reload.orders_remaining" do | |
assert_no_difference "Invoice.count" do | |
@subscription.reup!; run_timely_jobs | |
end | |
end | |
end | |
# TODO: test pricing on dup plans | |
test "complimentary order" do | |
@subscription = FactoryGirl.create(:subscription, :size => 'medium', :tier => '3') | |
run_timely_jobs | |
@user = @subscription.user | |
assert_equal 26, @user.reload.points | |
Stripe::Invoice.any_instance.stubs(:pay).raises(Stripe::CardError.new('Your card was declined.', 'test2','test3')) | |
@subscription.reload.update_attribute(:orders_remaining, 0) | |
assert @subscription.reload.reup_ready?, "not reup ready" | |
assert @subscription.user.reload.deserves_complimentary_order? | |
assert_difference "@subscription.reload.orders_remaining" do | |
assert_mail_difference({:to => @subscription.email, :subject => Mailer.failed_reup(@subscription, true).subject}) do | |
@subscription.reup! | |
run_timely_jobs | |
end | |
end | |
end | |
test "create subscription adds points" do | |
@user = FactoryGirl.create(:user) | |
@address = FactoryGirl.create(:address, :user => @user) | |
tier = '2' | |
assert_difference "@user.reload.points", 1 do | |
FactoryGirl.create(:subscription, :user => @user, :tier => '1') | |
run_timely_jobs | |
end | |
assert_difference "@user.reload.points", 4 do | |
FactoryGirl.create(:subscription, :user => @user, :tier => '2') | |
run_timely_jobs | |
end | |
assert_difference "@user.reload.points", 26 do | |
@subscription = FactoryGirl.create(:subscription, :user => @user, :tier => '3') | |
run_timely_jobs | |
end | |
# assert_difference "@user.reload.points", 26 do | |
# FactoryGirl.create(:subscription, :user => @user, :tier => '4') | |
# run_timely_jobs | |
# end | |
# | |
# assert_difference "@user.reload.points", 52 do | |
# @subscription = FactoryGirl.create(:subscription, :user => @user, :tier => '5') | |
# run_timely_jobs | |
# end | |
assert_no_difference "@user.reload.points" do | |
assert_difference "@subscription.orders.count" do | |
assert_difference "@subscription.reload.orders_remaining", -1 do | |
@subscription.create_order! | |
end | |
end | |
end | |
end | |
test "reup subscription schedule" do | |
@subscription = FactoryGirl.create(:subscription, {:tier => '2', :size => 'small'}) | |
assert_equal 'switch-to-base', @subscription.reload.on_end | |
run_timely_jobs and @subscription.reload | |
@day = @subscription.day | |
@subscription.update_attribute(:orders_remaining, 1) | |
assert_difference '@subscription.reload.orders_remaining', -1 do | |
assert_difference '@subscription.orders.count' do | |
@subscription.create_order! | |
end | |
end | |
ChargeSubscriptionsJob.set(:wait_until => @day.next_charge_cutoff).perform_later(@day.id) | |
travel_to @day.next_charge_cutoff - 1.second do | |
assert_no_difference "@subscription.orders_remaining" do | |
assert_no_difference "Invoice.count" do | |
run_timely_jobs | |
end | |
end | |
end | |
travel_to @day.next_charge_cutoff + 1.second do | |
assert_equal 'switch-to-base', @subscription.reload.on_end | |
assert_difference "@subscription.reload.orders_remaining", 1 do | |
assert_difference "Invoice.find_paid.count" do | |
assert_difference "Invoice.count" do | |
run_timely_jobs | |
end | |
end | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment