Files
sure/test/test_helper.rb
ghost 894d705e83 perf(dashboard): streamline investment activity totals (#2257)
* perf(dashboard): streamline investment activity totals

* fix(dashboard): skip empty investment totals cache writes

Short-circuit empty investment account totals before cache fetch and move the new SQL query capture regression helper into test/support.

* refactor(dashboard): address review on investment totals query

- Drop defensive ArgumentError guards in InvestmentStatement::Totals#initialize.
  The sole caller (totals_query) always passes correct types, and the
  empty_result early-return already handles the zero-accounts case.
- Remove the redundant accounts JOIN and its family_id/status filters from the
  aggregation SQL. account_ids is already scoped to the family's visible
  (draft/active) investment accounts, so the join back to accounts is
  unnecessary work in the query plan. Drop the now-unused family_id param.
- Add a regression assertion that the aggregate no longer joins accounts.
2026-06-18 20:18:18 +02:00

155 lines
5.0 KiB
Ruby

if ENV["COVERAGE"] == "true"
require "simplecov"
SimpleCov.start "rails" do
enable_coverage :branch
end
end
require_relative "../config/environment"
ENV["RAILS_ENV"] ||= "test"
# Set Plaid to sandbox mode for tests
ENV["PLAID_ENV"] = "sandbox"
ENV["PLAID_CLIENT_ID"] ||= "test_client_id"
ENV["PLAID_SECRET"] ||= "test_secret"
# Fixes Segfaults on M1 Macs when running tests in parallel (temporary workaround)
ENV["PGGSSENCMODE"] = "disable"
require "rails/test_help"
require "minitest/mock"
require "minitest/autorun"
require "mocha/minitest"
require "aasm/minitest"
require "webmock/minitest"
require "rack/test"
require "tempfile"
require "uri"
require Rails.root.join("test/support/sql_query_capture").to_s
VCR.configure do |config|
config.cassette_library_dir = "test/vcr_cassettes"
config.hook_into :webmock
config.ignore_localhost = true
config.ignore_request do |request|
selenium_remote_url = ENV["SELENIUM_REMOTE_URL"]
next false if selenium_remote_url.blank?
request_uri = URI(request.uri)
selenium_uri = URI(selenium_remote_url)
request_uri.host.present? &&
selenium_uri.host.present? &&
request_uri.host == selenium_uri.host &&
request_uri.port == selenium_uri.port
rescue URI::InvalidURIError
false
end
config.default_cassette_options = { erb: true }
config.filter_sensitive_data("<OPENAI_ACCESS_TOKEN>") { ENV["OPENAI_ACCESS_TOKEN"] }
config.filter_sensitive_data("<OPENAI_ORGANIZATION_ID>") { ENV["OPENAI_ORGANIZATION_ID"] }
config.filter_sensitive_data("<STRIPE_SECRET_KEY>") { ENV["STRIPE_SECRET_KEY"] }
config.filter_sensitive_data("<STRIPE_WEBHOOK_SECRET>") { ENV["STRIPE_WEBHOOK_SECRET"] }
config.filter_sensitive_data("<PLAID_CLIENT_ID>") { ENV["PLAID_CLIENT_ID"] }
config.filter_sensitive_data("<PLAID_SECRET>") { ENV["PLAID_SECRET"] }
end
# Configure OmniAuth for testing
OmniAuth.config.test_mode = true
# Allow both GET and POST for OIDC callbacks in tests
OmniAuth.config.allowed_request_methods = [ :get, :post ]
module ActiveSupport
class TestCase
# Run tests in parallel with specified workers
parallelize(workers: :number_of_processors) unless ENV["DISABLE_PARALLELIZATION"] == "true"
# https://github.com/simplecov-ruby/simplecov/issues/718#issuecomment-538201587
if ENV["COVERAGE"] == "true"
parallelize_setup do |worker|
SimpleCov.command_name "#{SimpleCov.command_name}-#{worker}"
end
parallelize_teardown do |worker|
SimpleCov.result
end
end
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
# rails-settings-cached keeps an in-memory cache that survives the per-test
# transaction rollback, so a Setting.* value written in one test leaks into
# later tests and causes order-dependent failures (e.g. Settings::Hostings
# reading a stale "" where nil is expected). Reset the cache before every
# test so each starts from the rolled-back DB state.
setup { Setting.clear_cache }
include SqlQueryCapture
# Add more helper methods to be used by all tests here...
def sign_in(user)
post sessions_path, params: { email: user.email, password: user_password_test }
end
def ensure_tailwind_build
tailwind_build = Rails.root.join("app/assets/builds/tailwind.css")
FileUtils.mkdir_p(tailwind_build.dirname)
File.write(tailwind_build, "/* test */") unless tailwind_build.exist?
end
def with_env_overrides(overrides = {}, &block)
ClimateControl.modify(**overrides, &block)
end
def with_self_hosting
Rails.configuration.stubs(:app_mode).returns("self_hosted".inquiry)
yield
end
def api_headers(api_key)
{ "X-Api-Key" => api_key.plain_key }
end
def user_password_test
"maybetestpassword817983172"
end
def uploaded_file(filename:, content_type:, content: "date,amount\n2024-01-01,1\n")
tempfile = Tempfile.new([ File.basename(filename, ".*"), File.extname(filename) ])
tempfile.binmode
tempfile.write(content)
tempfile.rewind
Rack::Test::UploadedFile.new(tempfile.path, content_type, true, original_filename: filename)
end
def family_guest
@family_guest ||= users(:family_admin).family.users.create!(
first_name: "Readonly",
last_name: "Guest",
email: "readonly-guest@example.com",
password: user_password_test,
role: "guest",
onboarded_at: Time.current,
ui_layout: "dashboard"
)
end
# Ensures the Investment Contributions category exists for a family
# Used in transfer tests where this bootstrapped category is required
# Uses family locale to ensure consistent naming
def ensure_investment_contributions_category(family)
I18n.with_locale(family.locale) do
family.categories.find_or_create_by!(name: Category.investment_contributions_name) do |c|
c.color = "#0d9488"
c.lucide_icon = "trending-up"
end
end
end
end
end
Dir[Rails.root.join("test", "interfaces", "**", "*.rb")].each { |f| require f }