Merge pull request #8549 from mkllnk/deprecate-stripe-connect

Hide old "Stripe" (StripeConnect) payment method type, keep new Stripe SCA
This commit is contained in:
Filipe
2021-12-23 21:33:42 +00:00
committed by GitHub
17 changed files with 114 additions and 149 deletions

View File

@@ -101,12 +101,7 @@ module Spree
end
def load_data
@providers = if Rails.env.dev? || Rails.env.test?
Gateway.providers.sort_by(&:name)
else
Gateway.providers.reject{ |p| p.name.include? "Bogus" }.sort_by(&:name)
end
@providers.reject!{ |provider| stripe_provider?(provider) } unless show_stripe?
@providers = load_providers
@calculators = PaymentMethod.calculators.sort_by(&:name)
end
@@ -126,6 +121,26 @@ module Spree
# rubocop:enable Style/TernaryParentheses
end
def load_providers
providers = Gateway.providers.sort_by(&:name)
unless Rails.env.development? || Rails.env.test?
providers.reject! { |provider| provider.name.include? "Bogus" }
end
unless show_stripe?
providers.reject! { |provider| stripe_provider?(provider) }
end
# This method is deprecated and will be removed soon:
unless @payment_method&.type == "Spree::Gateway::StripeConnect" ||
OpenFoodNetwork::FeatureToggle.enabled?("StripeConnect")
providers.reject! { |provider| provider.name.ends_with?("StripeConnect") }
end
providers
end
# Show Stripe as an option if enabled, or if the
# current payment_method is already a Stripe method
def show_stripe?

View File

@@ -4,7 +4,6 @@ class Subscription < ApplicationRecord
include SetUnusedAddressFields
ALLOWED_PAYMENT_METHOD_TYPES = ["Spree::PaymentMethod::Check",
"Spree::Gateway::StripeConnect",
"Spree::Gateway::StripeSCA"].freeze
searchable_attributes :shop_id, :canceled_at, :paused_at

View File

@@ -34,7 +34,7 @@ module OrderManagement
end
context "when the payment method is a stripe payment method" do
let(:payment_method) { create(:stripe_connect_payment_method) }
let(:payment_method) { create(:stripe_sca_payment_method) }
context "and the card is already set (the payment source is a credit card)" do
it "returns the pending payment with no change" do

View File

@@ -360,9 +360,9 @@ module OrderManagement
end
end
context "when using the StripeConnect payment gateway" do
context "when using the StripeSCA payment gateway" do
let(:payment_method) {
instance_double(Spree::PaymentMethod, type: "Spree::Gateway::StripeConnect")
instance_double(Spree::PaymentMethod, type: "Spree::Gateway::StripeSCA")
}
before { expect(subscription).to receive(:customer).at_least(:once) { customer } }

View File

@@ -5,12 +5,12 @@ module OpenFoodNetwork
def filter!(payment_methods)
if stripe_enabled?
payment_methods.to_a.reject! do |payment_method|
payment_method.type.ends_with?("StripeConnect") &&
payment_method.type.ends_with?("StripeSCA") &&
stripe_configuration_incomplete?(payment_method)
end
else
payment_methods.to_a.reject! do |payment_method|
payment_method.type.ends_with?("StripeConnect")
payment_method.type.ends_with?("StripeSCA")
end
end
end

View File

@@ -753,7 +753,7 @@ describe Admin::SubscriptionsController, type: :controller do
end
context "when other payment methods exist" do
let!(:stripe) { create(:stripe_connect_payment_method, distributors: [shop]) }
let!(:stripe) { create(:stripe_sca_payment_method, distributors: [shop]) }
let!(:paypal) {
Spree::Gateway::PayPalExpress.create!(name: "PayPalExpress", distributor_ids: [shop.id])
}

View File

