78 lines
2.5 KiB
Elixir
78 lines
2.5 KiB
Elixir
defmodule MvWeb.StatisticsLiveTest do
|
|
@moduledoc """
|
|
Tests for the Statistics LiveView at /statistics.
|
|
|
|
Uses explicit auth: conn is authenticated with a role that has access to
|
|
the statistics page (read_only by default; override with @tag :role).
|
|
"""
|
|
use MvWeb.ConnCase, async: true
|
|
|
|
import Phoenix.LiveViewTest
|
|
|
|
alias Mv.MembershipFees.MembershipFeeType
|
|
|
|
describe "statistics page" do
|
|
@describetag role: :read_only
|
|
test "renders statistics page with title and key labels for authenticated user with access",
|
|
%{
|
|
conn: conn
|
|
} do
|
|
{:ok, _view, html} = live(conn, ~p"/statistics")
|
|
|
|
assert html =~ "Statistics"
|
|
assert html =~ "Active members"
|
|
assert html =~ "Unpaid"
|
|
assert html =~ "Contributions by year"
|
|
assert html =~ "Member numbers by year"
|
|
end
|
|
|
|
test "page shows overview of all relevant years without year selector", %{conn: conn} do
|
|
{:ok, _view, html} = live(conn, ~p"/statistics")
|
|
|
|
# No year dropdown: single select for year should not be present as main control
|
|
assert html =~ "Overview" or html =~ "overview"
|
|
# table header or legend
|
|
assert html =~ "Year"
|
|
end
|
|
|
|
test "fee_type_id in URL updates selected filter and contributions", %{conn: conn} do
|
|
actor = Mv.Helpers.SystemActor.get_system_actor()
|
|
|
|
fee_types =
|
|
MembershipFeeType
|
|
|> Ash.Query.sort(name: :asc)
|
|
|> Ash.read!(domain: Mv.MembershipFees, actor: actor)
|
|
|
|
fee_type =
|
|
case List.first(fee_types) do
|
|
nil ->
|
|
MembershipFeeType
|
|
|> Ash.Changeset.for_create(:create, %{
|
|
name: "Test Fee #{System.unique_integer([:positive])}",
|
|
amount: Decimal.new("50.00"),
|
|
interval: :yearly
|
|
})
|
|
|> Ash.create!(actor: actor)
|
|
|
|
ft ->
|
|
ft
|
|
end
|
|
|
|
path = ~p"/statistics" <> "?" <> URI.encode_query(%{"fee_type_id" => fee_type.id})
|
|
{:ok, view, html} = live(conn, path)
|
|
|
|
assert view |> element("select#fee-type-filter") |> has_element?()
|
|
assert html =~ fee_type.name
|
|
assert html =~ "Contributions by year"
|
|
end
|
|
end
|
|
|
|
describe "statistics page with own_data role" do
|
|
@describetag role: :member
|
|
test "redirects when user has only own_data (no access to statistics page)", %{conn: conn} do
|
|
# member role uses own_data permission set; /statistics is not in own_data pages
|
|
conn = get(conn, ~p"/statistics")
|
|
assert redirected_to(conn) != ~p"/statistics"
|
|
end
|
|
end
|
|
end
|