mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-24 15:49:39 +02:00
Add exchange and currency fields to trade imports (#1822)
* Add exchange and currency fields to trade imports * Add exchange_operating_mic support for trade imports - Added required columns and updated models * refactor: remove exchange and currency columns * fix: consolidate import schema and remove redundant columns * feat: Enhance trade import with exchange_operating_mic support * Revert changes to existing migration * Simplify migration to use change method * Restore previously deleted migration * Remove unused import_col_labels method * Update schema.rb after running migrations * Update trade_import.rb and fix schema.rb with db:migrate:reset * fix: improve trade import security creation --------- Signed-off-by: David Anyatonwu <51977119+onyedikachi-david@users.noreply.github.com>
This commit is contained in:
parent
fd95f8d2bd
commit
32ef6ca154
11 changed files with 204 additions and 28 deletions
85
test/models/trade_import_test.rb
Normal file
85
test/models/trade_import_test.rb
Normal file
|
@ -0,0 +1,85 @@
|
|||
require "test_helper"
|
||||
require "ostruct"
|
||||
|
||||
class TradeImportTest < ActiveSupport::TestCase
|
||||
include ActiveJob::TestHelper, ImportInterfaceTest
|
||||
|
||||
setup do
|
||||
@subject = @import = imports(:trade)
|
||||
end
|
||||
|
||||
test "imports trades and accounts" do
|
||||
# Create an existing AAPL security with no exchange_operating_mic
|
||||
aapl = Security.create!(ticker: "AAPL", exchange_operating_mic: nil)
|
||||
|
||||
provider = mock
|
||||
|
||||
# We should only hit the provider for GOOGL since AAPL already exists
|
||||
provider.expects(:search_securities).with(
|
||||
query: "GOOGL",
|
||||
exchange_operating_mic: "XNAS"
|
||||
).returns(
|
||||
OpenStruct.new(
|
||||
securities: [
|
||||
{
|
||||
ticker: "GOOGL",
|
||||
name: "Google Inc.",
|
||||
country_code: "US",
|
||||
exchange_mic: "XNGS",
|
||||
exchange_operating_mic: "XNAS",
|
||||
exchange_acronym: "NGS"
|
||||
}
|
||||
],
|
||||
success?: true,
|
||||
raw_response: nil
|
||||
)
|
||||
).once
|
||||
|
||||
Security.stubs(:security_prices_provider).returns(provider)
|
||||
|
||||
import = <<~CSV
|
||||
date,ticker,qty,price,currency,account,name,exchange_operating_mic
|
||||
01/01/2024,AAPL,10,150.00,USD,TestAccount1,Apple Purchase,
|
||||
01/02/2024,GOOGL,5,2500.00,USD,TestAccount1,Google Purchase,XNAS
|
||||
CSV
|
||||
|
||||
@import.update!(
|
||||
raw_file_str: import,
|
||||
date_col_label: "date",
|
||||
ticker_col_label: "ticker",
|
||||
qty_col_label: "qty",
|
||||
price_col_label: "price",
|
||||
exchange_operating_mic_col_label: "exchange_operating_mic",
|
||||
date_format: "%m/%d/%Y",
|
||||
signage_convention: "inflows_positive"
|
||||
)
|
||||
|
||||
@import.generate_rows_from_csv
|
||||
|
||||
@import.mappings.create! key: "TestAccount1", create_when_empty: true, type: "Import::AccountMapping"
|
||||
|
||||
@import.reload
|
||||
|
||||
assert_difference [
|
||||
-> { Account::Entry.count },
|
||||
-> { Account::Trade.count }
|
||||
], 2 do
|
||||
assert_difference [
|
||||
-> { Security.count },
|
||||
-> { Account.count }
|
||||
], 1 do
|
||||
@import.publish
|
||||
end
|
||||
end
|
||||
|
||||
assert_equal "complete", @import.status
|
||||
|
||||
# Verify the securities were created/updated correctly
|
||||
aapl.reload
|
||||
assert_nil aapl.exchange_operating_mic
|
||||
|
||||
googl = Security.find_by(ticker: "GOOGL")
|
||||
assert_equal "XNAS", googl.exchange_operating_mic
|
||||
assert_equal "XNGS", googl.exchange_mic
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue