Measured before choosing: 86.17%, identical via `mix test --cover` and via the exported sample + `mix test.coverage`, stable across seeds. Floor is the integer below that, with the rule written next to it: a FLOOR, ratcheted up as behavior-test yaks land, never lowered (a drop means the change or an exclusion is wrong). Exclusions are the modules the suite cannot or should not exercise, each justified in the config comment: `use`-generated glue (Repo, Mailer, Telemetry, ErrorHTML/ErrorJSON), the `use FirehoseWeb` macro, production release tasks (Release), the lib_dev credo check (NoConnShadowing), and test scaffolding (DataCase, ConnCase, AccountsFixtures, Test.FakeBlog). Everything else counts, CoreComponents/controllers/LiveViews included. Wiring matches blogex and the fast/push split: `test.coverage` runs the suite once with `--cover --export-coverage default` (deleting stale exports first, since `mix test.coverage` imports every .coverdata it finds and would pool them), then the `coverage` sensor enforces the floor from that export. The sensor guards on the export existing because `mix test.coverage` exits 0 when it finds nothing — a floor check that did not run must not pass.
160 lines
5.6 KiB
Elixir
160 lines
5.6 KiB
Elixir
defmodule Firehose.MixProject do
|
|
use Mix.Project
|
|
|
|
def project do
|
|
[
|
|
app: :firehose,
|
|
version: "0.2.0",
|
|
elixir: "~> 1.15",
|
|
elixirc_paths: elixirc_paths(Mix.env()),
|
|
start_permanent: Mix.env() == :prod,
|
|
aliases: aliases(),
|
|
deps: deps(),
|
|
test_coverage: test_coverage(),
|
|
compilers: [:phoenix_live_view] ++ Mix.compilers(),
|
|
listeners: [Phoenix.CodeReloader]
|
|
]
|
|
end
|
|
|
|
# Configuration for the OTP application.
|
|
#
|
|
# Type `mix help compile.app` for more information.
|
|
def application do
|
|
[
|
|
mod: {Firehose.Application, []},
|
|
extra_applications: [:logger, :runtime_tools]
|
|
]
|
|
end
|
|
|
|
def cli do
|
|
[
|
|
preferred_envs: [precommit: :test]
|
|
]
|
|
end
|
|
|
|
# Specifies which paths to compile per environment.
|
|
defp elixirc_paths(:test), do: ["lib", "lib_dev", "test/support"]
|
|
defp elixirc_paths(:dev), do: ["lib", "lib_dev"]
|
|
defp elixirc_paths(_), do: ["lib"]
|
|
|
|
# Specifies your project dependencies.
|
|
#
|
|
# Type `mix help deps` for examples and options.
|
|
defp deps do
|
|
[
|
|
{:bcrypt_elixir, "~> 3.0"},
|
|
{:phoenix, "~> 1.8.1"},
|
|
{:phoenix_ecto, "~> 4.5"},
|
|
{:ecto_sql, "~> 3.14"},
|
|
{:postgrex, ">= 0.0.0"},
|
|
{:phoenix_html, "~> 4.1"},
|
|
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
|
{:phoenix_live_view, "~> 1.2"},
|
|
{:lazy_html, ">= 0.1.0", only: :test},
|
|
{:phoenix_live_dashboard, "~> 0.8.3"},
|
|
{:esbuild, "~> 0.10", runtime: Mix.env() == :dev},
|
|
{:tailwind, "~> 0.3", runtime: Mix.env() == :dev},
|
|
{:heroicons,
|
|
github: "tailwindlabs/heroicons",
|
|
tag: "v2.2.0",
|
|
sparse: "optimized",
|
|
app: false,
|
|
compile: false,
|
|
depth: 1},
|
|
{:swoosh, "~> 1.16"},
|
|
{:gen_smtp, "~> 1.0"},
|
|
{:req, "~> 0.7"},
|
|
{:telemetry_metrics, "~> 1.0"},
|
|
{:telemetry_poller, "~> 1.0"},
|
|
{:gettext, "~> 0.26"},
|
|
{:jason, "~> 1.2"},
|
|
{:dns_cluster, "~> 0.2.0"},
|
|
{:bandit, "~> 1.5"},
|
|
{:blogex, path: "../blogex"},
|
|
{:microprints,
|
|
git: "https://gitea.apps.sustainabledelivery.com/QWAN/microprints-phoenix.git",
|
|
branch: "main"},
|
|
{:credo, "~> 1.7", only: [:dev, :test], runtime: false}
|
|
]
|
|
end
|
|
|
|
# Aliases are shortcuts or tasks specific to the current project.
|
|
# For example, to install project dependencies and perform other setup tasks, run:
|
|
#
|
|
# $ mix setup
|
|
#
|
|
# See the documentation for `Mix` for more info on aliases.
|
|
defp aliases do
|
|
[
|
|
setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"],
|
|
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
|
|
"ecto.reset": ["ecto.drop", "ecto.setup"],
|
|
test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"],
|
|
"assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
|
|
"assets.build": ["compile", "tailwind firehose", "esbuild firehose"],
|
|
"assets.deploy": [
|
|
"tailwind firehose --minify",
|
|
"esbuild firehose --minify",
|
|
"phx.digest"
|
|
],
|
|
precommit: ["compile --warning-as-errors", "deps.unlock --unused", "format", "test"]
|
|
]
|
|
end
|
|
|
|
# The coverage floor the Lens pass enforces (`make verify` -> `make coverage`
|
|
# in app/). Rule: the threshold is a FLOOR. Raise it as behavior-test yaks
|
|
# land; never lower it. A drop means the change (or an exclusion) is wrong,
|
|
# not the floor.
|
|
#
|
|
# Measured 2026-10-26 (PostgreSQL on localhost:5432, exclusions below):
|
|
# 86.17%, identical via `mix test --cover` and via
|
|
# `mix test --cover --export-coverage default` + `mix test.coverage`, and
|
|
# stable across seeds. Floor is the integer below that.
|
|
#
|
|
# `test.coverage` deletes stale exports before sampling: `mix test.coverage`
|
|
# imports *every* .coverdata it finds, so leftover exports from earlier runs
|
|
# pool into the total and quietly inflate it.
|
|
#
|
|
# Excluded are modules the suite cannot or should not exercise; counting them
|
|
# would move the number without saying anything about app behavior:
|
|
#
|
|
# * framework glue generated by `use`:
|
|
# Firehose.Repo `use Ecto.Repo`
|
|
# Firehose.Mailer `use Swoosh.Mailer`
|
|
# FirehoseWeb.Telemetry Phoenix's telemetry supervisor + metric list
|
|
# FirehoseWeb.ErrorHTML Phoenix error renderers, both delegating to
|
|
# FirehoseWeb.ErrorJSON Phoenix.Controller.status_message_from_template/1
|
|
# * FirehoseWeb the `use FirehoseWeb` macro: imports and aliases
|
|
# only, nothing that executes
|
|
# * Firehose.Release production release tasks (`mix ecto.migrate` on
|
|
# Dokku); the suite never runs them
|
|
# * Firehose.Checks.NoConnShadowing
|
|
# lib_dev credo check, exercised by `mix credo`
|
|
# and not by tests
|
|
# * test scaffolding Firehose.DataCase, FirehoseWeb.ConnCase,
|
|
# Firehose.AccountsFixtures, Firehose.Test.FakeBlog:
|
|
# fixtures measure the tests, not the app
|
|
#
|
|
# Everything else counts — CoreComponents, controllers, LiveViews included:
|
|
# that is where the behavior-test work shows up as a higher floor.
|
|
defp test_coverage do
|
|
[
|
|
summary: [threshold: 86],
|
|
ignore_modules: [
|
|
Firehose.Repo,
|
|
Firehose.Mailer,
|
|
Firehose.Release,
|
|
FirehoseWeb,
|
|
FirehoseWeb.Telemetry,
|
|
FirehoseWeb.ErrorHTML,
|
|
FirehoseWeb.ErrorJSON,
|
|
Firehose.Checks.NoConnShadowing,
|
|
Firehose.DataCase,
|
|
FirehoseWeb.ConnCase,
|
|
Firehose.AccountsFixtures,
|
|
Firehose.Test.FakeBlog
|
|
]
|
|
]
|
|
end
|
|
end
|