CSV export: robust apply_export_filters, single custom_field_ids_union, string boolean_filters, more tests
Some checks reported errors
continuous-integration/drone/push Build was killed

This commit is contained in:
Moritz 2026-03-04 20:50:52 +01:00
parent d71d5881cf
commit fc7b035123
Signed by: moritz
GPG key ID: 1020A035E5DD0824
3 changed files with 176 additions and 18 deletions

View file

@ -119,6 +119,78 @@ defmodule MvWeb.MemberExportControllerTest do
assert body =~ "Carol"
end
test "selected_ids override filters: only selected members exported when filters also set", %{
conn: conn,
member1: m1,
member2: m2,
member3: _m3
} do
# When selected_ids is set, cycle_status_filter and boolean_filters must not reduce the set:
# only the selected members are exported.
payload = %{
"selected_ids" => [m1.id, m2.id],
"member_fields" => ["first_name", "last_name", "email"],
"custom_field_ids" => [],
"query" => nil,
"sort_field" => nil,
"sort_order" => nil,
"cycle_status_filter" => "paid",
"boolean_filters" => %{}
}
conn = get(conn, "/members")
csrf_token = csrf_token_from_conn(conn)
conn =
post(conn, "/members/export.csv", %{
"payload" => Jason.encode!(payload),
"_csrf_token" => csrf_token
})
assert conn.status == 200
body = response(conn, 200)
lines = export_lines(body)
assert length(lines) == 3
assert body =~ "Alice"
assert body =~ "Bob"
refute body =~ "Carol"
end
test "cycle_status_filter applied when export all returns CSV", %{
conn: conn,
member1: _m1,
member2: _m2,
member3: _m3
} do
payload = %{
"selected_ids" => [],
"member_fields" => ["first_name", "email"],
"custom_field_ids" => [],
"query" => nil,
"sort_field" => nil,
"sort_order" => nil,
"cycle_status_filter" => "paid",
"show_current_cycle" => true
}
conn = get(conn, "/members")
csrf_token = csrf_token_from_conn(conn)
conn =
post(conn, "/members/export.csv", %{
"payload" => Jason.encode!(payload),
"_csrf_token" => csrf_token
})
assert conn.status == 200
assert get_resp_header(conn, "content-type") |> List.first() =~ "text/csv"
body = response(conn, 200)
lines = export_lines(body)
assert lines != []
assert hd(lines) =~ "First Name"
end
test "filters out unknown member fields from export", %{conn: conn, member1: m1} do
payload = %{
"selected_ids" => [m1.id],
@ -607,6 +679,70 @@ defmodule MvWeb.MemberExportControllerTest do
refute body =~ member_with_integer.last_name
refute body =~ member_without_value.last_name
end
test "boolean_filters accept string true/false from query encoding", %{
conn: conn,
boolean_field: boolean_field,
member_with_boolean: member_with_boolean
} do
payload = %{
"selected_ids" => [],
"member_fields" => ["first_name", "last_name"],
"custom_field_ids" => [boolean_field.id],
"query" => nil,
"sort_field" => nil,
"sort_order" => nil,
"boolean_filters" => %{to_string(boolean_field.id) => "true"}
}
conn = get(conn, "/members")
csrf_token = csrf_token_from_conn(conn)
conn =
post(conn, "/members/export.csv", %{
"payload" => Jason.encode!(payload),
"_csrf_token" => csrf_token
})
assert conn.status == 200
body = response(conn, 200)
assert body =~ member_with_boolean.last_name
end
test "combination cycle_status_filter and boolean_filters applied when export all", %{
conn: conn,
boolean_field: boolean_field,
member_with_boolean: _member_with_boolean
} do
# Both filters are applied (AND). Export returns 200 and valid CSV.
payload = %{
"selected_ids" => [],
"member_fields" => ["first_name", "last_name"],
"custom_field_ids" => [boolean_field.id],
"query" => nil,
"sort_field" => nil,
"sort_order" => nil,
"cycle_status_filter" => "paid",
"show_current_cycle" => true,
"boolean_filters" => %{to_string(boolean_field.id) => true}
}
conn = get(conn, "/members")
csrf_token = csrf_token_from_conn(conn)
conn =
post(conn, "/members/export.csv", %{
"payload" => Jason.encode!(payload),
"_csrf_token" => csrf_token
})
assert conn.status == 200
assert get_resp_header(conn, "content-type") |> List.first() =~ "text/csv"
body = response(conn, 200)
lines = export_lines(body)
assert lines != []
assert hd(lines) =~ "First Name"
end
end
describe "POST /members/export.pdf" do