solidus_six_saferpay 0.1.3 → 0.2.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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.gitignore +18 -0
  6. data/.rspec +2 -0
  7. data/.rubocop.yml +2 -0
  8. data/.travis.yml +12 -0
  9. data/Gemfile +33 -0
  10. data/LICENSE +26 -0
  11. data/README.md +36 -20
  12. data/Rakefile +4 -54
  13. data/app/assets/config/solidus_six_saferpay_manifest.js +1 -0
  14. data/app/assets/images/solidus_six_saferpay/.keep +0 -0
  15. data/app/assets/javascripts/spree/backend/solidus_six_saferpay.js +2 -0
  16. data/app/assets/javascripts/spree/frontend/solidus_six_saferpay.js +2 -0
  17. data/app/assets/stylesheets/solidus_six_saferpay/loading_animation.scss +0 -27
  18. data/app/assets/stylesheets/solidus_six_saferpay/payments.scss +4 -1
  19. data/app/assets/stylesheets/spree/backend/solidus_six_saferpay.css +4 -0
  20. data/app/assets/stylesheets/spree/frontend/solidus_six_saferpay.css +4 -0
  21. data/app/controllers/spree/solidus_six_saferpay/checkout_controller.rb +56 -10
  22. data/app/services/spree/solidus_six_saferpay/inquire_payment.rb +1 -0
  23. data/app/views/spree/checkout/payment/_saferpay_payment.html.erb +1 -1
  24. data/app/views/spree/six_saferpay_payments/_six_saferpay_payment.html.erb +2 -2
  25. data/bin/console +17 -0
  26. data/bin/rails +18 -0
  27. data/bin/rake +7 -0
  28. data/bin/setup +8 -0
  29. data/config/initializers/assets.rb +3 -0
  30. data/config/locales/de.yml +1 -1
  31. data/config/locales/en.yml +1 -1
  32. data/config/locales/fr.yml +1 -1
  33. data/config/routes.rb +6 -6
  34. data/lib/generators/solidus_six_saferpay/install/install_generator.rb +15 -3
  35. data/lib/solidus_six_saferpay.rb +6 -3
  36. data/lib/solidus_six_saferpay/configuration.rb +4 -7
  37. data/lib/solidus_six_saferpay/engine.rb +19 -10
  38. data/lib/solidus_six_saferpay/gateway.rb +5 -4
  39. data/lib/solidus_six_saferpay/payment_page_gateway.rb +8 -9
  40. data/lib/solidus_six_saferpay/transaction_gateway.rb +8 -9
  41. data/lib/solidus_six_saferpay/version.rb +3 -1
  42. data/solidus_six_saferpay.gemspec +42 -0
  43. data/spec/controllers/spree/solidus_six_saferpay/checkout_controller_spec.rb +41 -0
  44. data/spec/controllers/spree/solidus_six_saferpay/payment_page/checkout_controller_spec.rb +206 -0
  45. data/spec/controllers/spree/solidus_six_saferpay/transaction/checkout_controller_spec.rb +229 -0
  46. data/spec/factories/payment_methods.rb +23 -0
  47. data/spec/factories/payments.rb +11 -0
  48. data/spec/factories/spree/six_saferpay_payments.rb +118 -0
  49. data/spec/models/spree/six_saferpay_payment_spec.rb +203 -0
  50. data/spec/rails_helper.rb +73 -0
  51. data/spec/services/spree/solidus_six_saferpay/assert_payment_page_spec.rb +148 -0
  52. data/spec/services/spree/solidus_six_saferpay/authorize_payment_spec.rb +39 -0
  53. data/spec/services/spree/solidus_six_saferpay/authorize_transaction_spec.rb +148 -0
  54. data/spec/services/spree/solidus_six_saferpay/initialize_payment_page_spec.rb +83 -0
  55. data/spec/services/spree/solidus_six_saferpay/initialize_payment_spec.rb +40 -0
  56. data/spec/services/spree/solidus_six_saferpay/initialize_transaction_spec.rb +85 -0
  57. data/spec/services/spree/solidus_six_saferpay/inquire_payment_page_payment_spec.rb +116 -0
  58. data/spec/services/spree/solidus_six_saferpay/inquire_payment_spec.rb +39 -0
  59. data/spec/services/spree/solidus_six_saferpay/inquire_transaction_payment_spec.rb +117 -0
  60. data/spec/services/spree/solidus_six_saferpay/payment_validator_spec.rb +100 -0
  61. data/spec/services/spree/solidus_six_saferpay/process_authorized_payment_spec.rb +39 -0
  62. data/spec/services/spree/solidus_six_saferpay/process_payment_page_payment_spec.rb +225 -0
  63. data/spec/services/spree/solidus_six_saferpay/process_transaction_payment_spec.rb +219 -0
  64. data/spec/solidus_six_saferpay/configuration_spec.rb +15 -0
  65. data/spec/solidus_six_saferpay/error_handler_spec.rb +65 -0
  66. data/spec/solidus_six_saferpay/gateway_response_spec.rb +70 -0
  67. data/spec/solidus_six_saferpay/gateway_spec.rb +365 -0
  68. data/spec/solidus_six_saferpay/payment_page_gateway_spec.rb +392 -0
  69. data/spec/solidus_six_saferpay/transaction_gateway_spec.rb +390 -0
  70. data/spec/spec_helper.rb +21 -0
  71. data/spec/support/route_access.rb +6 -0
  72. data/spec/support/uses_payment_page_gateway.rb +29 -0
  73. data/spec/support/uses_transaction_gateway.rb +28 -0
  74. metadata +240 -99
@@ -21,6 +21,7 @@ module Spree
21
21
  if inquiry.success?
22
22
  saferpay_payment.update_attributes(response_hash: inquiry.api_response.to_h)
23
23
  else
24
+ saferpay_payment.update_attributes(response_hash: saferpay_payment.response_hash.merge(error: "#{inquiry.error_name}"))
24
25
  general_error = I18n.t(:general_error, scope: [:solidus_six_saferpay, :errors])
25
26
  specific_error = I18n.t(inquiry.error_name, scope: [:six_saferpay, :error_names])
26
27
  @user_message = "#{general_error}: #{specific_error}"
@@ -1,6 +1,6 @@
1
1
  <% payment_container_id = "saferpay-payment-container-#{payment_method.id}" %>
2
2
  <% if payment_method.preferred_as_iframe %>
3
- <iframe class="loading-animation saferpay-iframe" width='100%' height='550px' id="<%= payment_container_id %>" src="" frameborder="0">
3
+ <iframe class="saferpay-iframe" width='100%' height='550px' id="<%= payment_container_id %>" src="" frameborder="0">
4
4
  </iframe>
5
5
  <script charset="utf-8">
6
6
  SaferpayPayment.registerIframePaymentMethod({id: "<%= payment_method.id %>", initUrl: "<%= payment_method.init_path %>", containerId: "#<%= payment_container_id %>"})
@@ -2,8 +2,8 @@
2
2
  <% container_class = "saferpay-payment #{payment.state}" %>
3
3
  <div class="<%= container_class %>">
4
4
  <div class="credit-card">
5
- <span><%= image_tag "solidus_six_saferpay/credit_cards/icons/#{saferpay_payment.icon_name}.png" %></span>
6
- <span><%= saferpay_payment.display_text %></span>
5
+ <div class="cc-image-container"><%= image_tag "solidus_six_saferpay/credit_cards/icons/#{saferpay_payment.icon_name}.png", class: "cc-img" %></div>
6
+ <div class="cc-number"><%= saferpay_payment.display_text %></div>
7
7
  </div>
8
8
  <div>
9
9
  <div class="amount">
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ require "bundler/setup"
6
+ require "solidus_six_saferpay"
7
+
8
+ # You can add fixtures and/or initialization code here to make experimenting
9
+ # with your gem easier. You can also use a different console, if you like.
10
+ $LOAD_PATH.unshift(*Dir["#{__dir__}/../app/*"])
11
+
12
+ # (If you use this, don't forget to add pry to your Gemfile!)
13
+ # require "pry"
14
+ # Pry.start
15
+
16
+ require "irb"
17
+ IRB.start(__FILE__)
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ app_root = 'sandbox'
6
+
7
+ unless File.exist? "#{app_root}/bin/rails"
8
+ warn 'Creating the sandbox app...'
9
+ Dir.chdir "#{__dir__}/.." do
10
+ system "#{__dir__}/sandbox" or begin # rubocop:disable Style/AndOr
11
+ warn 'Automatic creation of the sandbox app failed'
12
+ exit 1
13
+ end
14
+ end
15
+ end
16
+
17
+ Dir.chdir app_root
18
+ exec 'bin/rails', *ARGV
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ gem install bundler --conservative
7
+ bundle update
8
+ bin/rake clobber
@@ -0,0 +1,3 @@
1
+ if Rails.application.config.respond_to?(:assets)
2
+ Rails.application.config.assets.precompile << 'solidus_six_saferpay_manifest.js'
3
+ end
@@ -6,7 +6,7 @@ de:
6
6
  init:
7
7
  checkout_not_initialized: Zahlung konnte nicht gestartet werden.
8
8
  success:
9
- payment_source_not_created: Six Saferpay Zahlungsquelle konnte nicht erstellt werden.
9
+ saferpay_payment_not_found: Six Saferpay Zahlung kann nicht gefunden werden.
10
10
  fail:
11
11
  payment_failed: Die Zahlung konnte nicht abgeschlossen werden.
12
12
  payment_page:
@@ -6,7 +6,7 @@ en:
6
6
  init:
7
7
  checkout_not_initialized: Payment could not be initialized.
8
8
  success:
9
- payment_source_not_created: Six Saferpay payment source could not be created.
9
+ saferpay_payment_not_found: Six Saferpay payment can not be found.
10
10
  fail:
11
11
  payment_failed: The payment could not be completed.
12
12
  payment_page:
@@ -6,7 +6,7 @@ fr:
6
6
  init:
7
7
  checkout_not_initialized: Le paiement n'a pas pu être initialisé.
8
8
  success:
9
- payment_source_not_created: La source de paiement Six Saferpay n'a pas pu être créée.
9
+ saferpay_payment_not_found: Paiement Six Saferpay est introuvable.
10
10
  fail:
11
11
  payment_failed: Le paiement n'a pas pu être complété.
12
12
  payment_page:
@@ -1,17 +1,17 @@
1
- Spree::Core::Engine.routes.draw do
1
+ # frozen_string_literal: true
2
2
 
3
+ Spree::Core::Engine.routes.draw do
3
4
  namespace :solidus_six_saferpay do
4
5
  namespace :payment_page do
5
6
  get :init, controller: :checkout, defaults: { format: :json }
6
- get :success, controller: :checkout
7
- get :fail, controller: :checkout
7
+ get 'success/:order_number', to: 'checkout#success', as: :success
8
+ get 'fail/:order_number', to: 'checkout#fail', as: :fail
8
9
  end
9
10
 
10
11
  namespace :transaction do
11
12
  get :init, controller: :checkout, defaults: { format: :json }
12
- get :success, controller: :checkout
13
- get :fail, controller: :checkout
13
+ get 'success/:order_number', to: 'checkout#success', as: :success
14
+ get 'fail/:order_number', to: 'checkout#fail', as: :fail
14
15
  end
15
16
  end
16
-
17
17
  end
@@ -1,18 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SolidusSixSaferpay
2
4
  module Generators
3
5
  class InstallGenerator < Rails::Generators::Base
4
6
  class_option :auto_run_migrations, type: :boolean, default: false
5
7
 
