mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 13:19:39 +02:00
Basic Plaid Integration (#1433)
* Basic plaid data model and linking * Remove institutions, add plaid items * Improve schema and Plaid provider * Add webhook verification sketch * Webhook verification * Item accounts and balances sync setup * Provide test encryption keys * Fix test * Only provide encryption keys in prod * Try defining keys in test env * Consolidate account sync logic * Add back plaid account initialization * Plaid transaction sync * Sync UI overhaul for Plaid * Add liability and investment syncing * Handle investment webhooks and process current day holdings * Remove logs * Remove "all" period select for performance * fix amount calc * Remove todo comment * Coming soon for investment historical data * Document Plaid configuration * Listen for holding updates
This commit is contained in:
parent
3bc9da4105
commit
cbba2ba675
127 changed files with 1537 additions and 841 deletions
|
@ -19,7 +19,7 @@ class Account::EntriesControllerTest < ActionDispatch::IntegrationTest
|
|||
end
|
||||
|
||||
assert_redirected_to account_url(entry.account)
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -51,7 +51,7 @@ class Account::EntriesControllerTest < ActionDispatch::IntegrationTest
|
|||
end
|
||||
|
||||
assert_redirected_to account_entry_url(entry.account, entry)
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ class Account::TradesControllerTest < ActionDispatch::IntegrationTest
|
|||
assert created_entry.amount.positive?
|
||||
assert created_entry.account_trade.qty.positive?
|
||||
assert_equal "Transaction created successfully.", flash[:notice]
|
||||
assert_enqueued_with job: AccountSyncJob
|
||||
assert_enqueued_with job: SyncJob
|
||||
assert_redirected_to @entry.account
|
||||
end
|
||||
|
||||
|
@ -132,7 +132,7 @@ class Account::TradesControllerTest < ActionDispatch::IntegrationTest
|
|||
assert created_entry.amount.negative?
|
||||
assert created_entry.account_trade.qty.negative?
|
||||
assert_equal "Transaction created successfully.", flash[:notice]
|
||||
assert_enqueued_with job: AccountSyncJob
|
||||
assert_enqueued_with job: SyncJob
|
||||
assert_redirected_to @entry.account
|
||||
end
|
||||
end
|
||||
|
|
|
@ -35,6 +35,6 @@ class Account::TransactionsControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_equal "Transaction updated successfully.", flash[:notice]
|
||||
assert_redirected_to account_entry_url(@entry.account, @entry)
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -21,7 +21,7 @@ class Account::TransfersControllerTest < ActionDispatch::IntegrationTest
|
|||
name: "Test Transfer"
|
||||
}
|
||||
}
|
||||
assert_enqueued_with job: AccountSyncJob
|
||||
assert_enqueued_with job: SyncJob
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ class Account::ValuationsControllerTest < ActionDispatch::IntegrationTest
|
|||
end
|
||||
|
||||
assert_equal "Valuation created successfully.", flash[:notice]
|
||||
assert_enqueued_with job: AccountSyncJob
|
||||
assert_enqueued_with job: SyncJob
|
||||
assert_redirected_to account_valuations_path(@entry.account)
|
||||
end
|
||||
|
||||
|
|
|
@ -10,9 +10,13 @@ class AccountsControllerTest < ActionDispatch::IntegrationTest
|
|||
get accounts_url
|
||||
assert_response :success
|
||||
|
||||
@user.family.accounts.each do |account|
|
||||
@user.family.accounts.manual.each do |account|
|
||||
assert_dom "#" + dom_id(account), count: 1
|
||||
end
|
||||
|
||||
@user.family.plaid_items.each do |item|
|
||||
assert_dom "#" + dom_id(item), count: 1
|
||||
end
|
||||
end
|
||||
|
||||
test "new" do
|
||||
|
@ -22,12 +26,11 @@ class AccountsControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
test "can sync an account" do
|
||||
post sync_account_path(@account)
|
||||
assert_response :no_content
|
||||
assert_redirected_to account_path(@account)
|
||||
end
|
||||
|
||||
test "can sync all accounts" do
|
||||
post sync_all_accounts_path
|
||||
assert_redirected_to accounts_url
|
||||
assert_equal "Successfully queued accounts for syncing.", flash[:notice]
|
||||
assert_redirected_to accounts_path
|
||||
end
|
||||
end
|
||||
|
|
|
@ -43,7 +43,7 @@ class CreditCardsControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to created_account
|
||||
assert_equal "Credit card account created", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
|
||||
test "updates with credit card details" do
|
||||
|
@ -78,6 +78,6 @@ class CreditCardsControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to @account
|
||||
assert_equal "Credit card account updated", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,62 +0,0 @@
|
|||
require "test_helper"
|
||||
|
||||
class InstitutionsControllerTest < ActionDispatch::IntegrationTest
|
||||
setup do
|
||||
sign_in users(:family_admin)
|
||||
@institution = institutions(:chase)
|
||||
end
|
||||
|
||||
test "should get new" do
|
||||
get new_institution_url
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
test "can create institution" do
|
||||
assert_difference("Institution.count", 1) do
|
||||
post institutions_url, params: {
|
||||
institution: {
|
||||
name: "New institution"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
assert_redirected_to accounts_url
|
||||
assert_equal "Institution created", flash[:notice]
|
||||
end
|
||||
|
||||
test "should get edit" do
|
||||
get edit_institution_url(@institution)
|
||||
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
test "should update institution" do
|
||||
patch institution_url(@institution), params: {
|
||||
institution: {
|
||||
name: "New Institution Name",
|
||||
logo: file_fixture_upload("square-placeholder.png", "image/png", :binary)
|
||||
}
|
||||
}
|
||||
|
||||
assert_redirected_to accounts_url
|
||||
assert_equal "Institution updated", flash[:notice]
|
||||
end
|
||||
|
||||
test "can destroy institution without destroying accounts" do
|
||||
assert @institution.accounts.count > 0
|
||||
|
||||
assert_difference -> { Institution.count } => -1, -> { Account.count } => 0 do
|
||||
delete institution_url(@institution)
|
||||
end
|
||||
|
||||
assert_redirected_to accounts_url
|
||||
assert_equal "Institution deleted", flash[:notice]
|
||||
end
|
||||
|
||||
test "can sync institution" do
|
||||
post sync_institution_url(@institution)
|
||||
|
||||
assert_redirected_to accounts_url
|
||||
assert_equal "Institution sync started", flash[:notice]
|
||||
end
|
||||
end
|
|
@ -13,7 +13,7 @@ class Issue::ExchangeRateProviderMissingsControllerTest < ActionDispatch::Integr
|
|||
}
|
||||
}
|
||||
|
||||
assert_enqueued_with job: AccountSyncJob
|
||||
assert_enqueued_with job: SyncJob
|
||||
assert_redirected_to @issue.issuable
|
||||
end
|
||||
end
|
||||
|
|
|
@ -39,7 +39,7 @@ class LoansControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to created_account
|
||||
assert_equal "Loan account created", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
|
||||
test "updates with loan details" do
|
||||
|
@ -70,6 +70,6 @@ class LoansControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to @account
|
||||
assert_equal "Loan account updated", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
|
49
test/controllers/plaid_items_controller_test.rb
Normal file
49
test/controllers/plaid_items_controller_test.rb
Normal file
|
@ -0,0 +1,49 @@
|
|||
require "test_helper"
|
||||
require "ostruct"
|
||||
|
||||
class PlaidItemsControllerTest < ActionDispatch::IntegrationTest
|
||||
setup do
|
||||
sign_in @user = users(:family_admin)
|
||||
|
||||
@plaid_provider = mock
|
||||
|
||||
PlaidItem.stubs(:plaid_provider).returns(@plaid_provider)
|
||||
end
|
||||
|
||||
test "create" do
|
||||
public_token = "public-sandbox-1234"
|
||||
|
||||
@plaid_provider.expects(:exchange_public_token).with(public_token).returns(
|
||||
OpenStruct.new(access_token: "access-sandbox-1234", item_id: "item-sandbox-1234")
|
||||
)
|
||||
|
||||
assert_difference "PlaidItem.count", 1 do
|
||||
post plaid_items_url, params: {
|
||||
plaid_item: {
|
||||
public_token: public_token,
|
||||
metadata: { institution: { name: "Plaid Item Name" } }
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
assert_equal "Account linked successfully. Please wait for accounts to sync.", flash[:notice]
|
||||
assert_redirected_to accounts_path
|
||||
end
|
||||
|
||||
test "destroy" do
|
||||
delete plaid_item_url(plaid_items(:one))
|
||||
|
||||
assert_equal "Accounts scheduled for deletion.", flash[:notice]
|
||||
assert_enqueued_with job: DestroyJob
|
||||
assert_redirected_to accounts_path
|
||||
end
|
||||
|
||||
test "sync" do
|
||||
plaid_item = plaid_items(:one)
|
||||
PlaidItem.any_instance.expects(:sync_later).once
|
||||
|
||||
post sync_plaid_item_url(plaid_item)
|
||||
|
||||
assert_redirected_to accounts_path
|
||||
end
|
||||
end
|
|
@ -43,7 +43,7 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to created_account
|
||||
assert_equal "Property account created", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
|
||||
test "updates with property details" do
|
||||
|
@ -74,6 +74,6 @@ class PropertiesControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to @account
|
||||
assert_equal "Property account updated", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -37,7 +37,7 @@ class TransactionsControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_equal entry_params[:amount].to_d, Account::Transaction.order(created_at: :desc).first.entry.amount
|
||||
assert_equal "New transaction created successfully", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
assert_redirected_to account_url(account)
|
||||
end
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class VehiclesControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to created_account
|
||||
assert_equal "Vehicle account created", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
|
||||
test "updates with vehicle details" do
|
||||
|
@ -66,6 +66,6 @@ class VehiclesControllerTest < ActionDispatch::IntegrationTest
|
|||
|
||||
assert_redirected_to @account
|
||||
assert_equal "Vehicle account updated", flash[:notice]
|
||||
assert_enqueued_with(job: AccountSyncJob)
|
||||
assert_enqueued_with(job: SyncJob)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue