CSV export: robust apply_export_filters, single custom_field_ids_union, string boolean_filters, more tests
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
ad641ed49e
commit
4308368c91
3 changed files with 176 additions and 18 deletions
|
|
@ -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 length(lines) >= 1
|
||||
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 length(lines) >= 1
|
||||
assert hd(lines) =~ "First Name"
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /members/export.pdf" do
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue