Minor CSV import improvements closes #509 #519

Merged
moritz merged 9 commits from issue/mitgliederverwaltung-509 into main 2026-06-03 03:02:10 +02:00
2 changed files with 60 additions and 1 deletions
Showing only changes of commit 45c9b81983 - Show all commits

View file

@ -80,7 +80,7 @@ defmodule Mv.Membership.Import.ImportRunner do
all_errors = progress.errors ++ chunk_result.errors
new_errors = Enum.take(all_errors, max_errors)
errors_truncated? = length(all_errors) > max_errors
new_warnings = progress.warnings ++ Map.get(chunk_result, :warnings, [])
new_warnings = Enum.uniq(progress.warnings ++ Map.get(chunk_result, :warnings, []))
chunks_processed = current_chunk_idx + 1
new_status = if chunks_processed >= progress.total_chunks, do: :done, else: :running

View file

@ -21,6 +21,65 @@ defmodule Mv.Membership.Import.ImportRunnerTest do
end
end
describe "merge_progress/4 warning accumulation" do
test "deduplicates identical warnings across chunks instead of growing unbounded" do
progress = %{
inserted: 0,
failed: 0,
errors: [],
warnings: ["Fee type 'Ghost' not found; using the default fee type."],
status: :running,
current_chunk: 0,
total_chunks: 3
}
chunk_result = %{
inserted: 2,
failed: 0,
errors: [],
errors_truncated?: false,
warnings: [
"Fee type 'Ghost' not found; using the default fee type.",
"Fee type 'Ghost' not found; using the default fee type."
]
}
result = ImportRunner.merge_progress(progress, chunk_result, 0)
assert result.warnings == ["Fee type 'Ghost' not found; using the default fee type."]
end
test "preserves distinct warnings while collapsing duplicates" do
progress = %{
inserted: 0,
failed: 0,
errors: [],
warnings: ["Fee type 'A' not found; using the default fee type."],
status: :running,
current_chunk: 0,
total_chunks: 2
}
chunk_result = %{
inserted: 1,
failed: 0,
errors: [],
errors_truncated?: false,
warnings: [
"Fee type 'A' not found; using the default fee type.",
"Fee type 'B' not found; using the default fee type."
]
}
result = ImportRunner.merge_progress(progress, chunk_result, 0)
assert result.warnings == [
"Fee type 'A' not found; using the default fee type.",
"Fee type 'B' not found; using the default fee type."
]
end
end
describe "read_file_entry/2" do
test "returns {:ok, content} for a readable file" do
path =