diff --git a/app/models/provider/stripe.rb b/app/models/provider/stripe.rb index e0786bf83..b7266e065 100644 --- a/app/models/provider/stripe.rb +++ b/app/models/provider/stripe.rb @@ -71,6 +71,10 @@ class Provider::Stripe return nil if payment_link_id.blank? client.v1.payment_links.retrieve(payment_link_id).url + rescue StandardError => e + Sentry.capture_exception(e) + Rails.logger.error "Error fetching payment link #{payment_link_id}: #{e.message}" + nil end private diff --git a/test/controllers/settings/payments_controller_test.rb b/test/controllers/settings/payments_controller_test.rb index fd87e4011..5b00f3de8 100644 --- a/test/controllers/settings/payments_controller_test.rb +++ b/test/controllers/settings/payments_controller_test.rb @@ -27,4 +27,20 @@ class Settings::PaymentsControllerTest < ActionDispatch::IntegrationTest text: I18n.t("views.settings.payments.show.one_time_contribution_link_text") ) end + + test "shows payment settings without contribution link when payment link is unavailable" do + @family.update!(stripe_customer_id: "cus_test123") + stripe = mock + stripe.expects(:payment_link_url).returns(nil) + Provider::Registry.stubs(:get_provider).with(:stripe).returns(stripe) + + get settings_payment_path + assert_response :success + assert_select( + "a", + text: I18n.t("views.settings.payments.show.one_time_contribution_link_text"), + count: 0 + ) + assert_select "p", text: I18n.t("views.settings.payments.show.payment_via_stripe") + end end diff --git a/test/models/provider/stripe_test.rb b/test/models/provider/stripe_test.rb index e4240a9bf..41fd8fa53 100644 --- a/test/models/provider/stripe_test.rb +++ b/test/models/provider/stripe_test.rb @@ -60,4 +60,20 @@ class Provider::StripeTest < ActiveSupport::TestCase stripe.payment_link_url(payment_link_id: "plink_test123") ) end + + test "returns nil when payment link retrieval fails" do + payment_links = mock + payment_links.expects(:retrieve) + .with("plink_test123") + .raises(StandardError, "not found") + + client = mock + client.stubs(:v1).returns(OpenStruct.new(payment_links: payment_links)) + + Stripe::StripeClient.stubs(:new).returns(client) + Sentry.expects(:capture_exception).with(instance_of(StandardError)) + stripe = Provider::Stripe.new(secret_key: "foo", webhook_secret: "bar") + + assert_nil stripe.payment_link_url(payment_link_id: "plink_test123") + end end