mirror of
https://github.com/we-promise/sure.git
synced 2026-04-10 15:54:48 +00:00
* [FEATURE] Add CoinStats exchange portfolios and normalize linked investment charts * [BUGFIX] Fix CoinStats PR regressions * [BUGFIX] Fix CoinStats PR review findings * [BUGFIX] Address follow-up CoinStats PR feedback * [REFACTO] Extract CoinStats exchange account helpers * [BUGFIX] Batch linked CoinStats chart normalization * [BUGFIX] Fix CoinStats processor lint --------- Signed-off-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com>
149 lines
5.2 KiB
Ruby
149 lines
5.2 KiB
Ruby
require "test_helper"
|
|
|
|
class Account::ChartableTest < ActiveSupport::TestCase
|
|
test "generates series and memoizes" do
|
|
account = accounts(:depository)
|
|
|
|
test_series = mock
|
|
builder1 = mock
|
|
builder2 = mock
|
|
|
|
Balance::ChartSeriesBuilder.expects(:new)
|
|
.with(
|
|
account_ids: [ account.id ],
|
|
currency: account.currency,
|
|
period: Period.last_30_days,
|
|
favorable_direction: account.favorable_direction,
|
|
interval: nil
|
|
)
|
|
.returns(builder1)
|
|
.once
|
|
|
|
Balance::ChartSeriesBuilder.expects(:new)
|
|
.with(
|
|
account_ids: [ account.id ],
|
|
currency: account.currency,
|
|
period: Period.last_90_days, # Period changed, so memoization should be invalidated
|
|
favorable_direction: account.favorable_direction,
|
|
interval: nil
|
|
)
|
|
.returns(builder2)
|
|
.once
|
|
|
|
builder1.expects(:balance_series).returns(test_series).twice
|
|
series1 = account.balance_series
|
|
memoized_series1 = account.balance_series
|
|
|
|
builder2.expects(:balance_series).returns(test_series).twice
|
|
builder2.expects(:cash_balance_series).returns(test_series).once
|
|
builder2.expects(:holdings_balance_series).returns(test_series).once
|
|
|
|
series2 = account.balance_series(period: Period.last_90_days)
|
|
memoized_series2 = account.balance_series(period: Period.last_90_days)
|
|
memoized_series2_cash_view = account.balance_series(period: Period.last_90_days, view: :cash_balance)
|
|
memoized_series2_holdings_view = account.balance_series(period: Period.last_90_days, view: :holdings_balance)
|
|
end
|
|
|
|
test "trims placeholder history for linked investment accounts without trades" do
|
|
account = accounts(:investment)
|
|
account.entries.destroy_all
|
|
account.holdings.destroy_all
|
|
|
|
coinstats_item = account.family.coinstats_items.create!(name: "CoinStats", api_key: "test-key")
|
|
coinstats_account = coinstats_item.coinstats_accounts.create!(name: "Provider", currency: "USD")
|
|
account.account_providers.create!(provider: coinstats_account)
|
|
|
|
account.holdings.create!(
|
|
security: securities(:aapl),
|
|
date: 5.days.ago.to_date,
|
|
qty: 1,
|
|
price: 100,
|
|
amount: 100,
|
|
currency: "USD",
|
|
account_provider: account.account_providers.last
|
|
)
|
|
|
|
raw_series = Series.new(
|
|
start_date: 10.days.ago.to_date,
|
|
end_date: Date.current,
|
|
interval: "1 day",
|
|
values: [
|
|
Series::Value.new(date: 10.days.ago.to_date, date_formatted: "", value: Money.new(0, "USD")),
|
|
Series::Value.new(date: 9.days.ago.to_date, date_formatted: "", value: Money.new(0, "USD")),
|
|
Series::Value.new(date: 8.days.ago.to_date, date_formatted: "", value: Money.new(0, "USD")),
|
|
Series::Value.new(date: 5.days.ago.to_date, date_formatted: "", value: Money.new(100, "USD")),
|
|
Series::Value.new(date: Date.current, date_formatted: "", value: Money.new(110, "USD"))
|
|
],
|
|
favorable_direction: account.favorable_direction
|
|
)
|
|
|
|
builder = mock
|
|
Balance::ChartSeriesBuilder.expects(:new).returns(builder)
|
|
builder.expects(:balance_series).returns(raw_series)
|
|
|
|
series = account.balance_series
|
|
|
|
assert_equal 5.days.ago.to_date, series.start_date
|
|
assert_equal [ 5.days.ago.to_date, Date.current ], series.values.map(&:date)
|
|
end
|
|
|
|
test "trims unstable provider snapshot history for linked investment accounts without trades" do
|
|
account = accounts(:investment)
|
|
account.entries.destroy_all
|
|
account.holdings.destroy_all
|
|
|
|
coinstats_item = account.family.coinstats_items.create!(name: "CoinStats", api_key: "test-key")
|
|
coinstats_account = coinstats_item.coinstats_accounts.create!(name: "Provider", currency: "USD")
|
|
account.account_providers.create!(provider: coinstats_account)
|
|
|
|
account.holdings.create!(
|
|
security: securities(:aapl),
|
|
date: 5.days.ago.to_date,
|
|
qty: 1,
|
|
price: 100,
|
|
amount: 100,
|
|
currency: "USD",
|
|
account_provider: account.account_providers.last
|
|
)
|
|
account.holdings.create!(
|
|
security: securities(:aapl),
|
|
date: 4.days.ago.to_date,
|
|
qty: 1,
|
|
price: 100,
|
|
amount: 100,
|
|
currency: "USD",
|
|
account_provider: account.account_providers.last
|
|
)
|
|
account.holdings.create!(
|
|
security: securities(:msft),
|
|
date: Date.current,
|
|
qty: 1,
|
|
price: 120,
|
|
amount: 120,
|
|
currency: "USD",
|
|
account_provider: account.account_providers.last
|
|
)
|
|
|
|
raw_series = Series.new(
|
|
start_date: 5.days.ago.to_date,
|
|
end_date: Date.current,
|
|
interval: "1 day",
|
|
values: [
|
|
Series::Value.new(date: 5.days.ago.to_date, date_formatted: "", value: Money.new(100, "USD")),
|
|
Series::Value.new(date: 4.days.ago.to_date, date_formatted: "", value: Money.new(101, "USD")),
|
|
Series::Value.new(date: Date.current, date_formatted: "", value: Money.new(120, "USD"))
|
|
],
|
|
favorable_direction: account.favorable_direction
|
|
)
|
|
|
|
builder = mock
|
|
Balance::ChartSeriesBuilder.expects(:new).returns(builder)
|
|
builder.expects(:balance_series).returns(raw_series)
|
|
|
|
series = account.balance_series
|
|
|
|
assert_equal Date.current, series.start_date
|
|
assert_equal [ Date.current ], series.values.map(&:date)
|
|
end
|
|
end
|