8
+ def add_javascripts
9
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/solidus_six_saferpay\n"
10
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/solidus_six_saferpay\n"
11
+ end
12
+
13
+ def add_stylesheets
14
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/solidus_six_saferpay\n", before: %r{\*/}, verbose: true
15
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/solidus_six_saferpay\n", before: %r{\*/}, verbose: true
16
+ end
17
+
6
18
  def add_migrations
7
- run 'bundle exec rake railties:install:migrations FROM=solidus_six_saferpay'
19
+ run 'bin/rails railties:install:migrations FROM=solidus_six_saferpay'
8
20
  end
9
21
 
10
22
  def run_migrations
11
23
  run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
12
24
  if run_migrations
13
- run 'bundle exec rake db:migrate'
25
+ run 'bin/rails db:migrate'
14
26
  else
15
- puts 'Skipping rake db:migrate, don\'t forget to run it!'
27
+ puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
16
28
  end
17
29
  end
18
30
  end
@@ -1,5 +1,8 @@
1
- require 'solidus_core'
2
- require "solidus_support"
1
+ # frozen_string_literal: true
3
2
 
4
- require "solidus_six_saferpay/engine"
3
+ require 'solidus_core'
4
+ require 'solidus_support'
5
5
  require 'six_saferpay'
6
+
7
+ require 'solidus_six_saferpay/version'
8
+ require 'solidus_six_saferpay/engine'
@@ -1,12 +1,9 @@
1
1
  module SolidusSixSaferpay
2
-
3
2
  class Configuration
4
- def self.config
5
- yield(self)
6
- end
3
+ include ActiveSupport::Configurable
4
+
7
5
 
8
- def self.error_handlers
9
- @error_handlers ||= []
10
- end
6
+ config_accessor(:payment_processing_success_handler)
7
+ config_accessor(:error_handlers) { [] }
11
8
  end
12
9
  end
@@ -1,6 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spree/core'
1
4
  module SolidusSixSaferpay
2
- class Engine < ::Rails::Engine
3
- isolate_namespace SolidusSixSaferpay
5
+
6
+ def self.config
7
+ @config ||= Configuration.new
8
+ end
9
+
10
+ def self.configure
11
+ yield config
12
+ end
13
+
14
+ class Engine < Rails::Engine
15
+ include SolidusSupport::EngineExtensions::Decorators
16
+
17
+ isolate_namespace ::Spree
18
+
19
+ engine_name 'solidus_six_saferpay'
4
20
 
5
21
  config.autoload_paths += Dir["#{config.root}/lib/**/"]
6
22
  config.eager_load_paths += Dir["#{config.root}/lib/**/"]
@@ -10,16 +26,9 @@ module SolidusSixSaferpay
10
26
  app.config.spree.payment_methods << Spree::PaymentMethod::SaferpayTransaction
11
27
  end
12
28
 
13
- initializer "solidus_six_payments.assets.precompile" do |app|
14
- app.config.assets.precompile += %w( solidus_six_saferpay/application.css )
15
- app.config.assets.precompile += %w( solidus_six_saferpay/saferpay_payment.js )
16
- app.config.assets.precompile += %w( solidus_six_saferpay/credit_cards/**/*.png )
17
- end
18
-
29
+ # use rspec for tests
19
30
  config.generators do |g|
20
31
  g.test_framework :rspec
21
- g.fixture_replacement :factory_bot
22
- g.factory_bot dir: 'spec/factories'
23
32
  end
24
33
  end
25
34
  end
@@ -5,9 +5,6 @@ module SolidusSixSaferpay
5
5
 
6
6
  def initialize(options = {})
7
7
  SixSaferpay.configure do |config|
8
- config.success_url = options.fetch(:success_url)
9
- config.fail_url = options.fetch(:fail_url)
10
-
11
8
  # Allow config via ENV for static values
12
9
  config.customer_id = options.fetch(:customer_id) { ENV.fetch('SIX_SAFERPAY_CUSTOMER_ID') }
