Merge branch 'main' into feat/447_concistency
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing

This commit is contained in:
carla 2026-02-25 16:52:33 +01:00
commit c7c082b867
27 changed files with 926 additions and 131 deletions

View file

@ -80,15 +80,9 @@ defmodule Mv.Membership.MemberTest do
assert {:ok, _member} = Membership.create_member(attrs, actor: actor)
end
test "Postal code is optional but must have 5 digits if specified", %{actor: actor} do
attrs = Map.put(@valid_attrs, :postal_code, "1234")
assert {:error, %Ash.Error.Invalid{errors: errors}} =
Membership.create_member(attrs, actor: actor)
assert error_message(errors, :postal_code) =~ "must consist of 5 digits"
attrs2 = Map.delete(@valid_attrs, :postal_code)
assert {:ok, _member} = Membership.create_member(attrs2, actor: actor)
test "Postal code is optional", %{actor: actor} do
attrs = Map.delete(@valid_attrs, :postal_code)
assert {:ok, _member} = Membership.create_member(attrs, actor: actor)
end
end

View file

@ -207,9 +207,15 @@ defmodule Mv.Membership.Import.HeaderMapperTest do
"Email",
"First Name",
"Last Name",
"Join Date",
"Exit Date",
"Notes",
"Country",
"City",
"Street",
"House Number",
"Postal Code",
"City"
"Membership Fee Start Date"
]
assert {:ok, %{member: member_map, custom: custom_map, unknown: unknown}} =
@ -218,15 +224,34 @@ defmodule Mv.Membership.Import.HeaderMapperTest do
assert member_map[:email] == 0
assert member_map[:first_name] == 1
assert member_map[:last_name] == 2
assert member_map[:street] == 3
assert member_map[:postal_code] == 4
assert member_map[:city] == 5
assert member_map[:join_date] == 3
assert member_map[:exit_date] == 4
assert member_map[:notes] == 5
assert member_map[:country] == 6
assert member_map[:city] == 7
assert member_map[:street] == 8
assert member_map[:house_number] == 9
assert member_map[:postal_code] == 10
assert member_map[:membership_fee_start_date] == 11
assert custom_map == %{}
assert unknown == []
end
test "maps German member field variants" do
headers = ["E-Mail", "Vorname", "Nachname", "Straße", "PLZ", "Stadt"]
headers = [
"E-Mail",
"Vorname",
"Nachname",
"Beitrittsdatum",
"Austrittsdatum",
"Notizen",
"Land",
"Stadt",
"Straße",
"Hausnummer",
"PLZ",
"Beitragsbeginn"
]
assert {:ok, %{member: member_map, custom: custom_map, unknown: unknown}} =
HeaderMapper.build_maps(headers, [])
@ -234,9 +259,15 @@ defmodule Mv.Membership.Import.HeaderMapperTest do
assert member_map[:email] == 0
assert member_map[:first_name] == 1
assert member_map[:last_name] == 2
assert member_map[:street] == 3
assert member_map[:postal_code] == 4
assert member_map[:city] == 5
assert member_map[:join_date] == 3
assert member_map[:exit_date] == 4
assert member_map[:notes] == 5
assert member_map[:country] == 6
assert member_map[:city] == 7
assert member_map[:street] == 8
assert member_map[:house_number] == 9
assert member_map[:postal_code] == 10
assert member_map[:membership_fee_start_date] == 11
assert custom_map == %{}
assert unknown == []
end

View file

@ -24,6 +24,7 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
:house_number,
:postal_code,
:city,
:country,
:join_date
]
@ -100,6 +101,7 @@ defmodule MvWeb.Components.SortHeaderComponentTest do
assert has_element?(view, "[data-testid='street'] .opacity-40")
assert has_element?(view, "[data-testid='house_number'] .opacity-40")
assert has_element?(view, "[data-testid='postal_code'] .opacity-40")
assert has_element?(view, "[data-testid='country'] .opacity-40")
assert has_element?(view, "[data-testid='join_date'] .opacity-40")
end

View file

@ -45,11 +45,11 @@ defmodule MvWeb.GlobalSettingsLiveConfigTest do
{:ok, view, _html} = live(conn, ~p"/admin/import")
# Generate CSV with 501 rows (exceeding custom limit of 500)
header = "first_name;last_name;email;street;postal_code;city\n"
header = "first_name;last_name;email;country;city;street;postal_code\n"
rows =
for i <- 1..501 do
"Row#{i};Last#{i};email#{i}@example.com;Street#{i};12345;City#{i}\n"
"Row#{i};Last#{i};email#{i}@example.com;Country#{i};City#{i};Street#{i};12345\n"
end
large_csv = header <> Enum.join(rows)

View file

@ -136,10 +136,10 @@ defmodule MvWeb.ImportLiveTest do
test "error list is capped and truncation message is shown", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/import")
header = "first_name;last_name;email;street;postal_code;city\n"
header = "first_name;last_name;email;country;city;street;postal_code\n"
invalid_rows =
for i <- 1..100, do: "Row#{i};Last#{i};;Street#{i};12345;City#{i}\n"
for i <- 1..100, do: "Row#{i};Last#{i};;Country#{i};City#{i};Street#{i};12345\n"
upload_csv_file(view, header <> Enum.join(invalid_rows), "large_invalid.csv")
submit_import(view)
@ -154,11 +154,11 @@ defmodule MvWeb.ImportLiveTest do
test "row limit is enforced (1001 rows rejected)", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/import")
header = "first_name;last_name;email;street;postal_code;city\n"
header = "first_name;last_name;email;country;city;street;postal_code\n"
rows =
for i <- 1..1001 do
"Row#{i};Last#{i};email#{i}@example.com;Street#{i};12345;City#{i}\n"
"Row#{i};Last#{i};email#{i}@example.com;Country#{i};City#{i};Street#{i};12345\n"
end
upload_csv_file(view, header <> Enum.join(rows), "too_many_rows.csv")
@ -235,11 +235,10 @@ defmodule MvWeb.ImportLiveTest do
test "page loads and shows import form", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/import")
assert has_element?(view, "[data-testid='import-page']")
assert has_element?(view, "[data-testid='csv-upload-form']")
assert has_element?(view, "[data-testid='start-import-button']")
assert has_element?(view, "[data-testid='custom-fields-link']")
html = render(view)
assert html =~ "Import Members (CSV)"
end
test "template links and file input are present", %{conn: conn} do

View file

@ -16,6 +16,7 @@ defmodule MvWeb.MemberLive.IndexMemberFieldsDisplayTest do
house_number: "123",
postal_code: "12345",
city: "Berlin",
country: "Germany",
join_date: ~D[2020-01-15]
},
actor: system_actor

View file

@ -191,6 +191,7 @@ defmodule MvWeb.MemberLive.IndexTest do
:house_number,
:postal_code,
:city,
:country,
:join_date
]