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