- CoreComponents.input/1: expanded coverage to include the select,
textarea, generic-text, and unchecked-checkbox branches, plus
error-vs-no-error border styling.
- PostgresNotifier: handle_info forwards pg_notify payload to
Aprsme.PubSub and ignores unrelated messages.
Coverage 69.56 → 70.11%.
Four properties exercise haversine_distance / significant_movement?:
- non-negativity across any in-range coordinate pair
- symmetry: d(a, b) == d(b, a) within a tight tolerance
- identity: d(p, p) == 0.0
- significance agrees with (haversine > threshold) for any integer
threshold in 1..1000
Total: +4 properties, coverage stays clean (dialyzer: 0 new errors).
- supported_locales/0 returns the declared ~w(en es de fr) list.
- put_locale/1 sets the Gettext process locale for each supported
value and raises FunctionClauseError for unsupported input.
3 tests, async:false because they mutate process-wide Gettext state.
- parse_path_element_with_link splits its fat `if`/or-chain into three
focused helpers: linkable_callsign?/1 (regex + alias check),
path_alias?/1 (four String.starts_with guards), and
classify_path_element/2 (link vs. text dispatched on the boolean).
- display_for_element/2 chooses the callsign form with/without the
asterisk via two function heads instead of an inline `if`.
Adds 7 tests covering the parse_path_with_links/1 public API — plain
callsigns, heard-via asterisk preservation, non-linkable aliases
(WIDE/TRACE/RELAY/TCPIP), q-constructs, whitespace trimming, and mixed
paths.
- handle_call(:shutdown, _, state): split into a shutting_down=true
fast-path clause and a normal initiate_shutdown clause. No more
`if state.shutting_down` inside the callback body.
- terminate/2: extract graceful_shutdown_needed?/1 (four function
heads on the reason tag) and maybe_graceful_drain/2 (guarded on
state.shutting_down) so the shutdown side-effects are isolated to
a single, pattern-matched entry point.
Adds 4 unit tests for the pure callback paths
(shutting_down?, shutdown-already-in-progress, EXIT pass-through,
rescue fallback on unavailable GenServer).