Member Fee Type in overview and exports, fix column visibility from URL #442
3 changed files with 90 additions and 0 deletions
|
|
@ -199,6 +199,43 @@ defmodule Mv.Membership.MembersCSVTest do
|
||||||
assert csv =~ "M,m@m.com,Paid"
|
assert csv =~ "M,m@m.com,Paid"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "membership_fee_type column exports fee type name" do
|
||||||
|
columns = [
|
||||||
|
%{header: "First Name", kind: :member_field, key: "first_name"},
|
||||||
|
%{header: "Email", kind: :member_field, key: "email"},
|
||||||
|
%{header: "Fee Type", kind: :membership_fee_type, key: :membership_fee_type}
|
||||||
|
]
|
||||||
|
|
||||||
|
member = %{
|
||||||
|
first_name: "M",
|
||||||
|
email: "m@m.com",
|
||||||
|
membership_fee_type: %{id: "ft-1", name: "Standard"}
|
||||||
|
}
|
||||||
|
|
||||||
|
iodata = MembersCSV.export([member], columns)
|
||||||
|
csv = IO.iodata_to_binary(iodata)
|
||||||
|
|
||||||
|
assert csv =~ "Fee Type"
|
||||||
|
assert csv =~ "Standard"
|
||||||
|
assert csv =~ "M,m@m.com,Standard"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "membership_fee_type column exports empty when no fee type" do
|
||||||
|
columns = [
|
||||||
|
%{header: "First Name", kind: :member_field, key: "first_name"},
|
||||||
|
%{header: "Fee Type", kind: :membership_fee_type, key: :membership_fee_type}
|
||||||
|
]
|
||||||
|
|
||||||
|
member = %{first_name: "M", email: "m@m.com", membership_fee_type: nil}
|
||||||
|
|
||||||
|
iodata = MembersCSV.export([member], columns)
|
||||||
|
csv = IO.iodata_to_binary(iodata)
|
||||||
|
|
||||||
|
assert csv =~ "Fee Type"
|
||||||
|
assert csv =~ "M,"
|
||||||
|
refute csv =~ "Standard"
|
||||||
|
end
|
||||||
|
|
||||||
test "CSV injection: formula-like and dangerous prefixes are escaped with apostrophe" do
|
test "CSV injection: formula-like and dangerous prefixes are escaped with apostrophe" do
|
||||||
member = %{
|
member = %{
|
||||||
first_name: "=SUM(A1:A10)",
|
first_name: "=SUM(A1:A10)",
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,37 @@ defmodule MvWeb.MemberExportControllerTest do
|
||||||
refute header =~ "unknown_field"
|
refute header =~ "unknown_field"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "export includes membership_fee_type column when requested", %{
|
||||||
|
conn: conn,
|
||||||
|
member1: m1
|
||||||
|
} do
|
||||||
|
payload = %{
|
||||||
|
"selected_ids" => [m1.id],
|
||||||
|
"member_fields" => ["first_name", "membership_fee_type", "email"],
|
||||||
|
"custom_field_ids" => [],
|
||||||
|
"query" => nil,
|
||||||
|
"sort_field" => nil,
|
||||||
|
"sort_order" => nil
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
header = body |> export_lines() |> hd()
|
||||||
|
|
||||||
|
# Fee Type column is included (label from MemberFields.label(:membership_fee_type))
|
||||||
|
assert header =~ "Fee Type"
|
||||||
|
assert body =~ "Alice"
|
||||||
|
end
|
||||||
|
|
||||||
test "export includes membership_fee_status computed field when requested", %{
|
test "export includes membership_fee_status computed field when requested", %{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
member1: m1
|
member1: m1
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,14 @@ defmodule MvWeb.MemberLive.Index.FieldVisibilityTest do
|
||||||
assert field in result
|
assert field in result
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "includes pseudo member fields (membership_fee_status, membership_fee_type, groups)" do
|
||||||
|
result = FieldVisibility.get_all_available_fields([])
|
||||||
|
|
||||||
|
assert :membership_fee_status in result
|
||||||
|
assert :membership_fee_type in result
|
||||||
|
assert :groups in result
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "merge_with_global_settings/3" do
|
describe "merge_with_global_settings/3" do
|
||||||
|
|
@ -278,6 +286,20 @@ defmodule MvWeb.MemberLive.Index.FieldVisibilityTest do
|
||||||
test "handles invalid input" do
|
test "handles invalid input" do
|
||||||
assert FieldVisibility.get_visible_member_fields(nil) == []
|
assert FieldVisibility.get_visible_member_fields(nil) == []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "returns membership_fee_type when visible in selection" do
|
||||||
|
selection = %{
|
||||||
|
"first_name" => true,
|
||||||
|
"membership_fee_type" => true,
|
||||||
|
"groups" => false
|
||||||
|
}
|
||||||
|
|
||||||
|
result = FieldVisibility.get_visible_member_fields(selection)
|
||||||
|
|
||||||
|
assert :membership_fee_type in result
|
||||||
|
assert :first_name in result
|
||||||
|
refute :groups in result
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "get_visible_custom_fields/1" do
|
describe "get_visible_custom_fields/1" do
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue