tests/gateway/test_pairing.py::TestSecureWrite::test_creates_parent_dirs tests/gateway/test_pairing.py::TestSecureWrite::test_sets_file_permissions tests/gateway/test_pairing.py::TestCodeGeneration::test_code_format tests/gateway/test_pairing.py::TestCodeGeneration::test_code_uniqueness tests/gateway/test_pairing.py::TestCodeGeneration::test_stores_pending_entry tests/gateway/test_pairing.py::TestHashedStorage::test_pending_file_contains_hash_and_salt tests/gateway/test_pairing.py::TestHashedStorage::test_plaintext_code_not_stored tests/gateway/test_pairing.py::TestHashedStorage::test_valid_code_verifies_against_hash tests/gateway/test_pairing.py::TestHashedStorage::test_invalid_code_rejected tests/gateway/test_pairing.py::TestHashedStorage::test_different_salts_per_entry tests/gateway/test_pairing.py::TestHashedStorage::test_hash_code_static_method tests/gateway/test_pairing.py::TestLegacyPendingFileCompat::test_approve_code_ignores_legacy_entries tests/gateway/test_pairing.py::TestLegacyPendingFileCompat::test_list_pending_handles_legacy_entries tests/gateway/test_pairing.py::TestLegacyPendingFileCompat::test_cleanup_expired_removes_legacy_at_ttl tests/gateway/test_pairing.py::TestLegacyPendingFileCompat::test_cleanup_expired_handles_malformed_entries tests/gateway/test_pairing.py::TestLegacyPendingFileCompat::test_approve_code_skips_malformed_entries tests/gateway/test_pairing.py::TestRateLimiting::test_same_user_rate_limited tests/gateway/test_pairing.py::TestRateLimiting::test_different_users_not_rate_limited tests/gateway/test_pairing.py::TestRateLimiting::test_rate_limit_expires tests/gateway/test_pairing.py::TestRateLimiting::test_whatsapp_alias_flip_hits_same_rate_limit tests/gateway/test_pairing.py::TestMaxPending::test_max_pending_per_platform tests/gateway/test_pairing.py::TestMaxPending::test_different_platforms_independent tests/gateway/test_pairing.py::TestApprovalFlow::test_approve_valid_code tests/gateway/test_pairing.py::TestApprovalFlow::test_approved_user_is_approved tests/gateway/test_pairing.py::TestApprovalFlow::test_unapproved_user_not_approved tests/gateway/test_pairing.py::TestApprovalFlow::test_approve_removes_from_pending tests/gateway/test_pairing.py::TestApprovalFlow::test_approve_case_insensitive tests/gateway/test_pairing.py::TestApprovalFlow::test_approve_strips_whitespace tests/gateway/test_pairing.py::TestApprovalFlow::test_invalid_code_returns_none tests/gateway/test_pairing.py::TestApprovalFlow::test_whatsapp_approved_user_survives_alias_flip tests/gateway/test_pairing.py::TestApprovalFlow::test_whatsapp_legacy_raw_jid_approval_survives_alias_flip tests/gateway/test_pairing.py::TestLockout::test_lockout_after_max_failures tests/gateway/test_pairing.py::TestLockout::test_lockout_blocks_code_generation tests/gateway/test_pairing.py::TestLockout::test_lockout_blocks_code_approval tests/gateway/test_pairing.py::TestLockout::test_lockout_expires tests/gateway/test_pairing.py::TestCodeExpiry::test_expired_codes_cleaned_up tests/gateway/test_pairing.py::TestCodeExpiry::test_expired_code_cannot_be_approved tests/gateway/test_pairing.py::TestRevoke::test_revoke_approved_user tests/gateway/test_pairing.py::TestRevoke::test_revoke_nonexistent_returns_false tests/gateway/test_pairing.py::TestListAndClear::test_list_approved tests/gateway/test_pairing.py::TestListAndClear::test_list_approved_all_platforms tests/gateway/test_pairing.py::TestListAndClear::test_clear_pending tests/gateway/test_pairing.py::TestListAndClear::test_clear_pending_all_platforms