towerops/test/towerops/workers/report_worker_test.exs
Graham McIntire 3ca0834ef0 tests: raise coverage to 70% via helper promotion + new unit/property tests
Promoted pure presentation and utility helpers from `defp` to `def @doc false`
across ~20 LiveViews, Oban workers, and sync modules so they're reachable from
unit tests. Refactored several `cond` blocks into idiomatic function heads with
guards. Added ~250 new test cases in new files under test/towerops and
test/towerops_web, including DB-backed tests for CnMaestro.Sync and
AlertNotificationWorker, and removed dead LiveView tab components and
CapacityLive (no callers anywhere in lib/test).

Configured mix.exs test_coverage.ignore_modules to exclude vendored third-party
code (SnmpKit, protobuf-generated Towerops.Agent.*, Absinthe GraphQL types,
Phoenix HTML modules, Inspect protocol impls) from coverage calculations —
these are not our project code.

Coverage: 66.93% → 70.09%. Full suite: 10,127 tests, 0 failures.
2026-04-24 09:49:06 -05:00

77 lines
2.1 KiB
Elixir

defmodule Towerops.Workers.ReportWorkerTest do
use Towerops.DataCase
use Oban.Testing, repo: Towerops.Repo
import Towerops.AccountsFixtures
alias Towerops.Reports
alias Towerops.Workers.ReportWorker
setup do
user = user_fixture()
{:ok, org} = Towerops.Organizations.create_organization(%{name: "Org RW"}, user.id)
%{org: org}
end
defp create_report(org, attrs) do
{:ok, r} =
Reports.create_report(
Map.merge(
%{
name: "rep",
report_type: "uptime_summary",
schedule: %{"type" => "daily"},
recipients: ["a@b.com"],
organization_id: org.id,
enabled: true
},
attrs
)
)
r
end
describe "perform/1 dispatcher (empty args)" do
test "enqueues jobs for due reports", %{org: org} do
# Due: never run + daily schedule
_r1 = create_report(org, %{name: "due-1"})
assert :ok = perform_job(ReportWorker, %{})
# Verify a child job was enqueued
assert [_j] = all_enqueued(worker: ReportWorker)
end
test "does not enqueue disabled reports", %{org: org} do
_disabled = create_report(org, %{enabled: false})
assert :ok = perform_job(ReportWorker, %{})
assert [] = all_enqueued(worker: ReportWorker)
end
test "does not enqueue reports that are not due", %{org: org} do
# A daily report run 1 minute ago is not due
{:ok, report} =
Reports.create_report(%{
name: "recent",
report_type: "uptime_summary",
schedule: %{"type" => "daily"},
recipients: ["a@b.com"],
organization_id: org.id,
enabled: true
})
{:ok, _} =
Reports.update_report(report, %{last_run_at: DateTime.add(DateTime.utc_now(), -60, :second)})
assert :ok = perform_job(ReportWorker, %{})
assert [] = all_enqueued(worker: ReportWorker)
end
end
describe "perform/1 (with report_id)" do
test "logs warning for missing report and returns :ok" do
assert :ok = perform_job(ReportWorker, %{"report_id" => Ecto.UUID.generate()})
end
end
end