ba_spree_bank_transfer 1.0.0

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 (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +6 -0
  6. data/Gemfile +19 -0
  7. data/LICENSE +26 -0
  8. data/README.md +110 -0
  9. data/Rakefile +15 -0
  10. data/Versionfile +7 -0
  11. data/app/assets/images/payment_details.png +0 -0
  12. data/app/assets/javascripts/spree/backend/spree_bank_transfer.js +0 -0
  13. data/app/assets/javascripts/spree/frontend/spree_bank_transfer.js.erb +37 -0
  14. data/app/assets/stylesheets/spree/backend/spree_bank_transfer.css +0 -0
  15. data/app/assets/stylesheets/spree/frontend/spree_bank_transfer.css +9 -0
  16. data/app/controllers/spree/admin/banks_controller.rb +13 -0
  17. data/app/controllers/spree/content_controller_decorator.rb +8 -0
  18. data/app/controllers/spree/payments_controller.rb +35 -0
  19. data/app/helpers/.DS_Store +0 -0
  20. data/app/helpers/spree/.DS_Store +0 -0
  21. data/app/helpers/spree/admin/banks_helper.rb +19 -0
  22. data/app/models/.DS_Store +0 -0
  23. data/app/models/spree/.DS_Store +0 -0
  24. data/app/models/spree/bank.rb +8 -0
  25. data/app/models/spree/order_decorator.rb +3 -0
  26. data/app/models/spree/payment_decorator.rb +40 -0
  27. data/app/models/spree/payment_method/bank_transfer.rb +48 -0
  28. data/app/overrides/add_bank_details_form_to_order_show.rb +6 -0
  29. data/app/overrides/add_bank_transfer_instructions_link_to_payment.rb +10 -0
  30. data/app/overrides/add_payment_reference_details.rb +32 -0
  31. data/app/overrides/filter_results_by_transaction_reference_no.rb +17 -0
  32. data/app/views/.DS_Store +0 -0
  33. data/app/views/spree/admin/banks/_form.html.erb +26 -0
  34. data/app/views/spree/admin/banks/edit.html.erb +14 -0
  35. data/app/views/spree/admin/banks/index.html.erb +48 -0
  36. data/app/views/spree/admin/banks/new.html.erb +17 -0
  37. data/app/views/spree/admin/banks/toggle_activation.js.erb +10 -0
  38. data/app/views/spree/admin/payments/source_forms/_banktransfer.html.erb +0 -0
  39. data/app/views/spree/admin/payments/source_views/_banktransfer.html.erb +0 -0
  40. data/app/views/spree/checkout/.DS_Store +0 -0
  41. data/app/views/spree/checkout/payment/_banktransfer.html.erb +16 -0
  42. data/app/views/spree/content/bank_transfer.html.erb +38 -0
  43. data/app/views/spree/orders/_bank_transfer_form.html.erb +40 -0
  44. data/ba_spree_bank_transfer.gemspec +39 -0
  45. data/bin/rails +6 -0
  46. data/config/locales/en.yml +25 -0
  47. data/config/locales/it.yml +24 -0
  48. data/config/locales/ja.yml +25 -0
  49. data/config/locales/pl.yml +24 -0
  50. data/config/locales/pt.yml +24 -0
  51. data/config/locales/th.yml +27 -0
  52. data/config/routes.rb +10 -0
  53. data/db/migrate/20130717071443_create_table_bank.rb +11 -0
  54. data/db/migrate/20130717125312_add_index_on_active_on_spree_bank.rb +5 -0
  55. data/db/migrate/20140519125402_add_bank_name_account_number_and_transaction_reference_number_to_payments.rb +7 -0
  56. data/db/migrate/20140530055151_add_column_deposited_on_to_spree_payments.rb +5 -0
  57. data/db/migrate/20140612131656_add_col_additional_details_to_banks.rb +5 -0
  58. data/lib/ba_spree_bank_transfer.rb +6 -0
  59. data/lib/generators/spree_bank_transfer/.DS_Store +0 -0
  60. data/lib/generators/spree_bank_transfer/install/install_generator.rb +30 -0
  61. data/lib/payment_details.rb +21 -0
  62. data/lib/spree_bank_transfer/engine.rb +40 -0
  63. data/lib/spree_bank_transfer/version.rb +3 -0
  64. data/spec/controllers/spree/admin/banks_controller_spec.rb +82 -0
  65. data/spec/controllers/spree/content_controller_spec.rb +16 -0
  66. data/spec/controllers/spree/payments_controller_spec.rb +98 -0
  67. data/spec/lib/payment_details_spec.rb +84 -0
  68. data/spec/models/spree/bank_spec.rb +19 -0
  69. data/spec/models/spree/payment_method/bank_transfer_spec.rb +114 -0
  70. data/spec/models/spree/payment_spec.rb +81 -0
  71. data/spec/models/spree/user_spec.rb +5 -0
  72. data/spec/spec_helper.rb +98 -0
  73. metadata +321 -0
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PaymentsController, type: :controller do
4
+ before do
5
+ allow(controller).to receive(:authenticate_spree_user!).and_return(true)
6
+ @user = mock_model(Spree::User, :generate_spree_api_key! => false, last_incomplete_spree_order: nil)
7
+ allow(controller).to receive(:spree_current_user).and_return(@user)
8
+
9
+ @payment = mock_model(Spree::Payment)
10
+ @current_user_payments = double("current_user_payments", find_by: @payment)
11
+ allow(@user).to receive(:payments).and_return(@current_user_payments)
12
+ request.env["HTTP_REFERER"] = "http://localhost"
13
+ end
14
+
15
+ shared_examples_for "request which finds payment" do
16
+
17
+ it "finds payment" do
18
+ expect(@current_user_payments).to receive(:find_by).with(number: 'payment_id')
19
+ send_request
20
+ end
21
+
22
+ it "assigns @payment" do
23
+ send_request
24
+ expect(assigns(:payment)).to eq(@payment)
25
+ end
26
+
27
+ context 'when payment not found' do
28
+ before do
29
+ allow(@current_user_payments).to receive(:find_by).and_return(nil)
30
+ end
31
+
32
+ it "sets flash message" do
33
+ send_request
34
+ expect(flash[:error]).to eq("Payment not found")
35
+ end
36
+
37
+ it "redirects to back" do
38
+ send_request
39
+ expect(response).to redirect_to(:back)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "PATCH update" do
45
+ before do
46
+ @payment_details = double('payment_details', save: true)
47
+ allow(PaymentDetails).to receive(:new).and_return(@payment_details)
48
+ end
49
+
50
+ def send_request
51
+ patch :update, id: 'payment_id', payment: { bank_name: 'bank_name', account_no: "account_no", transaction_reference_no: "transaction_reference_no" }
52
+ end
53
+
54
+ it_behaves_like "request which finds payment"
55
+
56
+
57
+ it "creates new payment details" do
58
+ expect(PaymentDetails).to receive(:new).with(@payment, { 'bank_name' => 'bank_name', 'account_no' => "account_no", 'transaction_reference_no' => "transaction_reference_no" })
59
+ send_request
60
+ end
61
+
62
+ it "saves payment_details" do
63
+ expect(@payment_details).to receive(:save)
64
+ send_request
65
+ end
66
+
67
+ context 'when payment details saved successfully' do
68
+ it 'sets flash message' do
69
+ send_request
70
+ expect(flash[:notice]).to eq("Payment successfully updated")
71
+ end
72
+ end
73
+
74
+ context 'when payment details not saved' do
75
+ before do
76
+ allow(@payment_details).to receive(:save).and_return(false)
77
+ allow(@payment_details).to receive(:errors).and_return(["some error occurred"])
78
+ end
79
+
80
+ it 'sets flash error' do
81
+ send_request
82
+ expect(flash[:error]).to eq("some error occurred")
83
+ end
84
+ end
85
+
86
+ it "redirects to back" do
87
+ send_request
88
+ expect(response).to redirect_to(:back)
89
+ end
90
+ end
91
+
92
+ describe "#payment_params" do
93
+ it "permits only bank_name, account_no, transaction_reference_no, deposited_on" do
94
+ controller.params = { payment: { bank_name: 'Bank Name', account_no: 'Account number', transaction_reference_no: "transaction reference number", order_id: 'order_id', deposited_on: 'deposited_on' } }
95
+ expect(controller.send(:payment_params)).to eq({ "bank_name" => "Bank Name", "account_no" => "Account number", "transaction_reference_no" => "transaction reference number", 'deposited_on' => 'deposited_on' })
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe PaymentDetails do
4
+ before do
5
+ @payment = mock_model(Spree::Payment, update_attributes: true, :validate_bank_details= => nil)
6
+ @params = { 'bank_name' => 'bank_name', 'account_no' => "account_no", 'transaction_reference_no' => "transaction_reference_no" }
7
+ @payment_details = PaymentDetails.new(@payment, @params)
8
+ end
9
+
10
+ describe "#initialize" do
11
+ it "sets payment" do
12
+ expect(@payment_details.payment).to eq(@payment)
13
+ end
14
+
15
+ it "sets params" do
16
+ expect(@payment_details.params).to eq(@params)
17
+ end
18
+
19
+ it "initializes errors" do
20
+ expect(@payment_details.errors).to eq([])
21
+ end
22
+ end
23
+
24
+ describe "#save" do
25
+ context 'when payment details submitted' do
26
+ before do
27
+ allow(@payment).to receive(:details_submitted?).and_return(true)
28
+ end
29
+
30
+ it "sets errors" do
31
+ @payment_details.save
32
+ expect(@payment_details.errors).to eq(["Payment Details can be submitted only once."])
33
+ end
34
+
35
+ it "does not update payment" do
36
+ expect(@payment).not_to receive(:update_attributes)
37
+ @payment_details.save
38
+ end
39
+
40
+ it "returns false" do
41
+ expect(@payment_details.save).to be false
42
+ end
43
+
44
+ end
45
+
46
+ context 'when payment details not submitted' do
47
+ before do
48
+ allow(@payment).to receive(:details_submitted?).and_return(false)
49
+ end
50
+
51
+ it 'sets validates_bank_details to true' do
52
+ expect(@payment).to receive(:validate_bank_details=).with(true)
53
+ @payment_details.save
54
+ end
55
+
56
+ it "updates payment attributes" do
57
+ expect(@payment).to receive(:update_attributes)
58
+ @payment_details.save
59
+ end
60
+
61
+ context 'when payment attributes not updated successfully' do
62
+ before do
63
+ allow(@payment).to receive(:update_attributes).and_return(false)
64
+ allow(@payment).to receive_message_chain(:errors, :full_messages).and_return(["some error occurred"])
65
+ end
66
+
67
+ it 'sets errors' do
68
+ @payment_details.save
69
+ expect(@payment_details.errors).to eq(["some error occurred"])
70
+ end
71
+
72
+ it 'returns false' do
73
+ expect(@payment_details.save).to be false
74
+ end
75
+ end
76
+
77
+ context 'when payment attributes updated successfully' do
78
+ it 'returns true' do
79
+ expect(@payment_details.save).to be true
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Bank, type: :model do
4
+ it { is_expected.to validate_presence_of :name }
5
+ it { is_expected.to validate_presence_of :account_no }
6
+ it { is_expected.to validate_uniqueness_of(:account_no).scoped_to(:name) }
7
+
8
+ describe ".active" do
9
+ before(:each) do
10
+ @active_bank1 = Spree::Bank.create! name: 'bank1', :account_no => '98765'
11
+ @active_bank2 = Spree::Bank.create! name: 'bank2', :account_no => '98765'
12
+ @bank3 = Spree::Bank.create! name: 'bank3', :account_no => '98765', active: false
13
+ end
14
+
15
+ it "returns active banks" do
16
+ expect(Spree::Bank.active).to match([@active_bank1, @active_bank2])
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PaymentMethod::BankTransfer do
4
+ before(:each) do
5
+ @order = Spree::Order.new
6
+ @payment_method = Spree::PaymentMethod::BankTransfer.create! name: "Bank Transfer", active: true
7
+ @payment = Spree::Payment.new amount: 0.0
8
+ @payment.order = @order
9
+ @payment.payment_method = @payment_method
10
+ @payment.save!
11
+ end
12
+
13
+ describe "#actions" do
14
+ it "returns actions" do
15
+ expect(@payment_method.actions).to eq(["capture", "void"])
16
+ end
17
+ end
18
+
19
+ describe "#can_capture?" do
20
+ context "when payment state is pending or checkout" do
21
+ before(:each) do
22
+ @payment.state = 'checkout'
23
+ @payment.save!
24
+ end
25
+
26
+ it "returns true" do
27
+ expect(@payment_method.can_capture?(@payment)).to be true
28
+ end
29
+ end
30
+
31
+ context "when payment state is pending" do
32
+ before(:each) do
33
+ @payment.state = 'pending'
34
+ @payment.save!
35
+ end
36
+
37
+ it "returns true" do
38
+ expect(@payment_method.can_capture?(@payment)).to be true
39
+ end
40
+
41
+ end
42
+
43
+ context "when payment state is not pending or checkout" do
44
+ before(:each) do
45
+ @payment.state = 'void'
46
+ @payment.save!
47
+ end
48
+
49
+ it "returns false" do
50
+ expect(@payment_method.can_capture?(@payment)).to be false
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "#can_void?" do
56
+ context "when payment state is not void" do
57
+ before(:each) do
58
+ @payment.state = 'pending'
59
+ @payment.save!
60
+ end
61
+
62
+ it "returns true" do
63
+ expect(@payment_method.can_void?(@payment)).to be true
64
+ end
65
+ end
66
+
67
+ context "when payment state is void" do
68
+ before(:each) do
69
+ @payment.update_column(:state, 'void')
70
+ end
71
+
72
+ it "returns false" do
73
+ expect(@payment_method.can_void?(@payment)).to be false
74
+ end
75
+ end
76
+ end
77
+
78
+ describe "#capture" do
79
+ it "creates a new active merchant billing response" do
80
+ expect(ActiveMerchant::Billing::Response).to receive(:new).with(true, "", {}, {})
81
+ @payment_method.capture
82
+ end
83
+ it "returns active merchant billing response" do
84
+ expect(@payment_method.capture).to be_a(ActiveMerchant::Billing::Response)
85
+ end
86
+ end
87
+
88
+ describe "#void" do
89
+ it "creates a new active merchant billing response" do
90
+ expect(ActiveMerchant::Billing::Response).to receive(:new).with(true, "", {}, {})
91
+ @payment_method.void
92
+ end
93
+ it "returns active merchant billing response" do
94
+ expect(@payment_method.void).to be_a(ActiveMerchant::Billing::Response)
95
+ end
96
+ end
97
+
98
+ describe "#source_required?" do
99
+ it "returns false" do
100
+ expect(@payment_method.source_required?).to be false
101
+ end
102
+ end
103
+
104
+ describe "#credit" do
105
+ it "creates a new active merchant billing response" do
106
+ expect(ActiveMerchant::Billing::Response).to receive(:new).with(true, "", {}, {})
107
+ @payment_method.credit
108
+ end
109
+ it "returns active merchant billing response" do
110
+ expect(@payment_method.credit).to be_a(ActiveMerchant::Billing::Response)
111
+ end
112
+ end
113
+
114
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Payment, type: :model do
4
+ context 'when validate_bank_details' do
5
+ before do
6
+ subject.validate_bank_details = true
7
+ end
8
+
9
+ it { is_expected.to validate_presence_of(:bank_name) }
10
+ it { is_expected.to validate_presence_of(:account_no) }
11
+ it { is_expected.to validate_presence_of(:transaction_reference_no) }
12
+ it { is_expected.to validate_presence_of(:deposited_on) }
13
+ end
14
+
15
+ context 'when validate_bank_details not true' do
16
+ it { is_expected.not_to validate_presence_of(:bank_name) }
17
+ it { is_expected.not_to validate_presence_of(:account_no) }
18
+ it { is_expected.not_to validate_presence_of(:transaction_reference_no) }
19
+ end
20
+
21
+ describe ".from_bank_transfer" do
22
+ before do
23
+ check_payment_method = Spree::PaymentMethod::Check.new
24
+ check_payment_method.name = "Check Payment Method"
25
+ check_payment_method.save!
26
+
27
+ bank_transfer_payment_method = Spree::PaymentMethod::BankTransfer.new
28
+ bank_transfer_payment_method.name = "Bank Transfer"
29
+ bank_transfer_payment_method.save!
30
+
31
+ @order = Spree::Order.new
32
+ @order.save!
33
+
34
+ @payment1 = Spree::Payment.new
35
+ @payment1.order_id = @order.id
36
+ @payment1.payment_method_id = check_payment_method.id
37
+ @payment1.save!
38
+
39
+ @payment2 = Spree::Payment.new
40
+ @payment2.order_id = @order.id
41
+ @payment2.payment_method_id = check_payment_method.id
42
+ @payment2.save!
43
+
44
+ @bank_transfer_payment1 = Spree::Payment.new
45
+ @bank_transfer_payment1.order_id = @order.id
46
+ @bank_transfer_payment1.payment_method_id = bank_transfer_payment_method.id
47
+ @bank_transfer_payment1.save!
48
+
49
+ @bank_transfer_payment2 = Spree::Payment.new
50
+ @bank_transfer_payment2.order_id = @order.id
51
+ @bank_transfer_payment2.payment_method_id = bank_transfer_payment_method.id
52
+ @bank_transfer_payment2.save!
53
+ end
54
+
55
+ it "returns payments with payment method as bank_transfer" do
56
+ expect(Spree::Payment.from_bank_transfer).to match_array([@bank_transfer_payment1, @bank_transfer_payment2])
57
+ end
58
+ end
59
+
60
+ describe "#details_submitted?" do
61
+ before do
62
+ @payment = Spree::Payment.new
63
+ end
64
+
65
+ context 'when transaction_reference_no present' do
66
+ before do
67
+ @payment.transaction_reference_no = 'transaction_reference_no'
68
+ end
69
+
70
+ it 'is true' do
71
+ expect(@payment.details_submitted?).to be true
72
+ end
73
+ end
74
+
75
+ context 'when transaction_reference_no not present' do
76
+ it 'is false' do
77
+ expect(@payment.details_submitted?).to be false
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::User, type: :model do
4
+ it { is_expected.to have_many(:payments).through(:orders) }
5
+ end
@@ -0,0 +1,98 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_group 'Controllers', 'app/controllers'
5
+ add_group 'Helpers', 'app/helpers'
6
+ add_group 'Mailers', 'app/mailers'
7
+ add_group 'Models', 'app/models'
8
+ add_group 'Views', 'app/views'
9
+ add_group 'Libraries', 'lib'
10
+ end
11
+
12
+ # Configure Rails Environment
13
+ ENV['RAILS_ENV'] = 'test'
14
+
15
+ begin
16
+ require File.expand_path('../dummy/config/environment', __FILE__)
17
+ rescue LoadError
18
+ puts 'Could not load dummy application. Please ensure you have run `bundle exec rake test_app`'
19
+ exit
20
+ end
21
+
22
+ require 'rspec/rails'
23
+ require 'shoulda/matchers'
24
+ require 'database_cleaner'
25
+ require 'ffaker'
26
+
27
+ # Requires supporting ruby files with custom matchers and macros, etc,
28
+ # in spec/support/ and its subdirectories.
29
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
30
+
31
+ # Requires factories defined in spree_core
32
+ # require 'spree/testing_support/factories'
33
+ require 'spree/testing_support/controller_requests'
34
+ require 'spree/testing_support/authorization_helpers'
35
+ require 'spree/testing_support/url_helpers'
36
+
37
+ # Requires factories defined in lib/spree_favorite_products/factories.rb
38
+ # require 'spree_favorite_products/factories'
39
+
40
+ Shoulda::Matchers.configure do |config|
41
+ config.integrate do |with|
42
+ with.test_framework :rspec
43
+ with.library :rails
44
+ end
45
+ end
46
+
47
+ RSpec.configure do |config|
48
+ # config.include FactoryGirl::Syntax::Methods
49
+
50
+ # == URL Helpers
51
+ #
52
+ # Allows access to Spree's routes in specs:
53
+ #
54
+ # visit spree.admin_path
55
+ # current_path.should eql(spree.products_path)
56
+ config.include Spree::TestingSupport::UrlHelpers
57
+
58
+ # == Mock Framework
59
+ #
60
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
61
+ #
62
+ # config.mock_with :mocha
63
+ # config.mock_with :flexmock
64
+ # config.mock_with :rr
65
+ config.mock_with :rspec
66
+ config.color = true
67
+
68
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
69
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
70
+
71
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
72
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
73
+ # to setup a test will be unavailable to the browser, which runs under a seperate server instance.
74
+ config.use_transactional_fixtures = false
75
+
76
+ # Ensure Suite is set to use transactions for speed.
77
+ config.before :suite do
78
+ DatabaseCleaner.strategy = :transaction
79
+ DatabaseCleaner.clean_with :truncation
80
+ end
81
+
82
+ # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary.
83
+ config.before :each do |example|
84
+ DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
85
+ DatabaseCleaner.start
86
+ end
87
+
88
+ # After each spec clean the database.
89
+ config.after :each do
90
+ DatabaseCleaner.clean
91
+ end
92
+
93
+ config.fail_fast = ENV['FAIL_FAST'] || false
94
+
95
+ config.include Spree::TestingSupport::ControllerRequests, type: :controller
96
+
97
+ config.infer_spec_type_from_file_location!
98
+ end