prop/config/test.exs
Graham McIntire daafa5a02a
perf(algo): unify recalibration into single Python pipeline with JSON output
Replace the two-script Python pipeline (analysis report + Elixir-source
emitter) with a single `scripts/recalibrate.py` that fits per-band
weights from PSKR spot density (VHF/UHF) and contacts↔HRRR correlations
(microwave), writing `priv/algo/band_weights.json` as a machine-readable
artifact. A new Elixir BandWeights module loads this JSON once via
`:persistent_term` cache; BandConfig.weights/1 consults it before falling
back to in-source overrides or global defaults. The script never touches
Elixir source — recalibration is now `python3 scripts/recalibrate.py`
followed by an app restart.
2026-05-25 14:45:55 -05:00

142 lines
6.2 KiB
Elixir

import Config
alias Ecto.Adapters.SQL.Sandbox
alias Microwaveprop.Qrz.Client
# Only in tests, remove the complexity from the password hashing algorithm
config :bcrypt_elixir, :log_rounds, 1
# Print only warnings and errors during test
config :logger, level: :warning
config :microwaveprop, Client,
username: "testuser",
password: "testpass",
agent: "microwaveprop-test/1.0",
plug: {Req.Test, Client},
retry: false
# Read-only secondary repo for aprs.me. Configured here so the app boots
# under MIX_ENV=test, but uses the SQL.Sandbox in :manual mode so tests
# that don't touch APRS data don't have to check the DB out. Tests that
# do query the AprsRepo must call `Ecto.Adapters.SQL.Sandbox.checkout/1`
# explicitly.
config :microwaveprop, Microwaveprop.AprsRepo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "aprsme_test#{System.get_env("MIX_TEST_PARTITION")}",
pool: Sandbox,
pool_size: 2,
ownership_timeout: 60_000,
timeout: 60_000
config :microwaveprop, Microwaveprop.Geocoder,
plug: {Req.Test, Microwaveprop.Geocoder},
retry: false
# In test we don't send emails
config :microwaveprop, Microwaveprop.Mailer, adapter: Swoosh.Adapters.Test
config :microwaveprop, Microwaveprop.Qrz, cache_ttl_hours: 0
# Configure your database
#
# 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 :microwaveprop, Microwaveprop.Repo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "microwaveprop_test#{System.get_env("MIX_TEST_PARTITION")}",
pool: Sandbox,
pool_size: System.schedulers_online() * 2,
ownership_timeout: 60_000,
timeout: 60_000
# We don't run a server during test. If one is required,
# you can enable the server option below.
config :microwaveprop, MicrowavepropWeb.Endpoint,
http: [ip: {127, 0, 0, 1}, port: 4002],
secret_key_base: "f7KbnwUezGrPtrv/67l6Wi+W9/+wOqwFG5QJ/ZLs24cVM1gg2lBswZwrKuyWsBAZ",
server: false
# Run Oban jobs inline during tests
config :microwaveprop, Oban, testing: :inline
# Pin the scorer to in-source weights in test. Individual tests that
# need the JSON loader (`BandWeightsTest`) override this per-case.
config :microwaveprop, :band_weights_json, false
# Skip the registration-time QRZ lookup in tests — it needs a Mox stub
# that isn't set up across the test suite, and the worker is exercised
# directly in its own dedicated test.
config :microwaveprop, :enable_home_qth_lookup, false
# MetricsLogSuppressionTest hits GET /metrics and asserts no "Sent 200"
# log line; that path needs PromEx alive to return a 200. We can't
# blanket-disable PromEx. Instead, toggle off the Oban-queue poller
# below — its 5 s telemetry measurement issues an Ecto query from a
# process that doesn't hold a sandbox connection and crashes with
# DBConnection.OwnershipError, spamming the test log.
config :microwaveprop, :prom_ex_include_oban_plugin, false
# Score files land under a per-run tmp directory so replace_scores tests
# don't write into a shared location (and we can assert on the file
# contents from inside tests).
config :microwaveprop,
:propagation_scores_dir,
Path.join(System.tmp_dir!(), "microwaveprop_test_scores_#{System.unique_integer([:positive])}")
# Don't open an outbound MQTT connection from `mix test`. The
# Pskr.Aggregator still starts (so unit tests can drive it), but
# Pskr.Client is gated off here.
config :microwaveprop, :pskr_mqtt_enabled, false
# Skip the Overpass road-proximity HTTP call in tests — the rover live
# test exercises the full Calculate pipeline and we don't want it
# reaching out to overpass-api.de.
config :microwaveprop, :rover_road_proximity_enabled, false
config :microwaveprop, cache_contact_count: false
config :microwaveprop, cache_contact_map: false
config :microwaveprop, elevation_req_options: [plug: {Req.Test, Microwaveprop.Terrain.ElevationClient}, retry: false]
config :microwaveprop, gefs_req_options: [plug: {Req.Test, Microwaveprop.Weather.GefsClient}, retry: false]
config :microwaveprop, giro_req_options: [plug: {Req.Test, Microwaveprop.Ionosphere.GiroClient}, retry: false]
# Default the HRRR cycle freshness probe to "always available" in tests.
# Individual cases that exercise the fallback path override via
# `Application.put_env/3` in their setup.
config :microwaveprop, hrrr_cycle_available_fn: fn _run_time -> true end
config :microwaveprop, hrrr_req_options: [plug: {Req.Test, Microwaveprop.Weather.HrrrClient}, retry: false]
config :microwaveprop, iem_rate_limiter_interval_ms: 0
config :microwaveprop, iem_req_options: [plug: {Req.Test, Microwaveprop.Weather.IemClient}, retry: false]
config :microwaveprop, narr_req_options: [plug: {Req.Test, Microwaveprop.Weather.NarrClient}, retry: false]
# Route HTTP requests through Req.Test stubs
config :microwaveprop, nexrad_req_options: [plug: {Req.Test, Microwaveprop.Weather.NexradClient}, retry: false]
config :microwaveprop, solar_req_options: [plug: {Req.Test, Microwaveprop.Weather.SolarClient}]
config :microwaveprop, srtm_req_options: [plug: {Req.Test, Microwaveprop.Terrain.Srtm}, retry: false]
config :microwaveprop, start_freshness_monitor: false
# The Oban queue-depth poller (`MicrowavepropWeb.Telemetry`) runs every
# 30 s outside any sandbox owner. Its query against `oban_jobs` holds a
# pool connection long enough to race LiveView `start_async` tests with
# 100 ms async windows (e.g. SkewtLive). Off in tests; the same
# poll-once-per-pod metric is irrelevant inside a single-process suite.
config :microwaveprop, start_telemetry_poller: false
config :microwaveprop, swpc_req_options: [plug: {Req.Test, Microwaveprop.SpaceWeather.SwpcClient}, retry: false]
config :microwaveprop, uwyo_req_options: [plug: {Req.Test, Microwaveprop.Weather.UwyoSoundingClient}, retry: false]
# 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