towerops/config/test.exs
Graham McIntire c50dc08ad4 test: fix slow + flaky tests (Mox global, env pollution, pool starvation)
- Remove Mox.set_mox_global() in DPW extra test; rely on $callers
  instead so concurrent vendor SNMP tests stop intermittently failing
  with VerificationError.
- Make ToweropsWeb.Plugs.GraphQLIntrospectionTest async: false. It
  mutates Application.put_env(:towerops, :env, :prod), which polluted
  every async vendor test that reads :env via
  Towerops.Snmp.Client.phoenix_snmp_disabled/0.
- Bump test pool queue_target/queue_interval. AgentChannelTest spawns
  many `:proc_lib` channel processes that hold sandbox connections;
  the default 50ms queue caused intermittent
  'could not checkout the connection' errors.
- Tag real-System.cmd("ping") tests as :network so they're excluded
  by default. Saves ~20s on every full run.
- Make JobCleanupTask's internal 1s settle sleep configurable via
  :job_cleanup_settle_ms; the test overrides it to 0.

Plus the pending CoverageLive.Form edit-save / EIRP recompute and
TraceLive deep-link tests from before the compact.
2026-05-08 14:43:30 -05:00

124 lines
4.2 KiB
Elixir

import Config
alias Ecto.Adapters.SQL.Sandbox
# Only in tests, remove the complexity from the password hashing algorithm
config :argon2_elixir,
t_cost: 1,
m_cost: 8
config :error_tracker, enabled: false
# Suppress log output during tests (tests that need logs use capture_log)
config :logger, :default_handler, false
config :logger, level: :error
# Initialize plugs at runtime for faster test compilation
config :phoenix, :plug_init_mode, :runtime
# Sort query params output of verified routes for robust url comparisons
config :phoenix,
sort_verified_routes_query_params: true
# Enable helpful, but potentially expensive runtime checks
config :phoenix_live_view,
enable_expensive_runtime_checks: true
# Disable swoosh api client as it is only required for production adapters
config :swoosh, :api_client, false
# Disable Oban job processing in tests (use testing mode)
config :towerops, Oban,
repo: Towerops.Repo,
testing: :manual,
queues: false,
plugins: false
# Configure your database
#
# In test we don't send emails
# The MIX_TEST_PARTITION environment variable can be used
# to provide built-in test partitioning in CI environment.
# Run `mix help test` for more information.
config :towerops, Towerops.Mailer, adapter: Swoosh.Adapters.Test
# Disable PromEx HTTP server in test — avoids port conflicts under parallel runs.
config :towerops, Towerops.PromEx,
disabled: true,
manual_metrics_start_delay: :no_delay,
drop_metrics_groups: [],
grafana: :disabled,
metrics_server: :disabled
# MIB upload directory for tests — points at a writable tmp dir so
#
# the MibController upload/delete flows can actually be exercised.
# In CI, DATABASE_URL is set and will be used automatically by Ecto.
# Locally, fall back to individual connection parameters.
config :towerops, :mib_dir, Path.join(System.tmp_dir!(), "towerops-test-mibs")
if database_url = System.get_env("DATABASE_URL") do
config :towerops, Towerops.Repo,
url: database_url,
pool: Sandbox,
pool_size: System.schedulers_online() * 2,
# Bumped from default 50ms — channel-heavy test files (notably
# AgentChannelTest) intermittently exhaust the pool while waiting on
# background `:proc_lib` processes to release their checked-out
# connections. A longer queue lets the test pool ride out the spike
# rather than crashing with `connection not available`.
queue_target: 500,
queue_interval: 5_000
else
config :towerops, Towerops.Repo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "towerops_test#{System.get_env("MIX_TEST_PARTITION")}",
pool: Sandbox,
pool_size: System.schedulers_online() * 2,
queue_target: 500,
queue_interval: 5_000
end
# Configure Cloak encryption for testing
# Use a fixed test key (same as dev for simplicity)
config :towerops, Towerops.Vault,
ciphers: [
default: {
Cloak.Ciphers.AES.GCM,
# Test key - same as dev for consistency
tag: "AES.GCM.V1", key: Base.decode64!("nQWmgQYhoCNXA3PAxwriKxLyPHAOWH9VgpLkBOXrowM=")
}
]
# We don't run a server during test. If one is required,
# you can enable the server option below.
config :towerops, ToweropsWeb.Endpoint,
http: [ip: {127, 0, 0, 1}, port: 4002],
secret_key_base: "XDSSqVUtRXUjEfzxefIAaPIzBfonpNMOrCRyP1a0kjPzzyOpVNSRmMBVae/bwTqj",
server: false
# Webhook secret for CI-triggered agent updates
config :towerops, :agent_webhook_secret, "test-webhook-secret"
# Set environment identifier for runtime checks
config :towerops, :env, :test
config :towerops,
ping_module: Towerops.Monitoring.PingMock,
poller_module: Towerops.Snmp.PollerMock,
snmp_adapter: Towerops.Snmp.SnmpMock,
rate_limit_redis_client: Towerops.RateLimit.RedisClientMock,
sql_sandbox: true,
# Disable rate limiting in tests to avoid blocking concurrent test requests
rate_limiting_enabled: false,
# Reduce debounce delay in tests for faster test execution (50ms vs 500ms in prod)
agent_channel_debounce_ms: 50,
# Reduce poll interval in tests for faster test execution (100ms vs 60s in prod)
agent_poll_interval_ms: 100,
# Reduce device deletion delay for faster tests (10ms vs 500ms in prod)
device_deletion_delay_ms: 10,
# Stripe test configuration
stripe_product_id: "prod_test"