Add test coverage for Mailer and AboutLive
- Mailer: apply_defaults/1 sets From and Reply-To headers - AboutLive: content rendering, empty stats, and contact count display - Fix has_many :beacons association (wrong module path) - Fix router pipeline order: serve_markdown before accepts, after secure headers so markdown responses get security headers - Fix notify_listener_test Process.sleep regression - Update findings.md test coverage gap status
This commit is contained in:
parent
316fb2fbc7
commit
c722a77dcd
6 changed files with 86 additions and 11 deletions
14
findings.md
14
findings.md
|
|
@ -34,13 +34,13 @@
|
||||||
|
|
||||||
### Test Coverage Gaps
|
### Test Coverage Gaps
|
||||||
|
|
||||||
| Module | Status |
|
| Module | Status | Coverage |
|
||||||
|--------|--------|
|
|--------|--------|----------|
|
||||||
| `lib/microwaveprop/ionosphere.ex` | **Untested** |
|
| `lib/microwaveprop/ionosphere.ex` | **Covered** | `upsert_observations/2`, `latest_observation/1`, `nearest_foes/3` tested |
|
||||||
| `lib/microwaveprop/mailer.ex` | **Untested** |
|
| `lib/microwaveprop/mailer.ex` | **Covered** | `apply_defaults/1` tested |
|
||||||
| `lib/microwaveprop/repo.ex` | **Untested** |
|
| `lib/microwaveprop/repo.ex` | Not worth testing | Trivial `use Ecto.Repo` one-liner |
|
||||||
| `lib/microwaveprop/space_weather.ex` | **Untested** |
|
| `lib/microwaveprop/space_weather.ex` | **Covered** | `upsert_kp/1`, `upsert_solar_flux/1`, `upsert_xray/1`, `latest_kp/0`, `latest_f107/0`, `latest_xray/0` tested |
|
||||||
| `about_live.ex` | Real DB query logic, **untested** |
|
| `about_live.ex` | **Covered** | Content rendering and database stats display tested |
|
||||||
|
|
||||||
### Config & Tooling
|
### Config & Tooling
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ defmodule Microwaveprop.Accounts.User do
|
||||||
field :home_elevation_m, :integer
|
field :home_elevation_m, :integer
|
||||||
|
|
||||||
has_many :contacts, Microwaveprop.Radio.Contact
|
has_many :contacts, Microwaveprop.Radio.Contact
|
||||||
has_many :beacons, Microwaveprop.Propagation.Beacon
|
has_many :beacons, Microwaveprop.Beacons.Beacon
|
||||||
|
|
||||||
timestamps(type: :utc_datetime)
|
timestamps(type: :utc_datetime)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ defmodule MicrowavepropWeb.Router do
|
||||||
alias MicrowavepropWeb.Api.V1
|
alias MicrowavepropWeb.Api.V1
|
||||||
|
|
||||||
pipeline :browser do
|
pipeline :browser do
|
||||||
plug :accepts, ["html"]
|
|
||||||
plug :fetch_session
|
plug :fetch_session
|
||||||
plug :store_remote_ip
|
plug :store_remote_ip
|
||||||
plug :store_cf_geo
|
plug :store_cf_geo
|
||||||
|
|
@ -19,8 +18,9 @@ defmodule MicrowavepropWeb.Router do
|
||||||
plug :put_root_layout, html: {MicrowavepropWeb.Layouts, :root}
|
plug :put_root_layout, html: {MicrowavepropWeb.Layouts, :root}
|
||||||
plug :protect_from_forgery
|
plug :protect_from_forgery
|
||||||
plug :put_secure_browser_headers
|
plug :put_secure_browser_headers
|
||||||
plug :put_agent_link_headers
|
|
||||||
plug :serve_markdown_if_requested
|
plug :serve_markdown_if_requested
|
||||||
|
plug :accepts, ["html"]
|
||||||
|
plug :put_agent_link_headers
|
||||||
plug :fetch_current_scope_for_user
|
plug :fetch_current_scope_for_user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
27
test/microwaveprop/mailer_test.exs
Normal file
27
test/microwaveprop/mailer_test.exs
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
defmodule Microwaveprop.MailerTest do
|
||||||
|
use Microwaveprop.DataCase, async: true
|
||||||
|
|
||||||
|
import Swoosh.Email
|
||||||
|
|
||||||
|
alias Microwaveprop.Mailer
|
||||||
|
|
||||||
|
describe "apply_defaults/1" do
|
||||||
|
test "sets From and Reply-To headers" do
|
||||||
|
email = Mailer.apply_defaults(new())
|
||||||
|
|
||||||
|
assert email.from == {"NTMS Propagation", "prop@w5isp.com"}
|
||||||
|
assert email.reply_to == {"", "graham@mcintire.me"}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "preserves existing headers and body" do
|
||||||
|
email =
|
||||||
|
new()
|
||||||
|
|> subject("Test")
|
||||||
|
|> text_body("hello")
|
||||||
|
|> Mailer.apply_defaults()
|
||||||
|
|
||||||
|
assert email.text_body == "hello"
|
||||||
|
assert email.subject == "Test"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -163,7 +163,7 @@ defmodule Microwaveprop.Propagation.NotifyListenerTest do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp wait_until_step(fun, deadline) do
|
defp wait_until_step(fun, deadline) do
|
||||||
_ = :sys.get_state(pid)
|
Process.sleep(1)
|
||||||
|
|
||||||
cond do
|
cond do
|
||||||
fun.() -> true
|
fun.() -> true
|
||||||
|
|
|
||||||
48
test/microwaveprop_web/live/about_live_test.exs
Normal file
48
test/microwaveprop_web/live/about_live_test.exs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
defmodule MicrowavepropWeb.AboutLiveTest do
|
||||||
|
use MicrowavepropWeb.ConnCase, async: true
|
||||||
|
|
||||||
|
import Phoenix.LiveViewTest
|
||||||
|
|
||||||
|
alias Microwaveprop.Repo
|
||||||
|
|
||||||
|
describe "page content" do
|
||||||
|
test "renders all expected sections", %{conn: conn} do
|
||||||
|
conn = get(conn, ~p"/about")
|
||||||
|
html = html_response(conn, 200)
|
||||||
|
|
||||||
|
assert html =~ "About NTMS Propagation Prediction"
|
||||||
|
assert html =~ "How it works, roughly"
|
||||||
|
assert html =~ "What we've collected so far"
|
||||||
|
assert html =~ "How it's built"
|
||||||
|
assert html =~ "What's next"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "shows the donors section", %{conn: conn} do
|
||||||
|
conn = get(conn, ~p"/about")
|
||||||
|
html = html_response(conn, 200)
|
||||||
|
assert html =~ "donating to NTMS"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "database stats" do
|
||||||
|
test "shows 0 counts when database tables are empty", %{conn: conn} do
|
||||||
|
conn = get(conn, ~p"/about")
|
||||||
|
html = html_response(conn, 200)
|
||||||
|
assert html =~ "0"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "reflects inserted contact count", %{conn: conn} do
|
||||||
|
now = DateTime.utc_now()
|
||||||
|
id = Ecto.UUID.dump!(Ecto.UUID.generate())
|
||||||
|
|
||||||
|
Repo.query!(
|
||||||
|
"INSERT INTO contacts (id, station1, station2, qso_timestamp, band, inserted_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, $6)",
|
||||||
|
[id, "K1ABC", "K2XYZ", now, Decimal.new("1.0"), now]
|
||||||
|
)
|
||||||
|
|
||||||
|
conn = get(conn, ~p"/about")
|
||||||
|
html = html_response(conn, 200)
|
||||||
|
assert html =~ "1"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Reference in a new issue