@@ -44,22 +44,6 @@ describe Spree::Admin::PaymentsController, type: :controller do
end
end
context "with Stripe payment where payment.process! errors out" do
let!(:payment_method) { create(:stripe_connect_payment_method, distributors: [shop]) }
before do
allow_any_instance_of(Spree::Payment).
to receive(:process_offline!).
and_raise(Spree::Core::GatewayError.new("Payment Gateway Error"))
end
it "redirects to new payment page with flash error" do
spree_post :create, payment: params, order_id: order.number
redirects_to_new_payment_page_with_flash_error("Payment Gateway Error")
expect(order.reload.payments.last.state).to eq "checkout"
end
end
context "with StripeSCA payment" do
let!(:payment_method) { create(:stripe_sca_payment_method, distributors: [shop]) }

View File

@@ -8,6 +8,59 @@ module Spree
end
describe Admin::PaymentMethodsController, type: :controller do
let(:user) {
create(:user, enterprises: [create(:distributor_enterprise)])
}
describe "#new" do
before { allow(controller).to receive(:spree_current_user) { user } }
it "allows to select from a range of payment gateways" do
spree_get :new
providers = assigns(:providers).map(&:to_s)
expect(providers).to eq %w[
Spree::Gateway::Bogus
Spree::Gateway::BogusSimple
Spree::Gateway::PayPalExpress
Spree::PaymentMethod::Check
]
end
it "allows to select StripeSCA when configured" do
allow(Spree::Config).to receive(:stripe_connect_enabled).and_return(true)
spree_get :new
providers = assigns(:providers).map(&:to_s)
expect(providers).to include "Spree::Gateway::StripeSCA"
expect(providers).to_not include "Spree::Gateway::StripeConnect"
end
end
describe "#edit" do
let(:deprecated_stripe) {
create(
:stripe_connect_payment_method,
distributor_ids: [enterprise_id],
preferred_enterprise_id: enterprise_id
)
}
let(:enterprise_id) { user.enterprise_ids.first }
before { allow(controller).to receive(:spree_current_user) { user } }
it "shows the current gateway type even if deprecated" do
allow(Spree::Config).to receive(:stripe_connect_enabled).and_return(true)
spree_get :edit, id: deprecated_stripe.id
providers = assigns(:providers).map(&:to_s)
expect(providers).to include "Spree::Gateway::StripeSCA"
expect(providers).to include "Spree::Gateway::StripeConnect"
end
end
describe "#create and #update" do
let!(:enterprise) { create(:distributor_enterprise, owner: user) }
let(:payment_method) {
@@ -108,13 +161,16 @@ module Spree
end
end
context "on a StripeConnect payment method" do
context "on a StripeSCA payment method" do
let!(:user) { create(:user, enterprise_limit: 2) }
let!(:enterprise1) { create(:distributor_enterprise, owner: user) }
let!(:enterprise2) { create(:distributor_enterprise, owner: create(:user)) }
let!(:payment_method) {
create(:stripe_connect_payment_method, distributor_ids: [enterprise1.id, enterprise2.id],
preferred_enterprise_id: enterprise2.id)
create(
:stripe_sca_payment_method,
distributor_ids: [enterprise1.id, enterprise2.id],
preferred_enterprise_id: enterprise2.id
)
}
before { allow(controller).to receive(:spree_current_user) { user } }
@@ -124,7 +180,7 @@ module Spree
{
id: payment_method.id,
payment_method: {
type: "Spree::Gateway::StripeConnect",
type: "Spree::Gateway::StripeSCA",
preferred_enterprise_id: enterprise1.id
}
}

View File

@@ -262,14 +262,14 @@ describe EnterprisesHelper, type: :helper do
end
end
context "when StripeConnect payment methods are present" do
context "when Stripe payment methods are present" do
let!(:pm3) {
create(:stripe_connect_payment_method, distributors: [distributor],
preferred_enterprise_id: distributor.id)
create(:stripe_sca_payment_method, distributors: [distributor],
preferred_enterprise_id: distributor.id)
}
let!(:pm4) {
create(:stripe_connect_payment_method, distributors: [distributor],
preferred_enterprise_id: some_other_distributor.id)
create(:stripe_sca_payment_method, distributors: [distributor],
preferred_enterprise_id: some_other_distributor.id)
}
let(:available_payment_methods) { helper.available_payment_methods }

View File

@@ -190,23 +190,6 @@ describe SubscriptionConfirmJob do
job.send(:confirm_order!, order)
end
end
context "Stripe Connect" do
let(:stripe_connect_payment_method) { create(:stripe_connect_payment_method) }
let(:stripe_connect_payment) {
create(:payment, amount: 10, payment_method: stripe_connect_payment_method)
}
before do
allow(order).to receive(:pending_payments) { [stripe_connect_payment] }
allow(stripe_connect_payment_method).to receive(:purchase) { true }
end
it "runs the charges in offline mode" do
job.send(:confirm_order!, order)
expect(stripe_connect_payment_method).to have_received(:purchase)
end
end
end
context "when payments need to be processed" do

View File

@@ -4,41 +4,28 @@ require 'spec_helper'
module Stripe
describe ProfileStorer do
include StripeStubs
describe "create_customer_from_token" do
let(:payment) { create(:payment) }
let(:stripe_payment_method) { create(:stripe_connect_payment_method) }
let(:stripe_payment_method) { create(:stripe_sca_payment_method) }
let(:card) { create(:credit_card, gateway_payment_profile_id: card_id) }
let(:payment) { create(:payment, source: card, payment_method: stripe_payment_method) }
let(:profile_storer) { Stripe::ProfileStorer.new(payment, stripe_payment_method.provider) }
let(:customer_id) { "cus_A123" }
let(:card_id) { "card_2342" }
let(:customer_response_mock) { { status: 200, body: customer_response_body } }
let(:customer_response_mock) {
{ status: 200, body: JSON.generate(id: customer_id, sources: { data: [{ id: "1" }] }) }
}
before do
Stripe.api_key = "sk_test_12345"
stub_request(:post, "https://api.stripe.com/v1/customers")
.with(basic_auth: ["sk_test_12345", ""], body: { email: payment.order.email })
.to_return(customer_response_mock)
end
context "when called from Stripe Connect" do
let(:customer_response_body) {
JSON.generate(id: customer_id, default_card: card_id, sources: { data: [{ id: "1" }] })
}
it "fetches the customer id and the card id from the correct response fields" do
profile_storer.create_customer_from_token
expect(payment.source.gateway_customer_profile_id).to eq customer_id
expect(payment.source.gateway_payment_profile_id).to eq card_id
end
stub_customers_post_request(email: payment.order.email, response: customer_response_mock)
stub_payment_method_attach_request(payment_method: card_id, customer: customer_id)
end
context "when called from Stripe SCA" do
let(:customer_response_body) {
JSON.generate(customer: customer_id, id: card_id, sources: { data: [{ id: "1" }] })
}
it "fetches the customer id and the card id from the correct response fields" do
profile_storer.create_customer_from_token

View File

@@ -45,9 +45,9 @@ module Spree
it_behaves_like "taggable", "Spree::PaymentMethod"
end
describe Gateway::StripeConnect do
describe Gateway::StripeSCA do
subject do
# StripeConnect needs an owner to be valid.
# StripeSCA needs an owner to be valid.
valid_subject.tap { |m| m.preferred_enterprise_id = shop.id }
end

View File

@@ -1213,7 +1213,7 @@ describe Spree::Order do
let!(:enterprise) { create(:enterprise) }
let!(:order) { create(:order, distributor: enterprise) }
let!(:payment_method) {
create(:stripe_connect_payment_method, distributor_ids: [enterprise.id])
create(:stripe_sca_payment_method, distributor_ids: [enterprise.id])
}
let!(:payment) { create(:payment, order: order, payment_method: payment_method) }

View File

@@ -920,8 +920,8 @@ describe Spree::Payment do
context "to Stripe payments" do
let(:shop) { create(:enterprise) }
let(:payment_method) {
create(:stripe_connect_payment_method, distributor_ids: [create(:distributor_enterprise).id],
preferred_enterprise_id: shop.id)
create(:stripe_sca_payment_method, distributor_ids: [create(:distributor_enterprise).id],
preferred_enterprise_id: shop.id)
}
let(:payment) {
create(:payment, order: order, payment_method: payment_method, amount: order.total)

View File

@@ -28,11 +28,11 @@ module StripeStubs
end
# Attaches the payment method to the customer in the hub's stripe account
def stub_payment_method_attach_request
def stub_payment_method_attach_request(payment_method: "pm_123", customer: "cus_A123")
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" }))
"https://api.stripe.com/v1/payment_methods/#{payment_method}/attach")
.with(body: { customer: customer })
.to_return(hub_payment_method_response_mock({ pm_id: payment_method }))
end
def stub_retrieve_payment_method_request(payment_method_id = "pm_1234")

View File

@@ -220,7 +220,7 @@ describe 'Subscriptions' do
}
let!(:schedule) { create(:schedule, order_cycles: [order_cycle]) }
let!(:payment_method) {
create(:stripe_connect_payment_method, name: 'Credit Card', distributors: [shop])
create(:stripe_sca_payment_method, name: 'Credit Card', distributors: [shop])
}
let!(:shipping_method) { create(:shipping_method, distributors: [shop]) }
@@ -387,7 +387,7 @@ describe 'Subscriptions' do
}
let!(:payment_method) { create(:payment_method, distributors: [shop]) }
let!(:stripe_payment_method) {
create(:stripe_connect_payment_method, name: 'Credit Card', distributors: [shop])
create(:stripe_sca_payment_method, name: 'Credit Card', distributors: [shop])
}
let!(:shipping_method) { create(:shipping_method, distributors: [shop]) }
let!(:subscription) {
@@ -536,7 +536,7 @@ describe 'Subscriptions' do
let!(:enterprise_fee) { create(:enterprise_fee, amount: 1.75) }
let!(:order_cycle) { create(:simple_order_cycle, coordinator: shop) }
let!(:schedule) { create(:schedule, order_cycles: [order_cycle]) }
let!(:payment_method) { create(:stripe_connect_payment_method, distributors: [shop]) }
let!(:payment_method) { create(:stripe_sca_payment_method, distributors: [shop]) }
let!(:shipping_method) { create(:shipping_method, distributors: [shop]) }
before do

View File

@@ -37,65 +37,6 @@ describe "Check out with Stripe", js: true do
distributor.shipping_methods << [shipping_with_fee, free_shipping]
end
context 'login in as user' do
let(:user) { create(:user) }
before do
login_as(user)
end
context "with Stripe Connect" do
let!(:stripe_pm) do
create(:stripe_connect_payment_method, distributors: [distributor])
end
let!(:saved_card) do
create(:credit_card,
user_id: user.id,
month: "01",
year: "2025",
cc_type: "visa",
number: "1111111111111111",
payment_method_id: stripe_pm.id,
gateway_customer_profile_id: "i_am_saved")
end
let!(:stripe_account) {
create(:stripe_account, enterprise_id: distributor.id, stripe_user_id: 'some_id')
}
let(:response_mock) { { id: "ch_1234", object: "charge", amount: 2000 } }
around do |example|
original_stripe_connect_enabled = Spree::Config[:stripe_connect_enabled]
example.run
Spree::Config.set(stripe_connect_enabled: original_stripe_connect_enabled)
end
before do
stub_request(:post, "https://api.stripe.com/v1/charges")
.with(basic_auth: ["sk_test_12345", ""])
.to_return(status: 200, body: JSON.generate(response_mock))
visit checkout_path
fill_out_form(shipping_with_fee.name, stripe_pm.name, save_default_addresses: false)
end
it "allows use of a saved card" do
# shows the saved credit card dropdown
expect(page).to have_content I18n.t("spree.checkout.payment.stripe.used_saved_card")
# default card is selected, form element is not shown
expect(page).to have_no_selector "#card-element.StripeElement"
expect(page).to have_select 'selected_card', selected: "Visa x-1111 Exp:01/2025"
# allows checkout
place_order
expect(page).to have_content "Your order has been processed successfully"
end
end
end
describe "using Stripe SCA" do
let!(:stripe_account) { create(:stripe_account, enterprise: distributor) }
let!(:stripe_sca_payment_method) {