effective_orders 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/effective_orders/version.rb +1 -1
  4. metadata +10 -258
  5. data/spec/controllers/admin/orders_controller_spec.rb +0 -243
  6. data/spec/controllers/carts_controller_spec.rb +0 -143
  7. data/spec/controllers/ccbill_orders_controller_spec.rb +0 -103
  8. data/spec/controllers/moneris_orders_controller_spec.rb +0 -133
  9. data/spec/controllers/orders_controller_spec.rb +0 -500
  10. data/spec/controllers/stripe_orders_controller_spec.rb +0 -128
  11. data/spec/controllers/webhooks_controller_spec.rb +0 -170
  12. data/spec/dummy/README.rdoc +0 -8
  13. data/spec/dummy/Rakefile +0 -6
  14. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  15. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  16. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  17. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  18. data/spec/dummy/app/models/product.rb +0 -9
  19. data/spec/dummy/app/models/product_with_float_price.rb +0 -9
  20. data/spec/dummy/app/models/user.rb +0 -11
  21. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  22. data/spec/dummy/bin/bundle +0 -3
  23. data/spec/dummy/bin/rails +0 -4
  24. data/spec/dummy/bin/rake +0 -4
  25. data/spec/dummy/config.ru +0 -4
  26. data/spec/dummy/config/application.rb +0 -32
  27. data/spec/dummy/config/boot.rb +0 -5
  28. data/spec/dummy/config/database.yml +0 -25
  29. data/spec/dummy/config/environment.rb +0 -5
  30. data/spec/dummy/config/environments/development.rb +0 -37
  31. data/spec/dummy/config/environments/production.rb +0 -80
  32. data/spec/dummy/config/environments/test.rb +0 -36
  33. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  34. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -3
  35. data/spec/dummy/config/initializers/devise.rb +0 -254
  36. data/spec/dummy/config/initializers/effective_addresses.rb +0 -15
  37. data/spec/dummy/config/initializers/effective_orders.rb +0 -269
  38. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  39. data/spec/dummy/config/initializers/inflections.rb +0 -16
  40. data/spec/dummy/config/initializers/mime_types.rb +0 -4
  41. data/spec/dummy/config/initializers/session_store.rb +0 -3
  42. data/spec/dummy/config/initializers/simple_form.rb +0 -189
  43. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  44. data/spec/dummy/config/locales/en.yml +0 -23
  45. data/spec/dummy/config/routes.rb +0 -3
  46. data/spec/dummy/config/secrets.yml +0 -22
  47. data/spec/dummy/db/schema.rb +0 -158
  48. data/spec/dummy/db/test.sqlite3 +0 -0
  49. data/spec/dummy/log/development.log +0 -164
  50. data/spec/dummy/log/test.log +0 -60
  51. data/spec/dummy/public/404.html +0 -67
  52. data/spec/dummy/public/422.html +0 -67
  53. data/spec/dummy/public/500.html +0 -66
  54. data/spec/dummy/public/favicon.ico +0 -0
  55. data/spec/fixtures/stripe_webhooks/invoice.payment_succeeded.without_renewals.json +0 -76
  56. data/spec/helpers/effective_orders_helper_spec.rb +0 -21
  57. data/spec/models/acts_as_purchasable_spec.rb +0 -75
  58. data/spec/models/customer_spec.rb +0 -72
  59. data/spec/models/factories_spec.rb +0 -35
  60. data/spec/models/order_item_spec.rb +0 -35
  61. data/spec/models/order_spec.rb +0 -445
  62. data/spec/models/stripe_charge_spec.rb +0 -39
  63. data/spec/models/subscription_spec.rb +0 -103
  64. data/spec/spec_helper.rb +0 -46
  65. data/spec/support/factories.rb +0 -139