13
10
  config.terminal_id = options.fetch(:terminal_id) { ENV.fetch('SIX_SAFERPAY_TERMINAL_ID') }
@@ -156,7 +153,7 @@ module SolidusSixSaferpay
156
153
  )
157
154
  payer = SixSaferpay::Payer.new(language_code: I18n.locale, billing_address: billing_address, delivery_address: delivery_address)
158
155
 
159
- params = { payment: payment, payer: payer }
156
+ params = { payment: payment, payer: payer, return_urls: return_urls(order) }
160
157
 
161
158
  six_payment_methods = payment_method.enabled_payment_methods
162
159
  params.merge!(payment_methods: six_payment_methods) unless six_payment_methods.blank?
@@ -164,6 +161,10 @@ module SolidusSixSaferpay
164
161
  params
165
162
  end
166
163
 
164
+ def return_urls(order)
165
+ raise NotImplementedError, "Must be implemented in PaymentPageGateway or TransactionGateway"
166
+ end
167
+
167
168
  def response(success, message, api_response, options = {})
168
169
  GatewayResponse.new(success, message, api_response, options)
169
170
  end
@@ -1,15 +1,6 @@
1
1
  module SolidusSixSaferpay
2
2
  class PaymentPageGateway < Gateway
3
3
 
4
- def initialize(options = {})
5
- super(
6
- options.merge(
7
- success_url: url_helpers.solidus_six_saferpay_payment_page_success_url,
8
- fail_url: url_helpers.solidus_six_saferpay_payment_page_fail_url
9
- )
10
- )
11
- end
12
-
13
4
  def inquire(saferpay_payment, options = {})
14
5
  inquire_response = perform_assert_request(saferpay_payment, options)
15
6
 
@@ -47,6 +38,14 @@ module SolidusSixSaferpay
47
38
  SixSaferpay::SixPaymentPage::Initialize.new(interface_initialize_params(order, payment_method))
48
39
  end
49
40
 
41
+ def return_urls(order)
42
+ SixSaferpay::ReturnUrls.new(
43
+ success: url_helpers.solidus_six_saferpay_payment_page_success_url(order.number),
44
+ fd_fail: url_helpers.solidus_six_saferpay_payment_page_fail_url(order.number),
45
+ fd_abort: url_helpers.solidus_six_saferpay_payment_page_fail_url(order.number)
46
+ )
47
+ end
48
+
50
49
  def perform_assert_request(saferpay_payment, options = {})
51
50
  payment_page_assert = SixSaferpay::SixPaymentPage::Assert.new(token: saferpay_payment.token)
52
51
  SixSaferpay::Client.post(payment_page_assert)
@@ -1,15 +1,6 @@
1
1
  module SolidusSixSaferpay
2
2
  class TransactionGateway < Gateway
3
3
 
4
- def initialize(options = {})
5
- super(
6
- options.merge(
7
- success_url: url_helpers.solidus_six_saferpay_transaction_success_url,
8
- fail_url: url_helpers.solidus_six_saferpay_transaction_fail_url
9
- )
10
- )
11
- end
12
-
13
4
  def inquire(saferpay_payment, options = {})
14
5
  transaction_inquire = SixSaferpay::SixTransaction::Inquire.new(transaction_reference: saferpay_payment.transaction_id)
15
6
  inquire_response = SixSaferpay::Client.post(transaction_inquire)
@@ -43,5 +34,13 @@ module SolidusSixSaferpay
43
34
  def interface_initialize_object(order, payment_method)
44
35
  SixSaferpay::SixTransaction::Initialize.new(interface_initialize_params(order, payment_method))
45
36
  end
37
+
38
+ def return_urls(order)
39
+ SixSaferpay::ReturnUrls.new(
40
+ success: url_helpers.solidus_six_saferpay_transaction_success_url(order.number),
41
+ fd_fail: url_helpers.solidus_six_saferpay_transaction_fail_url(order.number),
42
+ fd_abort: url_helpers.solidus_six_saferpay_transaction_fail_url(order.number)
43
+ )
44
+ end
46
45
  end
