mirror of
https://github.com/we-promise/sure.git
synced 2026-08-05 16:42:18 +00:00
* Add support for trading212 integration in investments sync * Respect Trading 212 history rate limits * Replace hex colors with design tokens * Changed withdrawal to withdraw * Address PR review feedback for Trading 212 integration - Replace all Rails.logger calls with DebugLogEntry.capture across syncer, importer, processor, provider, controller, and unlinking - Fix destroy action to surface unlink errors via DebugLogEntry - Replace hardcoded 'GBP' currency fallback with Current.family.currency - Replace hardcoded English status strings in Syncer with i18n - Add config/initializers/trading212.rb with DEBUG_RAW ENV toggle - Add comprehensive test coverage: item, account, data_helpers, holdings_processor, activities_processor, importer, syncer, and controller tests - Rewrite syncer and controller tests to match actual interfaces * Fix tests and bugs found during local test execution - Fix standard_ticker: empty string caused nil.upcase via [].first - Fix parse_date: DateTime < Date, so when Date caught DateTime first - Fix ActivitiesProcessor/HoldingsProcessor: missing instruments_map in DataHelpers caused NameError when processing dividends - Fix test: security fixture ticker collision with test data - Fix test: sync_status_summary i18n matching in assertions - Fix test: trading212_provider ConfigurationError test path - Fix test: controller invalid params needs Turbo-Frame header - Fix test: syncer test uses stubs instead of strict expects 116 tests, 257 assertions, 0 failures, 0 errors * Keep raw provider response bodies out of exception messages. * Fix Secrets leak into page HTML, prevents the API key/secret from appearing in the HTML source while keeping the "leave blank to keep existing" UX. * Address review findings: env gate, sync test, uniqueness test, destroy flow - Gate TRADING212_DEBUG_RAW behind Rails.env.local? so staging/production cannot accidentally enable raw payload logging - Assert SyncJob enqueue in sync controller test, not just redirect - Fix cross-item uniqueness test to actually use two different items - Remove rescue in destroy so unlink failures stop the flow (matching Brex/Akahu pattern) instead of proceeding to destroy_later silently * Add Trading212 tables to db/schema.rb for CI test database CI runs db:test:prepare which loads db/schema.rb, not migrations. Without these table definitions, fixture loading fails with PG::UndefinedTable: relation "trading212_accounts" does not exist. * Removed lint complaint * Register Trading212 in ProviderConnectionStatus::PROVIDERS Fixes CI failure: test_provider_registry_covers_syncable_family_provider_item_associations * Fixed bad merge --------- Signed-off-by: jdcdp <47483528+jdcdp@users.noreply.github.com> Co-authored-by: jdcdp <jdcdp@cdm4.net>
88 lines
2.5 KiB
Ruby
88 lines
2.5 KiB
Ruby
require "test_helper"
|
|
|
|
class Trading212ItemSyncerTest < ActiveSupport::TestCase
|
|
setup do
|
|
@family = families(:dylan_family)
|
|
@item = trading212_items(:configured_item)
|
|
@syncer = Trading212Item::Syncer.new(@item)
|
|
end
|
|
|
|
# === perform_sync (missing credentials) ===
|
|
|
|
test "perform_sync raises ConfigurationError when credentials are missing" do
|
|
@item.update!(api_key: nil, api_secret: nil)
|
|
sync = @item.syncs.create!
|
|
|
|
error = assert_raises(Provider::Trading212::ConfigurationError) do
|
|
@syncer.perform_sync(sync)
|
|
end
|
|
|
|
assert_equal "Trading 212 API key is missing.", error.message
|
|
assert_equal "requires_update", @item.reload.status
|
|
end
|
|
|
|
test "perform_sync sets requires_update status on auth error" do
|
|
sync = @item.syncs.create!
|
|
Provider::Trading212.any_instance.expects(:fetch_account_summary)
|
|
.raises(Provider::Trading212::AuthenticationError.new("Trading 212 authentication failed (401)."))
|
|
|
|
assert_raises(Provider::Trading212::AuthenticationError) do
|
|
@syncer.perform_sync(sync)
|
|
end
|
|
|
|
assert_equal "requires_update", @item.reload.status
|
|
end
|
|
|
|
# === perform_sync (happy path) ===
|
|
|
|
test "perform_sync imports data and processes accounts when linked" do
|
|
# Link an account
|
|
t212_account = trading212_accounts(:main_account)
|
|
investment = accounts(:investment)
|
|
t212_account.ensure_account_provider!(investment)
|
|
|
|
sync = @item.syncs.create!
|
|
@item.update!(status: :good)
|
|
|
|
# Stub the importer to avoid HTTP calls
|
|
Trading212Item::Importer.any_instance.stubs(:import).returns({ success: true })
|
|
|
|
# Run sync without raising
|
|
@syncer.perform_sync(sync)
|
|
|
|
# Sync ran without raising; verify stats were collected
|
|
stats = sync.reload.sync_stats
|
|
assert stats.present?
|
|
end
|
|
|
|
test "perform_sync sets pending_account_setup when accounts are unlinked" do
|
|
sync = @item.syncs.create!
|
|
|
|
Trading212Item::Importer.any_instance.expects(:import).returns({ success: true })
|
|
|
|
@syncer.perform_sync(sync)
|
|
|
|
assert @item.reload.pending_account_setup?
|
|
end
|
|
|
|
# === perform_sync (error handling) ===
|
|
|
|
test "perform_sync records error stats on generic failure" do
|
|
sync = @item.syncs.create!
|
|
Trading212Item::Importer.any_instance.expects(:import).raises(StandardError.new("Boom"))
|
|
|
|
assert_raises(StandardError) do
|
|
@syncer.perform_sync(sync)
|
|
end
|
|
|
|
stats = sync.reload.sync_stats
|
|
assert stats["total_errors"] >= 1
|
|
end
|
|
|
|
# === perform_post_sync ===
|
|
|
|
test "perform_post_sync is a no-op" do
|
|
assert_nil @syncer.perform_post_sync
|
|
end
|
|
end
|