Adds ~800 new tests (incl. 27 StreamData properties) across 22 modules that previously had little or no coverage. Highlights: - Pure utility modules (LogSanitizer, PacketFieldWhitelist, PacketSanitizer, DeviceParser, CoordinateUtils, BoundsUtils, ParamUtils, Convert, WeatherUnits) get thorough unit + property coverage including UTF-8 truncation boundaries, antimeridian longitude wrap, Haversine symmetry, and unit-conversion inverses. - JSON view modules (CallsignJSON, ErrorJSON, ChangesetJSON) verified for envelope shape and error templating. - Plugs (HealthCheck, RateLimiter, ApiCSRF) exercised for happy-path and halt paths. - GenServer modules (RegexCache, CleanupScheduler, DeploymentNotifier) tested without touching the supervised singleton where possible. - Drops the orphaned map_live/map_helpers_test.exs whose module name collided with the new live/shared/coordinate_utils_test.exs.
90 lines
3 KiB
Elixir
90 lines
3 KiB
Elixir
defmodule AprsmeWeb.TimeUtilsTest do
|
|
use ExUnit.Case, async: true
|
|
|
|
alias AprsmeWeb.TimeUtils
|
|
|
|
# Allow a few seconds of slack between sequential `DateTime.utc_now/0` calls.
|
|
@slack_seconds 5
|
|
|
|
defp seconds_between(dt1, dt2) do
|
|
abs(DateTime.diff(dt1, dt2, :second))
|
|
end
|
|
|
|
describe "hours_ago/1" do
|
|
test "returns a DateTime in the past" do
|
|
dt = TimeUtils.hours_ago(3)
|
|
now = DateTime.utc_now()
|
|
assert DateTime.before?(dt, now)
|
|
assert_in_delta DateTime.diff(now, dt, :second), 3 * 3600, @slack_seconds
|
|
end
|
|
|
|
test "hours_ago(0) returns approximately now" do
|
|
dt = TimeUtils.hours_ago(0)
|
|
assert seconds_between(dt, DateTime.utc_now()) < @slack_seconds
|
|
end
|
|
end
|
|
|
|
describe "named helpers" do
|
|
test "one_hour_ago is about 3600 seconds before now" do
|
|
dt = TimeUtils.one_hour_ago()
|
|
assert_in_delta DateTime.diff(DateTime.utc_now(), dt, :second), 3600, @slack_seconds
|
|
end
|
|
|
|
test "one_day_ago is about 86400 seconds before now" do
|
|
dt = TimeUtils.one_day_ago()
|
|
assert_in_delta DateTime.diff(DateTime.utc_now(), dt, :second), 86_400, @slack_seconds
|
|
end
|
|
|
|
test "two_days_ago is about 172800 seconds before now" do
|
|
dt = TimeUtils.two_days_ago()
|
|
assert_in_delta DateTime.diff(DateTime.utc_now(), dt, :second), 172_800, @slack_seconds
|
|
end
|
|
|
|
test "one_week_ago is about 604800 seconds before now" do
|
|
dt = TimeUtils.one_week_ago()
|
|
assert_in_delta DateTime.diff(DateTime.utc_now(), dt, :second), 604_800, @slack_seconds
|
|
end
|
|
end
|
|
|
|
describe "days_ago/1" do
|
|
test "returns N days before now" do
|
|
dt = TimeUtils.days_ago(3)
|
|
assert_in_delta DateTime.diff(DateTime.utc_now(), dt, :second), 3 * 86_400, @slack_seconds
|
|
end
|
|
|
|
test "accepts 0" do
|
|
dt = TimeUtils.days_ago(0)
|
|
assert seconds_between(dt, DateTime.utc_now()) < @slack_seconds
|
|
end
|
|
end
|
|
|
|
describe "time_range/1" do
|
|
test "returns {past, now} for :last_hour" do
|
|
{start_t, end_t} = TimeUtils.time_range(:last_hour)
|
|
assert DateTime.before?(start_t, end_t)
|
|
assert_in_delta DateTime.diff(end_t, start_t, :second), 3600, @slack_seconds
|
|
end
|
|
|
|
test "returns {past, now} for :last_day" do
|
|
{start_t, end_t} = TimeUtils.time_range(:last_day)
|
|
assert_in_delta DateTime.diff(end_t, start_t, :second), 86_400, @slack_seconds
|
|
end
|
|
|
|
test "returns {past, now} for :last_two_days" do
|
|
{start_t, end_t} = TimeUtils.time_range(:last_two_days)
|
|
assert_in_delta DateTime.diff(end_t, start_t, :second), 172_800, @slack_seconds
|
|
end
|
|
|
|
test "returns {past, now} for :last_week" do
|
|
{start_t, end_t} = TimeUtils.time_range(:last_week)
|
|
assert_in_delta DateTime.diff(end_t, start_t, :second), 604_800, @slack_seconds
|
|
end
|
|
end
|
|
|
|
describe "default_time_range/0" do
|
|
test "matches :last_two_days" do
|
|
{start_t, end_t} = TimeUtils.default_time_range()
|
|
assert_in_delta DateTime.diff(end_t, start_t, :second), 172_800, @slack_seconds
|
|
end
|
|
end
|
|
end
|