From f5f9a733fb6ab31f305ea366c9da69772d2481c8 Mon Sep 17 00:00:00 2001 From: Luis Ramos Date: Fri, 16 Oct 2020 11:16:49 +0100 Subject: [PATCH] Fix rubocop issue, long module, by extracting StripeStubs to a separate helper module --- .rubocop_manual_todo.yml | 1 - .../payments_controller_refunds_spec.rb | 1 + spec/features/admin/payments_stripe_spec.rb | 1 + .../consumer/shopping/checkout_stripe_spec.rb | 1 + spec/support/request/stripe_helper.rb | 104 ----------------- spec/support/request/stripe_stubs.rb | 107 ++++++++++++++++++ 6 files changed, 110 insertions(+), 105 deletions(-) create mode 100644 spec/support/request/stripe_stubs.rb diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml index 5c55f6ef9e..3e32bf9faf 100644 --- a/.rubocop_manual_todo.yml +++ b/.rubocop_manual_todo.yml @@ -848,7 +848,6 @@ Metrics/ModuleLength: - spec/models/spree/variant_spec.rb - spec/services/permissions/order_spec.rb - spec/services/variant_units/option_value_namer_spec.rb - - spec/support/request/stripe_helper.rb Metrics/ParameterLists: Max: 5 diff --git a/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb b/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb index 1b97a6fcd2..24decb1b9b 100644 --- a/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb +++ b/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb @@ -5,6 +5,7 @@ require 'spree/core/gateway_error' describe Spree::Admin::PaymentsController, type: :controller do include StripeHelper + include StripeStubs let!(:shop) { create(:enterprise) } let!(:user) { shop.owner } diff --git a/spec/features/admin/payments_stripe_spec.rb b/spec/features/admin/payments_stripe_spec.rb index b296d0fc32..1a3d6047bf 100644 --- a/spec/features/admin/payments_stripe_spec.rb +++ b/spec/features/admin/payments_stripe_spec.rb @@ -8,6 +8,7 @@ feature ' ' do include AuthenticationHelper include StripeHelper + include StripeStubs let!(:order) { create(:completed_order_with_fees) } let!(:stripe_payment_method) do diff --git a/spec/features/consumer/shopping/checkout_stripe_spec.rb b/spec/features/consumer/shopping/checkout_stripe_spec.rb index 528a8d9e81..cf7800225e 100644 --- a/spec/features/consumer/shopping/checkout_stripe_spec.rb +++ b/spec/features/consumer/shopping/checkout_stripe_spec.rb @@ -7,6 +7,7 @@ feature "Check out with Stripe", js: true do include ShopWorkflow include CheckoutHelper include StripeHelper + include StripeStubs let(:distributor) { create(:distributor_enterprise) } let!(:order_cycle) { create(:simple_order_cycle, distributors: [distributor], variants: [variant]) } diff --git a/spec/support/request/stripe_helper.rb b/spec/support/request/stripe_helper.rb index a3e9475e80..ef552a0586 100644 --- a/spec/support/request/stripe_helper.rb +++ b/spec/support/request/stripe_helper.rb @@ -34,108 +34,4 @@ module StripeHelper allow(Stripe).to receive(:publishable_key) { "pk_test_12345" } Spree::Config.set(stripe_connect_enabled: true) end - - def stub_payment_intents_post_request(order:, response: {}, stripe_account_header: true) - stub = stub_request(:post, "https://api.stripe.com/v1/payment_intents") - .with(basic_auth: ["sk_test_12345", ""], body: /.*#{order.number}/) - stub = stub.with(headers: { 'Stripe-Account' => 'abc123' }) if stripe_account_header - stub.to_return(payment_intent_authorize_response_mock(response)) - end - - def stub_payment_intents_post_request_with_redirect(order:, redirect_url:) - stub_request(:post, "https://api.stripe.com/v1/payment_intents") - .with(basic_auth: ["sk_test_12345", ""], body: /.*#{order.number}/) - .to_return(payment_intent_redirect_response_mock(redirect_url)) - end - - def stub_payment_intent_get_request(response: {}, stripe_account_header: true) - stub = stub_request(:get, "https://api.stripe.com/v1/payment_intents/pi_123") - stub = stub.with(headers: { 'Stripe-Account' => 'abc123' }) if stripe_account_header - stub.to_return(payment_intent_authorize_response_mock(response)) - end - - def stub_payment_methods_post_request(request: { payment_method: "pm_123" }, response: {}) - stub_request(:post, "https://api.stripe.com/v1/payment_methods") - .with(body: request, - headers: { 'Stripe-Account' => 'abc123' }) - .to_return(hub_payment_method_response_mock(response)) - end - - # Attaches the payment method to the customer in the hub's stripe account - def stub_payment_method_attach_request - stub_request(:post, - "https://api.stripe.com/v1/payment_methods/pm_123/attach") - .with(body: { customer: "cus_A123" }) - .to_return(hub_payment_method_response_mock({ pm_id: "pm_123" })) - end - - def stub_successful_capture_request(order:, response: {}) - stub_capture_request(order, payment_successful_capture_mock(response)) - end - - def stub_failed_capture_request(order:, response: {}) - stub_capture_request(order, payment_failed_capture_mock(response)) - end - - def stub_capture_request(order, response_mock) - stub_request(:post, "https://api.stripe.com/v1/payment_intents/pi_123/capture") - .with(body: { amount_to_capture: Spree::Money.new(order.total).cents }, - headers: { 'Stripe-Account' => 'abc123' }) - .to_return(response_mock) - end - - def stub_refund_request - stub_request(:post, "https://api.stripe.com/v1/charges/ch_1234/refunds") - .with(body: { amount: 2000, expand: ["charge"] }, - headers: { 'Stripe-Account' => 'abc123' }) - .to_return(payment_successful_refund_mock) - end - - private - - def payment_intent_authorize_response_mock(options) - { status: options[:code] || 200, - body: JSON.generate(id: "pi_123", - object: "payment_intent", - amount: 2000, - amount_received: 2000, - status: options[:intent_status] || "requires_capture", - last_payment_error: nil, - charges: { data: [{ id: "ch_1234", amount: 2000 }] }) } - end - - def payment_intent_redirect_response_mock(redirect_url) - { status: 200, body: JSON.generate(id: "pi_123", - object: "payment_intent", - next_source_action: { - type: "authorize_with_url", - authorize_with_url: { url: redirect_url } - }, - status: "requires_source_action") } - end - - def payment_successful_capture_mock(options) - { status: options[:code] || 200, - body: JSON.generate(object: "payment_intent", - amount: 2000, - charges: { data: [{ id: "ch_1234", amount: 2000 }] }) } - end - - def payment_failed_capture_mock(options) - { status: options[:code] || 402, - body: JSON.generate(error: { message: - options[:message] || "payment-method-failure" }) } - end - - def hub_payment_method_response_mock(options) - { status: options[:code] || 200, - body: JSON.generate(id: options[:pm_id] || "pm_456", customer: "cus_A123") } - end - - def payment_successful_refund_mock - { status: 200, - body: JSON.generate(object: "refund", - amount: 2000, - charge: "ch_1234") } - end end diff --git a/spec/support/request/stripe_stubs.rb b/spec/support/request/stripe_stubs.rb new file mode 100644 index 0000000000..af441577cd --- /dev/null +++ b/spec/support/request/stripe_stubs.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +module StripeStubs + def stub_payment_intents_post_request(order:, response: {}, stripe_account_header: true) + stub = stub_request(:post, "https://api.stripe.com/v1/payment_intents") + .with(basic_auth: ["sk_test_12345", ""], body: /.*#{order.number}/) + stub = stub.with(headers: { 'Stripe-Account' => 'abc123' }) if stripe_account_header + stub.to_return(payment_intent_authorize_response_mock(response)) + end + + def stub_payment_intents_post_request_with_redirect(order:, redirect_url:) + stub_request(:post, "https://api.stripe.com/v1/payment_intents") + .with(basic_auth: ["sk_test_12345", ""], body: /.*#{order.number}/) + .to_return(payment_intent_redirect_response_mock(redirect_url)) + end + + def stub_payment_intent_get_request(response: {}, stripe_account_header: true) + stub = stub_request(:get, "https://api.stripe.com/v1/payment_intents/pi_123") + stub = stub.with(headers: { 'Stripe-Account' => 'abc123' }) if stripe_account_header + stub.to_return(payment_intent_authorize_response_mock(response)) + end + + def stub_payment_methods_post_request(request: { payment_method: "pm_123" }, response: {}) + stub_request(:post, "https://api.stripe.com/v1/payment_methods") + .with(body: request, + headers: { 'Stripe-Account' => 'abc123' }) + .to_return(hub_payment_method_response_mock(response)) + end + + # Attaches the payment method to the customer in the hub's stripe account + def stub_payment_method_attach_request + stub_request(:post, + "https://api.stripe.com/v1/payment_methods/pm_123/attach") + .with(body: { customer: "cus_A123" }) + .to_return(hub_payment_method_response_mock({ pm_id: "pm_123" })) + end + + def stub_successful_capture_request(order:, response: {}) + stub_capture_request(order, payment_successful_capture_mock(response)) + end + + def stub_failed_capture_request(order:, response: {}) + stub_capture_request(order, payment_failed_capture_mock(response)) + end + + def stub_capture_request(order, response_mock) + stub_request(:post, "https://api.stripe.com/v1/payment_intents/pi_123/capture") + .with(body: { amount_to_capture: Spree::Money.new(order.total).cents }, + headers: { 'Stripe-Account' => 'abc123' }) + .to_return(response_mock) + end + + def stub_refund_request + stub_request(:post, "https://api.stripe.com/v1/charges/ch_1234/refunds") + .with(body: { amount: 2000, expand: ["charge"] }, + headers: { 'Stripe-Account' => 'abc123' }) + .to_return(payment_successful_refund_mock) + end + + private + + def payment_intent_authorize_response_mock(options) + { status: options[:code] || 200, + body: JSON.generate(id: "pi_123", + object: "payment_intent", + amount: 2000, + amount_received: 2000, + status: options[:intent_status] || "requires_capture", + last_payment_error: nil, + charges: { data: [{ id: "ch_1234", amount: 2000 }] }) } + end + + def payment_intent_redirect_response_mock(redirect_url) + { status: 200, body: JSON.generate(id: "pi_123", + object: "payment_intent", + next_source_action: { + type: "authorize_with_url", + authorize_with_url: { url: redirect_url } + }, + status: "requires_source_action") } + end + + def payment_successful_capture_mock(options) + { status: options[:code] || 200, + body: JSON.generate(object: "payment_intent", + amount: 2000, + charges: { data: [{ id: "ch_1234", amount: 2000 }] }) } + end + + def payment_failed_capture_mock(options) + { status: options[:code] || 402, + body: JSON.generate(error: { message: + options[:message] || "payment-method-failure" }) } + end + + def hub_payment_method_response_mock(options) + { status: options[:code] || 200, + body: JSON.generate(id: options[:pm_id] || "pm_456", customer: "cus_A123") } + end + + def payment_successful_refund_mock + { status: 200, + body: JSON.generate(object: "refund", + amount: 2000, + charge: "ch_1234") } + end +end