@@ -1,128 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # We're testing the effective/providers/stripe.rb file, which is included into the OrdersController at runtime
4
-
5
- describe Effective::OrdersController, type: :controller do
6
- routes { EffectiveOrders::Engine.routes }
7
-
8
- before { StripeMock.start }
9
- after { StripeMock.stop }
10
-
11
- let(:stripe_helper) { StripeMock.create_test_helper }
12
- let(:order) { FactoryGirl.create(:order) }
13
- let(:buyer) { Effective::Customer.for_buyer(order.user) }
14
- let(:token) { stripe_helper.generate_card_token }
15
- let(:stripe_charge_params) do
16
- {:effective_providers_stripe_charge => {'effective_order_id' => order.to_param, 'token' => token}}
17
- end
18
-
19
- describe '#stripe_charge' do
20
- before do
21
- sign_in order.user
22
- end
23
-
24
- describe 'invalid parameters' do
25
- it 'raises RecordNotFound when passed an unknown order id' do
26
- expect {
27
- post :stripe_charge, stripe_charge_params.tap { |x| x[:effective_providers_stripe_charge]['effective_order_id'] = 999 }
28
- }.to raise_error(ActiveRecord::RecordNotFound)
29
- end
30
-
31
- it 'renders the :create action on validation failure' do
32
- expect(subject).not_to receive(:process_stripe_charge)
33
-
34
- post :stripe_charge, stripe_charge_params.tap { |x| x[:effective_providers_stripe_charge]['token'] = nil }
35
-
36
- flash[:danger].downcase.include?('token').should eq true
37
- assigns(:stripe_charge).errors[:token].present?.should eq true
38
-
39
- assigns(:order).purchased?.should eq false
40
- response.should render_template(:checkout_step2)
41
- end
42
- end
43
-
44
- describe 'valid parameters' do
45
- it 'redirects to order_purchase_path on success' do
46
- post :stripe_charge, stripe_charge_params
47
- assigns(:order).purchased?.should eq true
48
- response.should redirect_to "/orders/#{assigns(:order).to_param}/purchased"
49
- end
50
-
51
- it 'assigns the @stripe_charge, @order and @buyer properly' do
52
- post :stripe_charge, stripe_charge_params
53
-
54
- assigns(:stripe_charge).valid?.should eq true
55
- assigns(:stripe_charge).order.should eq order
56
- assigns(:order).should eq order
57
- assigns(:buyer).should eq buyer
58
- end
59
-
60
- it 'calls process_stripe_charge when the stripe_charge form object is valid' do
61
- expect(subject).to receive(:process_stripe_charge)
62
- post :stripe_charge, stripe_charge_params
63
- end
64
-
65
- it 'assigns the buyer a new card based on the passed token' do
66
- Effective::Customer.any_instance.should_receive(:update_card!).with(token)
67
- post :stripe_charge, stripe_charge_params
68
- end
69
-
70
- it 'stores the Stripe::Charge info in the order.payment' do
71
- post :stripe_charge, stripe_charge_params
72
- assigns(:order).payment[:charge]['object'].should eq 'charge'
73
- assigns(:order).payment[:charge]['amount'].should eq order.total
74
- assigns(:order).payment[:charge]['customer'].should eq buyer.stripe_customer_id
75
- end
76
- end
77
-
78
- describe 'stripe charge errors' do
79
- it 'rollsback the entire transaction when Stripe::Charge fails' do
80
- StripeMock.prepare_card_error(:card_declined)
81
-
82
- post :stripe_charge, stripe_charge_params
83
-
84
- assigns(:order).purchased?.should eq false
85
- assigns(:stripe_charge).errors[:base].first.downcase.include?('unable to process order with stripe').should eq true
86
- assigns(:stripe_charge).errors[:base].first.downcase.include?('the card was declined').should eq true
87
- response.should render_template(:checkout_step2)
88
- end
89
- end
90
- end
91
-
92
- describe '#stripe_charge with a subscription' do
93
- let(:order) { FactoryGirl.create(:order_with_subscription) }
94
- let(:buyer) { Effective::Customer.for_buyer(order.user) }
95
- let(:subscription) { order.order_items[1].purchasable }
96
- let(:token) { stripe_helper.generate_card_token }
97
- let(:stripe_charge_params) do
98
- {:effective_providers_stripe_charge => {'effective_order_id' => order.to_param, 'token' => token}}
99
- end
100
-
101
- before do
102
- sign_in order.user
103
- end
104
-
105
- it 'redirects to order_purchase_path on success' do
106
- post :stripe_charge, stripe_charge_params
107
- assigns(:order).purchased?.should eq true
108
- response.should redirect_to "/orders/#{assigns(:order).to_param}/purchased"
109
- end
110
-
111
- it 'makes a Stripe::Charge for only the non-Subscription OrderItems' do
112
- post :stripe_charge, stripe_charge_params
113
- assigns(:order).payment[:charge]['object'].should eq 'charge'
114
- assigns(:order).payment[:charge]['amount'].should eq order.order_items.first.total
115
- end
116
-
117
- it 'makes a Stripe::Subscription for the Subscriptions' do
118
- post :stripe_charge, stripe_charge_params
119
-
120
- assigns(:order).payment[:subscriptions]["#{subscription.stripe_plan_id}"]['object'].should eq 'subscription'
121
- assigns(:order).payment[:subscriptions]["#{subscription.stripe_plan_id}"]['plan']['id'].should eq subscription.stripe_plan_id
122
- subscription.reload.stripe_subscription_id.present?.should eq true
123
- subscription.reload.stripe_coupon_id.present?.should eq true
124
-
125
- Effective::Subscription.find(subscription.id).purchased?.should eq true
126
- end
127
- end
128
- end
@@ -1,170 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Effective::WebhooksController, type: :controller do
4
- routes { EffectiveOrders::Engine.routes }
5
-
6
- before { StripeMock.start }
7
- after { StripeMock.stop }
8
-
9
- let(:order) { FactoryGirl.create(:order) }
10
- let(:buyer) { Effective::Customer.for_buyer(order.user) }
11
-
12
- let(:event_hash) { event.to_hash }
13
-
14
- describe '#stripe' do
15
- let(:event) { StripeMock.mock_webhook_event('customer.subscription.created') }
16
-
17
- it 'retrieves the real event from Stripe based on passed ID' do
18
- expect(Stripe::Event).to receive(:retrieve) { event_hash[:id] }
19
- post :stripe, event_hash
20
- response.code.should eq '200'
21
- end
22
-
23
- it 'assigns the @event based on the passed ID' do
24
- post :stripe, event_hash
25
- assigns(:event).id.should eq event_hash[:id]
26
- response.code.should eq '200'
27
- end
28
-
29
- it 'exits immediately when passed a livemode=false event in Production' do
30
- event_hash[:livemode] = false
31
- Rails.env.stub(:production?).and_return(true)
32
-
33
- post :stripe, event_hash
34
- assigns(:event).should eq nil
35
- response.code.should eq '200'
36
- end
37
-
38
- it 'exits immediately when passed a non-object event' do
39
- event_hash[:object] = 'not-object'
40
-
41
- post :stripe, event_hash
42
- assigns(:event).should eq nil
43
- response.code.should eq '200'
44
- end
45
- end
46
-
47
- describe '#stripe.subscription_created' do
48
- let(:event) { StripeMock.mock_webhook_event('customer.subscription.created') }
49
-
50
- before { buyer.update_attributes(stripe_customer_id: event.data.object.customer) }
51
-
52
- it 'assigns the existing customer, if exists' do
53
- post :stripe, event_hash
54
- assigns(:customer).should eq buyer
55
- end
56
-
57
- it 'creates a new purchased Order for the Subscription' do
58
- Effective::Subscription.any_instance.stub(:valid?).and_return(true)
59
- Effective::Subscription.any_instance.stub(:purchased?).and_return(false)
60
-
61
- post :stripe, event_hash
62
-
63
- assigns(:order).purchased?.should eq true
64
- assigns(:order).user.should eq buyer.user
65
- assigns(:order).payment.to_s.include?(event_hash[:id]).should eq true
66
- end
67
-
68
- it 'does not create an Order for an existing purchased Subscription' do
69
- Effective::Subscription.any_instance.stub(:valid?).and_return(true)
70
- Effective::Subscription.any_instance.stub(:purchased?).and_return(true)
71
-
72
- post :stripe, event_hash
73
-
74
- assigns(:order).present?.should eq false
75
- end
76
- end
77
-
78
- describe '#stripe.subscription_deleted' do
79
- let(:event) { StripeMock.mock_webhook_event('customer.subscription.deleted') }
80
- let!(:subscription) { FactoryGirl.create(:subscription, customer_id: buyer.id) }
81
-
82
- context 'when customer exists' do
83
- before do
84
- buyer.update_attributes(stripe_customer_id: event.data.object.customer)
85
- subscription.stripe_plan_id = event.data.object.plan.id
86
- subscription.save(validate: false)
87
- end
88
-
89
- it 'assigns the existing customer' do
90
- post :stripe, event_hash
91
- assigns(:customer).should eq buyer
92
- end
93
-
94
- it 'should destroy customer subscription' do
95
- expect { post :stripe, event_hash }.to change { buyer.subscriptions.count }.from(1).to(0)
96
- end
97
-
98
- it 'should invoke subscription_deleted_callback' do
99
- expect(controller).to receive(:subscription_deleted_callback)
100
- post :stripe, event_hash
101
- end
102
- end
103
-
104
- context 'when customer does not exist' do
105
- it 'should not destroy any of subscriptions' do
106
- expect { post :stripe, event_hash }.not_to change { Effective::Subscription.count }
107
- end
108
-
109
- it 'should not invoke subscription_deleted_callback' do
110
- expect(controller).not_to receive(:subscription_deleted_callback)
111
- post :stripe, event_hash
112
- end
113
- end
114
- end
115
-
116
- describe '#stripe.invoice_payment_succeeded' do
117
- let(:event) { StripeMock.mock_webhook_event('invoice.payment_succeeded') }
118
-
119
- context 'when customer exists' do
120
- before { buyer.update_attributes(stripe_customer_id: event.data.object.customer) }
121
-
122
- context 'when subscription payments present' do
123
- context 'with renewals' do
124
- let(:subscription_mock) { double('subscription', status: 'active', start: 1383672652) }
125
- let(:subscriptions) { double('subscriptions', retrieve: subscription_mock) }
126
-
127
- before { allow(Stripe::Customer).to receive(:retrieve).and_return(double('customer', subscriptions: subscriptions)) }
128
-
129
- it 'assigns the existing customer, if exists' do
130
- post :stripe, event_hash
131
- assigns(:customer).should eq buyer
132
- end
133
-
134
- it 'should invoke subscription_renewed_callback' do
135
- controller.should_receive(:subscription_renewed_callback).with(kind_of(Stripe::Event)).once
136
- post :stripe, event_hash
137
- end
138
- end
139
-
140
- context 'without renewals' do
141
- let(:subscription_mock) { double('subscription', status: 'active', start: 1383759053) } # start and period.start are equal
142
- let(:subscriptions) { double('subscriptions', retrieve: subscription_mock) }
143
-
144
- before { Stripe::Customer.should_receive(:retrieve).and_return(double('customer', subscriptions: subscriptions)) }
145
-
146
- it 'should not invoke subscription_renewed_callback' do
147
- expect(controller).not_to receive(:subscription_renewed_callback)
148
- post :stripe, event_hash
149
- end
150
- end
151
- end
152
-
153
- context 'when no subscription payments' do
154
- let(:event) { StripeMock.mock_webhook_event('invoice.payment_succeeded.without_renewals') }
155
-
156
- it 'should not invoke subscription_renewed_callback' do
157
- expect(controller).not_to receive(:subscription_renewed_callback)
158
- post :stripe, event_hash
159
- end
160
- end
161
- end
162
-
163
- context 'when customer does not exist' do
164
- it 'should not invoke subscription_renewed_callback' do
165
- expect(controller).not_to receive(:subscription_renewed_callback)
166
- post :stripe, event_hash
167
- end
168
- end
169
- end
170
- end
@@ -1,8 +0,0 @@
1
- == README
2
-
3
- To change the test database in this dummy app:
4
-
5
- - Delete the existing test.sqlite3
6
- - No migrations, so just make whatever changes you want to schema.rb
7
-
8
- bundle exec rake app:db:test:prepare
data/spec/dummy/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- # Add your own tasks in files placed in lib/tasks ending in .rake,
2
- # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
-
4
- require File.expand_path('../config/application', __FILE__)
5
-
6
- Rails.application.load_tasks
@@ -1,13 +0,0 @@
1
- // This is a manifest file that'll be compiled into application.js, which will include all the files
2
- // listed below.
3
- //
4
- // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
- // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
- //
7
- // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
- // compiled file.
9
- //
10
- // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
- // about supported directives.
12
- //
13
- //= require_tree .
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any styles
10
- * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
- * file per style scope.
12
- *
13
- *= require_tree .
14
- *= require_self
15
- */
@@ -1,5 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- # Prevent CSRF attacks by raising an exception.
3
- # For APIs, you may want to use :null_session instead.
4
- protect_from_forgery with: :exception
5
- end
@@ -1,2 +0,0 @@
1
- module ApplicationHelper
2
- end
@@ -1,9 +0,0 @@
1
- class Product < ActiveRecord::Base
2
- acts_as_purchasable
3
-
4
- after_purchase do |order, order_item|
5
- end
6
-
7
- after_decline do |order, order_item|
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class ProductWithFloatPrice < ActiveRecord::Base
2
- acts_as_purchasable
3
-
4
- after_purchase do |order, order_item|
5
- end
6
-
7
- after_decline do |order, order_item|
8
- end
9
- end
@@ -1,11 +0,0 @@
1
- class User < ActiveRecord::Base
2
- devise :database_authenticatable, :registerable, :rememberable, :recoverable, :trackable, :validatable, :authentication_keys => [:email]
3
-
4
- acts_as_addressable :billing, :shipping
5
-
6
- attr_accessor :first_name, :last_name
7
-
8
- def to_s
9
- email
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Dummy</title>
5
- <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
6
- <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __FILE__)
3
- load Gem.bin_path('bundler', 'bundle')
data/spec/dummy/bin/rails DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_PATH = File.expand_path('../../config/application', __FILE__)
3
- require_relative '../config/boot'
4
- require 'rails/commands'
data/spec/dummy/bin/rake DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require_relative '../config/boot'
3
- require 'rake'
4
- Rake.application.run
data/spec/dummy/config.ru DELETED
@@ -1,4 +0,0 @@
1
- # This file is used by Rack-based servers to start the application.
2
-
3
- require ::File.expand_path('../config/environment', __FILE__)
4
- run Rails.application
@@ -1,32 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require 'rails/all'
4
-
5
- Bundler.require(*Rails.groups)
6
- require 'devise'
7
- require 'haml'
8
- require 'effective_addresses'
9
- require 'effective_orders'
10
- require 'effective_obfuscation'
11
-
12
- module Dummy
13
- class Application < Rails::Application
14
- # Settings in config/environments/* take precedence over those specified here.
15
- # Application configuration should go into files in config/initializers
16
- # -- all .rb files in that directory are automatically loaded.
17
-
18
- # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
19
- # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
20
- # config.time_zone = 'Central Time (US & Canada)'
21
-
22
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
23
- # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
24
- # config.i18n.default_locale = :de
25
-
26
- config.generators do |g|
27
- g.template_engine :haml
28
- end
29
-
30
- end
31
- end
32
-