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
@@ -0,0 +1,229 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Spree::SolidusSixSaferpay::Transaction::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
+
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::InitializeTransaction", success?: success, redirect_url: redirect_url) }
21
+
22
+ it 'tries to the saferpay payment' do
23
+ expect(Spree::SolidusSixSaferpay::InitializeTransaction).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::InitializeTransaction).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::InitializeTransaction).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::AuthorizeTransaction", success?: assert_success) }
94
+ let(:payment_inquiry) { instance_double("Spree::SolidusSixSaferpay::InquireTransactionPayment", user_message: "payment inquiry message") }
95
+
96
+ it 'asserts the payment' do
97
+ expect(Spree::SolidusSixSaferpay::AuthorizeTransaction).to receive(:call).with(payment).and_return(payment_assert)
98
+ expect(Spree::SolidusSixSaferpay::InquireTransactionPayment).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::ProcessTransactionPayment", success?: process_success, user_message: "payment processing message") }
107
+
108
+ before do
109
+ allow(Spree::SolidusSixSaferpay::AuthorizeTransaction).to receive(:call).with(payment).and_return(payment_assert)
110
+ end
111
+
112
+ it 'processes the asserted payment' do
113
+ expect(Spree::SolidusSixSaferpay::ProcessTransactionPayment).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::ProcessTransactionPayment).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
+ context 'when the default success handling is applied' do
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 a custom success handling is applied' do
149
+ let(:custom_handler) do
150
+ Proc.new { |context, order| order.email }
151
+ end
152
+
153
+ before do
154
+ allow(::SolidusSixSaferpay.config).to receive(:payment_processing_success_handler).and_return(custom_handler)
155
+ end
156
+
157
+ it 'does not modify the order state' do
158
+ expect(order).not_to receive(:next!)
159
+
160
+ get :success, params: { order_number: order.number }
161
+ end
162
+
163
+ it 'executes the custom handler' do
164
+ expect(order).to receive(:email)
165
+
166
+ get :success, params: { order_number: order.number }
167
+ end
168
+ end
169
+ end
170
+
171
+ context 'when the processing fails' do
172
+ let(:process_success) { false }
173
+
174
+ before do
175
+ allow(Spree::SolidusSixSaferpay::ProcessTransactionPayment).to receive(:call).with(payment).and_return(processed_payment)
176
+ end
177
+
178
+ it 'displays an error message' do
179
+ get :success, params: { order_number: order.number }
180
+
181
+ expect(flash[:error]).to eq("payment processing message")
182
+ end
183
+ end
184
+
185
+ end
186
+
187
+ context 'when the payment assert fails' do
188
+ let(:assert_success) { false }
189
+
190
+ before do
191
+ allow(Spree::SolidusSixSaferpay::AuthorizeTransaction).to receive(:call).with(payment).and_return(payment_assert)
192
+ end
193
+
194
+ it 'inquires the payment' do
195
+ expect(Spree::SolidusSixSaferpay::InquireTransactionPayment).to receive(:call).with(payment).and_return(payment_inquiry)
196
+
197
+ get :success, params: { order_number: order.number }
198
+ end
199
+
200
+ it 'displays an error message' do
201
+ expect(Spree::SolidusSixSaferpay::InquireTransactionPayment).to receive(:call).with(payment).and_return(payment_inquiry)
202
+ get :success, params: { order_number: order.number }
203
+
204
+ expect(flash[:error]).to eq("payment inquiry message")
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+ describe 'GET fail' do
211
+ let!(:payment) { create(:six_saferpay_payment, order: order) }
212
+ let(:payment_inquiry) { instance_double("Spree::SolidusSixSaferpay::InquireTransactionPayment", user_message: "payment inquiry message") }
213
+
214
+ it 'inquires the payment' do
215
+ expect(Spree::SolidusSixSaferpay::InquireTransactionPayment).to receive(:call).with(payment).and_return(payment_inquiry)
216
+
217
+ get :fail, params: { order_number: order.number }
218
+ end
219
+
220
+ it 'displays an error message' do
221
+ expect(Spree::SolidusSixSaferpay::InquireTransactionPayment).to receive(:call).with(payment).and_return(payment_inquiry)
222
+
223
+ get :fail, params: { order_number: order.number }
224
+
225
+ expect(flash[:error]).to eq("payment inquiry message")
226
+ end
227
+
228
+ end
229
+ end
@@ -0,0 +1,23 @@
1
+ FactoryBot.define do
2
+
3
+ factory :saferpay_payment_method, class: Spree::PaymentMethod::SaferpayPaymentMethod do
4
+ name { "saferpay_payment_method" }
5
+ preferred_require_liability_shift { true }
6
+
7
+ trait :no_require_liability_shift do
8
+ preferred_require_liability_shift { false }
9
+ end
10
+
11
+ trait :no_as_iframe do
12
+ preferred_as_iframe { false }
13
+ end
14
+ end
15
+
16
+ factory :saferpay_payment_method_payment_page, class: Spree::PaymentMethod::SaferpayPaymentPage, parent: :saferpay_payment_method do
17
+ name { "saferpay_payment_page" }
18
+ end
19
+
20
+ factory :saferpay_payment_method_transaction, class: Spree::PaymentMethod::SaferpayTransaction, parent: :saferpay_payment_method do
21
+ name { "saferpay_transaction" }
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ FactoryBot.define do
2
+
3
+ factory :payment_using_saferpay, class: Spree::Payment do
4
+ association(:payment_method, factory: :saferpay_payment_method)
5
+ source { create(:six_saferpay_payment, :authorized, order: order, payment_method: payment_method) }
6
+ order
7
+ state { 'checkout' }
8
+ response_code { '12345' }
9
+ end
10
+
11
+ end
@@ -0,0 +1,118 @@
1
+ FactoryBot.define do
2
+ factory :six_saferpay_payment, class: Spree::SixSaferpayPayment do
3
+ order
4
+ association :payment_method, factory: :saferpay_payment_method
5
+ expiration { Time.current + 2.hours }
6
+ sequence(:token, (1..100000).to_a.shuffle.to_enum)
7
+
8
+ trait :authorized do
9
+ sequence(:transaction_id) { |n| "TRANSACTION_ID_#{n}" }
10
+ transaction_status { "AUTHORIZED" }
11
+ transaction_date { DateTime.parse("2019-07-25T13:34:44.677+02:00") }
12
+ sequence(:six_transaction_reference) { |n| "SIX_TRANSACTION_REFERENCE_#{n}" }
13
+ display_text { "xxxx xxxx xxxx 1234" }
14
+
15
+ response_hash do
16
+ {
17
+ response_header: {
18
+ request_id: "request-id",
19
+ spec_version: "1.12"
20
+ },
21
+ transaction: {
22
+ type: "PAYMENT",
23
+ status: "AUTHORIZED",
24
+ id: "0QKl2GAnEK0OvA90vClhAESYEGYb",
25
+ date: "2019-07-25T13:34:44.677+02:00",
26
+ amount: {
27
+ value: "20000",
28
+ currency_code: "CHF"
29
+ },
30
+ order_id: "ORDER_ID",
31
+ acquirer_name: "ACQUIRER_NAME",
32
+ acquirer_reference: "ACQUIRER_REFERENCE",
33
+ six_transaction_reference: "SIX_TRANASACTION_REFERENCE",
34
+ approval_code: "APPROVAL CODE"
35
+ },
36
+ payment_means: {
37
+ brand: {
38
+ payment_method: "MASTERCARD",
39
+ name: "MasterCard"
40
+ },
41
+ display_text: "xxxx xxxx xxxx 1234",
42
+ card: {
43
+ masked_number: "xxxxxxxxxxxx1234",
44
+ exp_year: 2019,
45
+ exp_month: 7,
46
+ holder_name: "John Doe",
47
+ country_code: "US"
48
+ }
49
+ },
50
+ payer: {
51
+ ip_address: "IP ADDRESS",
52
+ ip_location: "CH",
53
+ delivery_address: {
54
+ first_name: "Simon",
55
+ last_name: "Knorrli",
56
+ street: "STREET",
57
+ zip: "ZIP",
58
+ city: "CITY",
59
+ country_code: "CH"
60
+ },
61
+ billing_address: {
62
+ first_name: "Simon",
63
+ last_name: "Knorrli",
64
+ street: "STREET",
65
+ zip: "ZIP",
66
+ city: "CITY",
67
+ country_code: "CH"
68
+ }
69
+ },
70
+ liability: {
71
+ liability_shift: true,
72
+ liable_entity: "ThreeDs",
73
+ three_ds: {
74
+ authenticated: true,
75
+ liability_shift: true,
76
+ xid: "3DS-XID"
77
+ }
78
+ }
79
+ }
80
+ end
81
+
82
+ end
83
+
84
+ trait :without_liability_shift do
85
+ authorized
86
+
87
+ after(:build) do |payment|
88
+ payment.response_hash.merge!(
89
+ liability: {
90
+ liability_shift: false,
91
+ liable_entity: "ThreeDs",
92
+ three_ds: {
93
+ authenticated: false,
94
+ liability_shift: false,
95
+ xid: "3DS-XID"
96
+ }
97
+ }
98
+ )
99
+ end
100
+ end
101
+
102
+ trait :dcc do
103
+ authorized
104
+
105
+ after(:build) do |payment|
106
+ payment.response_hash.merge!(
107
+ dcc: {
108
+ payer_amount: {
109
+ value: "18972",
110
+ currency_code: "USD"
111
+ }
112
+ }
113
+ )
114
+ end
115
+ end
116
+
117
+ end
118
+ end
@@ -0,0 +1,203 @@
1
+ require 'rails_helper'
2
+
3
+ module Spree
4
+ RSpec.describe SixSaferpayPayment, type: :model do
5
+ let(:payment) { FactoryBot.create(:six_saferpay_payment) }
6
+ describe 'associations' do
7
+ it { is_expected.to belong_to :order }
8
+ it { is_expected.to belong_to :payment_method }
9
+ end
10
+
11
+ describe 'validations' do
12
+ it { is_expected.to validate_presence_of :token }
13
+ it { is_expected.to validate_presence_of :expiration }
14
+ end
15
+
16
+ describe "#create_solidus_payment!" do
17
+ it 'creates a Solidus::Payment with the correct information' do
18
+ expect(Spree::Payment.count).to eq(0)
19
+ solidus_payment = payment.create_solidus_payment!
20
+ expect(Spree::Payment.count).to eq(1)
21
+ expect(solidus_payment.order).to eq(payment.order)
22
+ expect(solidus_payment.payment_method).to eq(payment.payment_method)
23
+ expect(solidus_payment.response_code).to eq(payment.transaction_id)
24
+ expect(solidus_payment.amount).to eq(payment.order.total)
25
+ expect(solidus_payment.source).to eq(payment)
26
+ end
27
+ end
28
+
29
+ describe '#address' do
30
+ it "returns the order's billing address" do
31
+ expect(payment.address).to eq(payment.order.bill_address)
32
+ end
33
+ end
34
+
35
+ describe '#payment_means' do
36
+ context 'when the payment is still unprocessed' do
37
+ it 'returns nil' do
38
+ expect(payment.payment_means).to be_nil
39
+ end
40
+ end
41
+
42
+ context 'when the payment is authorized' do
43
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
44
+
45
+ it 'returns a SixSaferpay::ResponsePaymentMeans' do
46
+ expect(payment.payment_means).to be_a(SixSaferpay::ResponsePaymentMeans)
47
+ end
48
+
49
+ it 'sets the API response attributes correctly' do
50
+ expect(payment.payment_means.brand.payment_method).to eq("MASTERCARD")
51
+ expect(payment.payment_means.brand.name).to eq("MasterCard")
52
+ expect(payment.payment_means.display_text).to eq("xxxx xxxx xxxx 1234")
53
+ expect(payment.payment_means.card.masked_number).to eq("xxxxxxxxxxxx1234")
54
+ expect(payment.payment_means.card.exp_year).to eq(2019)
55
+ expect(payment.payment_means.card.exp_month).to eq(7)
56
+ expect(payment.payment_means.card.holder_name).to eq("John Doe")
57
+ expect(payment.payment_means.card.country_code).to eq("US")
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#transaction' do
63
+ context 'when the payment is still unprocessed' do
64
+ it 'returns nil' do
65
+ expect(payment.transaction).to be_nil
66
+ end
67
+ end
68
+
69
+ context 'when the payment is authorized' do
70
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
71
+
72
+ it 'returns a SixSaferpay::Transaction' do
73
+ expect(payment.transaction).to be_a(SixSaferpay::Transaction)
74
+ end
75
+
76
+ it 'sets the API response attributes correctly' do
77
+ expect(payment.transaction.type).to eq("PAYMENT")
78
+ expect(payment.transaction.status).to eq("AUTHORIZED")
79
+ expect(payment.transaction.amount.value).to eq('20000')
80
+ expect(payment.transaction.amount.currency_code).to eq("CHF")
81
+ end
82
+ end
83
+ end
84
+
85
+ describe '#liability' do
86
+ context 'when the payment is still unprocessed' do
87
+ it 'returns nil' do
88
+ expect(payment.liability).to be_nil
89
+ end
90
+ end
91
+
92
+ context 'when the payment is authorized' do
93
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
94
+ it 'returns a SixSaferpay::Liability' do
95
+ expect(payment.liability).to be_a(SixSaferpay::Liability)
96
+ end
97
+
98
+ it 'sets the API response attributes correctly' do
99
+ expect(payment.liability.liability_shift).to be true
100
+ expect(payment.liability.liable_entity).to eq("ThreeDs")
101
+ end
102
+ end
103
+ end
104
+
105
+ describe '#card' do
106
+ context 'when the payment is still unprocessed' do
107
+ it 'returns nil' do
108
+ expect(payment.card).to be_nil
109
+ end
110
+ end
111
+
112
+ context 'when the payment is authorized' do
113
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
114
+
115
+ it 'returns a SixSaferpay::ResponseCard' do
116
+ expect(payment.card).to be_a(SixSaferpay::ResponseCard)
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#name' do
122
+ context 'when the payment is still unprocessed' do
123
+ it 'returns nil' do
124
+ expect(payment.name).to be_nil
125
+ end
126
+ end
127
+
128
+ context 'when the payment is authorized' do
129
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
130
+
131
+ it 'returns the card holder name' do
132
+ expect(payment.name).to eq("John Doe")
133
+ end
134
+ end
135
+ end
136
+
137
+ describe '#brand_name' do
138
+ context 'when the payment is still unprocessed' do
139
+ it 'returns nil' do
140
+ expect(payment.brand_name).to be_nil
141
+ end
142
+ end
143
+
144
+ context 'when the payment is authorized' do
145
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
146
+
147
+ it 'returns the brand name' do
148
+ expect(payment.brand_name).to eq("MasterCard")
149
+ end
150
+ end
151
+ end
152
+
153
+ describe '#month' do
154
+ context 'when the payment is still unprocessed' do
155
+ it 'returns nil' do
156
+ expect(payment.month).to be_nil
157
+ end
158
+ end
159
+
160
+ context 'when the payment is authorized' do
161
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
162
+
163
+ it 'returns the card expiration month' do
164
+ expect(payment.month).to eq(7)
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#year' do
170
+ context 'when the payment is still unprocessed' do
171
+ it 'returns nil' do
172
+ expect(payment.year).to be_nil
173
+ end
174
+ end
175
+
176
+ context 'when the payment is authorized' do
177
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
178
+
179
+ it 'returns the card expiration year' do
180
+ expect(payment.year).to eq(2019)
181
+ end
182
+ end
183
+ end
184
+
185
+ describe '#icon_name' do
186
+ context 'when the payment is still unprocessed' do
187
+ it 'returns nil' do
188
+ expect(payment.icon_name).to be_nil
189
+ end
190
+ end
191
+
192
+ context 'when the payment is authorized' do
193
+ let(:payment) { FactoryBot.create(:six_saferpay_payment, :authorized) }
194
+
195
+ it 'returns a downcased brand name' do
196
+ expect(payment.icon_name).to eq("mastercard")
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ end
203
+