mirror of
https://github.com/we-promise/sure.git
synced 2026-05-09 13:45:01 +00:00
* fix(mercury): support named multiple connections * fix(mercury): address multi-connection review feedback * fix(mercury): localize connection labels * fix(mercury): strip API tokens before provider calls * test(mercury): localize provider config assertions * fix(mercury): address multi-connection review * refactor(mercury): simplify connection selection failure
138 lines
5.0 KiB
Ruby
138 lines
5.0 KiB
Ruby
require "uri"
|
|
|
|
require "test_helper"
|
|
|
|
class Provider::MercuryAdapterTest < ActiveSupport::TestCase
|
|
test "supports Depository accounts" do
|
|
assert_includes Provider::MercuryAdapter.supported_account_types, "Depository"
|
|
end
|
|
|
|
test "does not support Investment accounts" do
|
|
assert_not_includes Provider::MercuryAdapter.supported_account_types, "Investment"
|
|
end
|
|
|
|
test "returns fallback connection config when no credentials exist yet" do
|
|
# Mercury is a per-family provider - any family can connect
|
|
family = families(:empty)
|
|
configs = Provider::MercuryAdapter.connection_configs(family: family)
|
|
|
|
assert_equal 1, configs.length
|
|
assert_equal "mercury", configs.first[:key]
|
|
assert_equal I18n.t("mercury_items.provider_connection.default_name"), configs.first[:name]
|
|
assert configs.first[:can_connect]
|
|
end
|
|
|
|
test "returns one connection config per credentialed mercury item" do
|
|
family = families(:dylan_family)
|
|
first_item = mercury_items(:one)
|
|
second_item = MercuryItem.create!(
|
|
family: family,
|
|
name: "Business Mercury",
|
|
token: "second_mercury_token",
|
|
base_url: "https://api.mercury.com/api/v1"
|
|
)
|
|
|
|
configs = Provider::MercuryAdapter.connection_configs(family: family)
|
|
|
|
assert_equal 2, configs.length
|
|
assert_equal [ "mercury_#{second_item.id}", "mercury_#{first_item.id}" ], configs.map { |config| config[:key] }
|
|
assert_equal [
|
|
I18n.t("mercury_items.provider_connection.name", name: second_item.name),
|
|
I18n.t("mercury_items.provider_connection.name", name: first_item.name)
|
|
], configs.map { |config| config[:name] }
|
|
|
|
new_account_uri = URI.parse(configs.first[:new_account_path].call("Depository", "/accounts"))
|
|
assert_equal "/mercury_items/select_accounts", new_account_uri.path
|
|
assert_includes new_account_uri.query, "mercury_item_id=#{second_item.id}"
|
|
|
|
existing_account_uri = URI.parse(configs.first[:existing_account_path].call(accounts(:depository).id))
|
|
assert_equal "/mercury_items/select_existing_account", existing_account_uri.path
|
|
assert_includes existing_account_uri.query, "mercury_item_id=#{second_item.id}"
|
|
end
|
|
|
|
test "connection configs ignore items with whitespace-only tokens" do
|
|
family = families(:dylan_family)
|
|
MercuryItem.create!(
|
|
family: family,
|
|
name: "Blank Mercury",
|
|
token: "temporary_token",
|
|
base_url: "https://api.mercury.com/api/v1"
|
|
).update_column(:token, " ")
|
|
|
|
configs = Provider::MercuryAdapter.connection_configs(family: family)
|
|
|
|
assert_equal [ "mercury_#{mercury_items(:one).id}" ], configs.map { |config| config[:key] }
|
|
end
|
|
|
|
test "build_provider returns nil when family is nil" do
|
|
assert_nil Provider::MercuryAdapter.build_provider(family: nil)
|
|
end
|
|
|
|
test "build_provider returns nil when family has no mercury items" do
|
|
family = families(:empty)
|
|
assert_nil Provider::MercuryAdapter.build_provider(family: family)
|
|
end
|
|
|
|
test "build_provider returns Mercury provider when credentials configured" do
|
|
family = families(:dylan_family)
|
|
provider = Provider::MercuryAdapter.build_provider(family: family)
|
|
|
|
assert_instance_of Provider::Mercury, provider
|
|
end
|
|
|
|
test "build_provider uses explicit mercury item credentials" do
|
|
family = families(:dylan_family)
|
|
second_item = MercuryItem.create!(
|
|
family: family,
|
|
name: "Business Mercury",
|
|
token: "second_mercury_token",
|
|
base_url: "https://api.mercury.com/api/v1"
|
|
)
|
|
|
|
provider = Provider::MercuryAdapter.build_provider(family: family, mercury_item_id: second_item.id)
|
|
|
|
assert_instance_of Provider::Mercury, provider
|
|
assert_equal "second_mercury_token", provider.token
|
|
assert_equal "https://api.mercury.com/api/v1", provider.base_url
|
|
end
|
|
|
|
test "build_provider strips surrounding token whitespace" do
|
|
family = families(:dylan_family)
|
|
second_item = MercuryItem.create!(
|
|
family: family,
|
|
name: "Business Mercury",
|
|
token: " second_mercury_token \n",
|
|
base_url: "https://api.mercury.com/api/v1"
|
|
)
|
|
|
|
provider = Provider::MercuryAdapter.build_provider(family: family, mercury_item_id: second_item.id)
|
|
|
|
assert_equal "second_mercury_token", provider.token
|
|
end
|
|
|
|
test "build_provider refuses mercury items outside the family" do
|
|
family = families(:dylan_family)
|
|
other_item = MercuryItem.create!(
|
|
family: families(:empty),
|
|
name: "Other Mercury",
|
|
token: "other_mercury_token",
|
|
base_url: "https://api.mercury.com/api/v1"
|
|
)
|
|
|
|
assert_nil Provider::MercuryAdapter.build_provider(family: family, mercury_item_id: other_item.id)
|
|
end
|
|
|
|
test "build_provider refuses explicit mercury item without usable credentials" do
|
|
family = families(:dylan_family)
|
|
blank_item = MercuryItem.create!(
|
|
family: family,
|
|
name: "Blank Mercury",
|
|
token: "temporary_token",
|
|
base_url: "https://api.mercury.com/api/v1"
|
|
)
|
|
blank_item.update_column(:token, " ")
|
|
|
|
assert_nil Provider::MercuryAdapter.build_provider(family: family, mercury_item_id: blank_item.id)
|
|
end
|
|
end
|