from fan_passport.moderation import ( InMemoryModerationRepository, ModerationStatus, SanctionAction, TextModerator, normalise_public_text, recommended_sanction_for_case, ) def test_display_name_normalisation_and_approval() -> None: moderator = TextModerator() result = moderator.screen_display_name(" Lionesses ") assert result.status == ModerationStatus.APPROVED assert result.safe_text == "Lionesses" assert result.findings == () def test_display_name_rejects_official_impersonation() -> None: moderator = TextModerator() result = moderator.screen_display_name("FIFA Admin") assert result.status == ModerationStatus.REJECTED assert any(finding.code == "protected_role_impersonation" for finding in result.findings) def test_public_text_with_giveaway_goes_to_review_queue() -> None: moderator = TextModerator() repository = InMemoryModerationRepository() result = moderator.screen_text("World Cup sticker giveaway after the match!", context="prediction_note") case = moderator.open_case_if_needed(repository, user_id="user-1", result=result) assert result.status == ModerationStatus.NEEDS_REVIEW assert case is not None assert repository.list_open_cases() == (case,) assert recommended_sanction_for_case(case) == SanctionAction.NONE def test_contact_information_is_rejected_and_recommended_hidden() -> None: moderator = TextModerator() repository = InMemoryModerationRepository() result = moderator.screen_text("message me at fan@example.com for tickets", context="profile_bio") case = moderator.open_case_if_needed(repository, user_id="user-2", result=result) assert result.status == ModerationStatus.REJECTED assert case is not None assert recommended_sanction_for_case(case) == SanctionAction.HIDE_CONTENT def test_hidden_characters_are_removed_before_storage() -> None: assert normalise_public_text("Eng\u200bland\n\nfans") == "England fans"