47
46
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SolidusSixSaferpay
2
- VERSION = '0.1.3'
4
+ VERSION = '0.2.0'
3
5
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/solidus_six_saferpay/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'solidus_six_saferpay'
7
+ spec.version = SolidusSixSaferpay::VERSION
8
+ spec.authors = ['Simon Kiener']
9
+ spec.email = ['jugglinghobo@gmail.com']
10
+
11
+ spec.summary = 'Saferpay Payment Page and Transaction payment methods for Solidus'
12
+ spec.description = 'Adds Saferpay Payment Page and Transaction payment methods to your Solidus application'
13
+ spec.homepage = 'https://github.com/fadendaten/solidus_six_saferpay'
14
+ spec.license = 'MIT'
15
+
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://github.com/fadendaten/solidus_six_saferpay'
18
+
19
+ spec.required_ruby_version = Gem::Requirement.new('~> 2.4')
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
24
+
25
+ spec.files = files.grep_v(%r{^(test|spec|features)/})
26
+ spec.test_files = files.grep(%r{^(test|spec|features)/})
27
+ spec.bindir = "exe"
28
+ spec.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 3']
32
+ spec.add_dependency 'solidus_support', '~> 0.4.0'
33
+ spec.add_dependency "six_saferpay", "~> 2.2"
34
+ spec.add_dependency "rails-i18n", "~> 5.1"
35
+
36
+ spec.add_development_dependency 'solidus_dev_support'
37
+
38
+ spec.add_development_dependency "shoulda-matchers", "~> 4.1"
39
+ spec.add_development_dependency "rails-controller-testing", "~> 1.0", ">= 1.0.4"
40
+ spec.add_development_dependency "pry", "~> 0.12"
41
+ spec.add_development_dependency "pry-rails", "~> 0.3"
42
+ end
@@ -0,0 +1,41 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Spree::SolidusSixSaferpay::CheckoutController, type: :controller do
4
+ routes { Spree::Core::Engine.routes }
5
+
6
+ let(:user) { create(:user) }
7
+ let(:order) { create(:order) }
8
+ let(:payment_method) { create(:saferpay_payment_method_transaction) }
9
+ let(:payment) { create(:six_saferpay_payment) }
10
+
11
+ let(:subject) { described_class.new }
12
+
13
+ before do
14
+ allow(controller).to receive_messages try_spree_current_user: user
15
+ allow(controller).to receive_messages current_order: order
16
+ end
17
+
18
+ describe '#initialize_payment' do
19
+ it 'is not implemented in this superclass' do
20
+ expect { subject.send(:initialize_payment, order, payment_method) }.to raise_error(NotImplementedError)
21
+ end
22
+ end
23
+
24
+ describe '#authorize_payment' do
25
+ it 'is not implemented in this superclass' do
26
+ expect { subject.send(:authorize_payment, payment) }.to raise_error(NotImplementedError)
27
+ end
28
+ end
29
+
30
+ describe '#process_authorization' do
31
+ it 'is not implemented in this superclass' do
32
+ expect { subject.send(:process_authorization, payment) }.to raise_error(NotImplementedError)
33
+ end
34
+ end
35
+
36
+ describe '#inquire_payment' do
37
+ it 'is not implemented in this superclass' do
38
+ expect { subject.send(:inquire_payment, payment) }.to raise_error(NotImplementedError)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,206 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Spree::SolidusSixSaferpay::PaymentPage::CheckoutController, type: :controller do
4
+ routes { Spree::Core::Engine.routes }
5
+
6
+ let(:user) { create(:user) }
7
+ let(:order) { create(:order) }
8
+ let(:payment_method) { create(:saferpay_payment_method_payment_page) }
9
+
10
+ let(:subject) { described_class.new }
11
+
12
+ before do
13
+ allow(controller).to receive_messages try_spree_current_user: user
14
+ allow(controller).to receive_messages current_order: order
15
+ end
16
+
17
+ describe 'GET init' do
18
+ let(:success) { false }
19
+ let(:redirect_url) { '/saferpay/redirect/url' }
20
+ let(:initialized_payment) { instance_double("Spree::SolidusSixSaferpay::InitializePaymentPage", success?: success, redirect_url: redirect_url) }
21
+
22
+ it 'tries to the saferpay payment' do
23
+ expect(Spree::SolidusSixSaferpay::InitializePaymentPage).to receive(:call).with(order, payment_method).and_return(initialized_payment)
24
+
25
+ get :init, params: { payment_method_id: payment_method.id }
26
+ end
27
+
28
+
29
+ context 'when payment initialize succeeds' do
30
+ let(:success) { true }
31
+
32
+ before do
33
+ allow(Spree::SolidusSixSaferpay::InitializePaymentPage).to receive(:call).with(order, payment_method).and_return(initialized_payment)
34
+ end
35
+
36
+ it 'returns the redirect_url' do
37
+ get :init, params: { payment_method_id: payment_method.id }
38
+
39
+ body = JSON.parse(response.body)
40
+ expect(body["redirect_url"]).to eq(redirect_url)
41
+ end
42
+ end
43
+
44
+ context 'when payment initialize fails' do
45
+ let(:success) { false }
46
+
47
+ before do
48
+ allow(Spree::SolidusSixSaferpay::InitializePaymentPage).to receive(:call).with(order, payment_method).and_return(initialized_payment)
49
+ end
50
+
51
+ it 'returns an error' do
52
+ get :init, params: { payment_method_id: payment_method.id }
53
+
54
+ expect(response.body).to match(/errors/)
55
+ expect(response.status).to eq(422)
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ describe 'GET success' do
62
+ context 'when the order is not found' do
63
+ let(:order) { nil }
64
+
65
+ it 'redirects to the cart page via iframe breakout' do
66
+ get :success, params: { order_number: "not_found" }
67
+ expect(assigns(:redirect_path)).to eq(routes.cart_path)
68
+ expect(response).to render_template :iframe_breakout_redirect
69
+ end
70
+ end
71
+
72
+ context 'when the order is already completed' do
73
+ let(:order) { create(:order_ready_to_ship) }
74
+
75
+ it 'redirects to the cart page via iframe breakout' do
76
+ get :success, params: { order_number: order.number }
77
+ expect(assigns(:redirect_path)).to eq(routes.cart_path)
78
+ expect(response).to render_template :iframe_breakout_redirect
79
+ end
80
+ end
81
+
82
+ context 'when payment could not be created' do
83
+ let!(:payment) { nil }
84
+
85
+ it 'raises an error because no payment exists' do
86
+ expect{ get(:success, params: { order_number: order.number }) }.to raise_error(Spree::Core::GatewayError)
87
+ end
88
+ end
89
+
90
+ context 'when payment create was successful' do
91
+ let!(:payment) { create(:six_saferpay_payment, order: order) }
92
+ let(:assert_success) { false }
93
+ let(:payment_assert) { instance_double("Spree::SolidusSixSaferpay::AssertPaymentPage", success?: assert_success) }
94
+ let(:payment_inquiry) { instance_double("Spree::SolidusSixSaferpay::InquirePaymentPagePayment", user_message: "payment inquiry message") }
95
+
96
+ it 'asserts the payment' do
97
+ expect(Spree::SolidusSixSaferpay::AssertPaymentPage).to receive(:call).with(payment).and_return(payment_assert)
98
+ expect(Spree::SolidusSixSaferpay::InquirePaymentPagePayment).to receive(:call).with(payment).and_return(payment_inquiry)
99
+
100
+ get :success, params: { order_number: order.number }
101
+ end
102
+
103
+ context 'when the payment assert is successful' do
104
+ let(:assert_success) { true }
105
+ let(:process_success) { false }
106
+ let(:processed_payment) { instance_double("Spree::SolidusSixSaferpay::ProcessPaymentPagePayment", success?: process_success, user_message: "payment processing message") }
107
+
108
+ before do
109
+ allow(Spree::SolidusSixSaferpay::AssertPaymentPage).to receive(:call).with(payment).and_return(payment_assert)
110
+ end
111
+
112
+ it 'processes the asserted payment' do
113
+ expect(Spree::SolidusSixSaferpay::ProcessPaymentPagePayment).to receive(:call).with(payment).and_return(processed_payment)
114
+
115
+ get :success, params: { order_number: order.number }
116
+ end
117
+
118
+ context 'when the processing is successful' do
119
+ let(:process_success) { true }
120
+
121
+ before do
122
+ allow(Spree::SolidusSixSaferpay::ProcessPaymentPagePayment).to receive(:call).with(payment).and_return(processed_payment)
123
+ allow(Spree::Order).to receive(:find_by).with(number: order.number).and_return(order)
124
+ end
125
+
126
+
127
+ context 'when order is in payment state' do
128
+ let(:order) { create(:order, state: :payment) }
129
+
130
+ it 'moves order to next state' do
131
+ expect(order).to receive(:next!)
132
+
133
+ get :success, params: { order_number: order.number }
134
+ end
135
+ end
136
+
137
+ context 'when order is already in complete state' do
138
+ let(:order) { create(:order, state: :complete) }
139
+
140
+ it 'does not modify the order state' do
141
+ expect(order).not_to receive(:next!)
142
+
143
+ get :success, params: { order_number: order.number }
144
+ end
145
+ end
146
+ end
147
+
148
+ context 'when the processing fails' do
149
+ let(:process_success) { false }
150
+
151
+ before do
152
+ allow(Spree::SolidusSixSaferpay::ProcessPaymentPagePayment).to receive(:call).with(payment).and_return(processed_payment)
153
+ end
154
+
155
+ it 'displays an error message' do
156
+ get :success, params: { order_number: order.number }
157
+
158
+ expect(flash[:error]).to eq("payment processing message")
159
+ end
160
+ end
161
+
162
+ end
163
+
164
+ context 'when the payment assert fails' do
165
+ let(:assert_success) { false }
166
+
167
+ before do
168
+ allow(Spree::SolidusSixSaferpay::AssertPaymentPage).to receive(:call).with(payment).and_return(payment_assert)
169
+ end
170
+
171
+ it 'inquires the payment' do
172
+ expect(Spree::SolidusSixSaferpay::InquirePaymentPagePayment).to receive(:call).with(payment).and_return(payment_inquiry)
173
+
174
+ get :success, params: { order_number: order.number }
175
+ end
176
+
177
+ it 'displays an error message' do
178
+ expect(Spree::SolidusSixSaferpay::InquirePaymentPagePayment).to receive(:call).with(payment).and_return(payment_inquiry)
179
+ get :success, params: { order_number: order.number }
180
+
181
+ expect(flash[:error]).to eq("payment inquiry message")
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ describe 'GET fail' do
188
+ let!(:payment) { create(:six_saferpay_payment, order: order) }
189
+ let(:payment_inquiry) { instance_double("Spree::SolidusSixSaferpay::InquirePaymentPagePayment", user_message: "payment inquiry message") }
190
+
191
+ it 'inquires the payment' do
192
+ expect(Spree::SolidusSixSaferpay::InquirePaymentPagePayment).to receive(:call).with(payment).and_return(payment_inquiry)
193
+
194
+ get :fail, params: { order_number: order.number }
195
+ end
196
+
197
+ it 'displays an error message' do
198
+ expect(Spree::SolidusSixSaferpay::InquirePaymentPagePayment).to receive(:call).with(payment).and_return(payment_inquiry)
199
+
200
+ get :fail, params: { order_number: order.number }
201
+
202
+ expect(flash[:error]).to eq("payment inquiry message")
203
+ end
204
+
205
+ end
206
+ end