From bf4b9a94b59728a31fd47d559d97363151650f13 Mon Sep 17 00:00:00 2001 From: "revise-dev[bot]" <181657630+revise-dev[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 18:49:26 +0000 Subject: [PATCH] Fix: Plaid::ApiError (MAYBE-RAILS-78) --- app/models/provider/plaid.rb | 21 ++++---- test/models/provider/plaid_test.rb | 77 ++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 test/models/provider/plaid_test.rb diff --git a/app/models/provider/plaid.rb b/app/models/provider/plaid.rb index 813102a023d..36a500cfac4 100644 --- a/app/models/provider/plaid.rb +++ b/app/models/provider/plaid.rb @@ -3,6 +3,7 @@ class Provider::Plaid MAYBE_SUPPORTED_PLAID_PRODUCTS = %w[transactions investments liabilities].freeze MAX_HISTORY_DAYS = Rails.env.development? ? 90 : 730 + SUPPORTED_COUNTRY_CODES = %w[US CA GB FR ES IE NL DE IT PL DK NO SE EE LT LV PT BE].freeze class << self def process_webhook(webhook_body) @@ -68,13 +69,16 @@ def initialize @client = self.class.client end - def get_link_token(user_id:, webhooks_url:, redirect_url:, accountable_type: nil, eu: false) + def get_link_token(user_id:, webhooks_url:, redirect_url:, accountable_type: nil, country_code: "US") + country_code = country_code.to_s.upcase + country_code = "US" unless SUPPORTED_COUNTRY_CODES.include?(country_code) + request = Plaid::LinkTokenCreateRequest.new({ - user: { client_user_id: user_id }, + user: { client_user_id: user_id.to_s }, client_name: "Maybe Finance", products: [ get_primary_product(accountable_type) ], additional_consented_products: get_additional_consented_products(accountable_type), - country_codes: get_country_codes(eu), + country_codes: [country_code], language: "en", webhook: webhooks_url, redirect_uri: redirect_url, @@ -82,6 +86,9 @@ def get_link_token(user_id:, webhooks_url:, redirect_url:, accountable_type: nil }) client.link_token_create(request) + rescue Plaid::ApiError => e + Rails.logger.error("Plaid link token creation failed: #{e.message}") + raise end def exchange_public_token(token) @@ -198,12 +205,4 @@ def get_primary_product(accountable_type) def get_additional_consented_products(accountable_type) MAYBE_SUPPORTED_PLAID_PRODUCTS - [ get_primary_product(accountable_type) ] end - - def get_country_codes(eu) - if eu - [ "ES", "NL", "FR", "IE", "DE", "IT", "PL", "DK", "NO", "SE", "EE", "LT", "LV", "PT", "BE" ] # EU supported countries - else - [ "US", "CA" ] # US + CA only - end - end end diff --git a/test/models/provider/plaid_test.rb b/test/models/provider/plaid_test.rb new file mode 100644 index 00000000000..9341e3d0936 --- /dev/null +++ b/test/models/provider/plaid_test.rb @@ -0,0 +1,77 @@ +require "test_helper" + +class Provider::PlaidTest < ActiveSupport::TestCase + setup do + @provider = Provider::Plaid.new + end + + test "get_link_token uses supported country code" do + mock_client = mock() + @provider.stubs(:client).returns(mock_client) + + mock_client.expects(:link_token_create).with( + has_entries( + country_codes: ["CA"], + client_name: "Maybe Finance", + language: "en" + ) + ).returns(OpenStruct.new(link_token: "test_token")) + + response = @provider.get_link_token( + user_id: "123", + webhooks_url: "https://example.com/webhook", + redirect_url: "https://example.com/redirect", + country_code: "CA" + ) + + assert_equal "test_token", response.link_token + end + + test "get_link_token defaults to US for unsupported country code" do + mock_client = mock() + @provider.stubs(:client).returns(mock_client) + + mock_client.expects(:link_token_create).with( + has_entries( + country_codes: ["US"] + ) + ).returns(OpenStruct.new(link_token: "test_token")) + + response = @provider.get_link_token( + user_id: "123", + webhooks_url: "https://example.com/webhook", + redirect_url: "https://example.com/redirect", + country_code: "XX" + ) + + assert_equal "test_token", response.link_token + end + + test "get_link_token handles nil country code" do + mock_client = mock() + @provider.stubs(:client).returns(mock_client) + + mock_client.expects(:link_token_create).with( + has_entries( + country_codes: ["US"] + ) + ).returns(OpenStruct.new(link_token: "test_token")) + + response = @provider.get_link_token( + user_id: "123", + webhooks_url: "https://example.com/webhook", + redirect_url: "https://example.com/redirect", + country_code: nil + ) + + assert_equal "test_token", response.link_token + end + + test "get_primary_product returns correct product for accountable type" do + assert_equal "investments", @provider.send(:get_primary_product, "Investment") + assert_equal "liabilities", @provider.send(:get_primary_product, "CreditCard") + assert_equal "liabilities", @provider.send(:get_primary_product, "Loan") + assert_equal "transactions", @provider.send(:get_primary_product, "Depository") + assert_equal "transactions", @provider.send(:get_primary_product, nil) + end +end