Add reusable people list import and export
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
import pytest
|
||||
|
||||
from mka.application.meeting_service import ParticipantInput
|
||||
from mka.application.people_yaml import (
|
||||
PeopleYamlError,
|
||||
export_people_yaml,
|
||||
import_people_yaml,
|
||||
)
|
||||
|
||||
|
||||
def sample_people() -> list[ParticipantInput]:
|
||||
return [
|
||||
ParticipantInput(
|
||||
participant_id="participant-35c1528c",
|
||||
display_name="Martin Tazl",
|
||||
role="Beirat",
|
||||
organization="Verwaltungsbeirat",
|
||||
attendance_status="present",
|
||||
),
|
||||
ParticipantInput(
|
||||
participant_id="participant-56aae811",
|
||||
display_name="Norbert Hebbelmann",
|
||||
role="Gast",
|
||||
organization="Eigentümergemeinschaft",
|
||||
attendance_status="mentioned_only",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def test_export_import_round_trip_preserves_all_people_fields() -> None:
|
||||
people = sample_people()
|
||||
|
||||
exported = export_people_yaml(people)
|
||||
|
||||
assert exported.startswith("version: 1\npeople:\n")
|
||||
assert import_people_yaml(exported) == people
|
||||
assert export_people_yaml(import_people_yaml(exported)) == exported
|
||||
|
||||
|
||||
def test_import_preserves_stable_ids_roles_organizations_and_attendance() -> None:
|
||||
imported = import_people_yaml(export_people_yaml(sample_people()))
|
||||
|
||||
assert [person.participant_id for person in imported] == [
|
||||
"participant-35c1528c",
|
||||
"participant-56aae811",
|
||||
]
|
||||
assert imported[0].role == "Beirat"
|
||||
assert imported[1].organization == "Eigentümergemeinschaft"
|
||||
assert [person.attendance_status for person in imported] == [
|
||||
"present",
|
||||
"mentioned_only",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("content", ["people: [", b"\xff\xfe"])
|
||||
def test_malformed_yaml_is_rejected(content: str | bytes) -> None:
|
||||
with pytest.raises(PeopleYamlError, match="Malformed People YAML"):
|
||||
import_people_yaml(content)
|
||||
|
||||
|
||||
def test_unsupported_version_is_rejected() -> None:
|
||||
with pytest.raises(PeopleYamlError, match="Unsupported People YAML version"):
|
||||
import_people_yaml("version: 2\npeople: []\n")
|
||||
|
||||
|
||||
def test_missing_id_is_rejected() -> None:
|
||||
content = """\
|
||||
version: 1
|
||||
people:
|
||||
- display_name: Martin Tazl
|
||||
attendance_status: present
|
||||
"""
|
||||
|
||||
with pytest.raises(PeopleYamlError, match="participant_id"):
|
||||
import_people_yaml(content)
|
||||
|
||||
|
||||
def test_invalid_id_is_rejected_without_generating_a_replacement() -> None:
|
||||
content = """\
|
||||
version: 1
|
||||
people:
|
||||
- participant_id: invalid id
|
||||
display_name: Martin
|
||||
attendance_status: present
|
||||
"""
|
||||
|
||||
with pytest.raises(PeopleYamlError, match="invalid participant_id"):
|
||||
import_people_yaml(content)
|
||||
|
||||
|
||||
def test_duplicate_id_is_rejected() -> None:
|
||||
content = """\
|
||||
version: 1
|
||||
people:
|
||||
- participant_id: martin
|
||||
display_name: Martin
|
||||
attendance_status: present
|
||||
- participant_id: martin
|
||||
display_name: Martin Duplicate
|
||||
attendance_status: mentioned_only
|
||||
"""
|
||||
|
||||
with pytest.raises(PeopleYamlError, match="Duplicate participant_id"):
|
||||
import_people_yaml(content)
|
||||
|
||||
|
||||
def test_invalid_attendance_is_rejected() -> None:
|
||||
content = """\
|
||||
version: 1
|
||||
people:
|
||||
- participant_id: martin
|
||||
display_name: Martin
|
||||
attendance_status: absent
|
||||
"""
|
||||
|
||||
with pytest.raises(PeopleYamlError, match="invalid attendance_status"):
|
||||
import_people_yaml(content)
|
||||
|
||||
|
||||
def test_failed_import_does_not_mutate_existing_people() -> None:
|
||||
existing = sample_people()
|
||||
snapshot = list(existing)
|
||||
|
||||
with pytest.raises(PeopleYamlError):
|
||||
import_people_yaml("version: 1\npeople: not-a-list\n")
|
||||
|
||||
assert existing == snapshot
|
||||
Reference in New Issue
Block a user