""" Tests de sécurité - Sanitization des entrées utilisateur. Ces tests vérifient: - Protection contre XSS - Protection contre l'injection - Gestion des entrées malveillantes """ import pytest import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent.parent)) from utils.preprocessing import preprocess_product_text, validate_text_input # ============================================================================= # TESTS XSS Prevention # ============================================================================= @pytest.mark.security class TestXSSPrevention: """Tests de prévention XSS.""" XSS_PAYLOADS = [ # Script tags "", "", "", # Event handlers "", "", "", "", "", ] for payload in nested_payloads: result = preprocess_product_text(payload, "") assert "", "", "", "
", # Balises de style "", "", # Meta refresh "", # Base tag hijacking "", ] @pytest.mark.parametrize("payload", HTML_PAYLOADS) def test_html_injection_blocked(self, payload): """Les balises HTML dangereuses sont supprimées.""" result = preprocess_product_text(payload, "") result_lower = result.lower() assert "" * 1000 result = preprocess_product_text(nested, "") assert isinstance(result, str) assert "
" not in result def test_repeated_patterns_handled(self): """Les patterns répétés sont gérés.""" # Tentative de ReDoS repeated = "a" * 10000 + "b" result = preprocess_product_text(repeated, "") assert isinstance(result, str) def test_unicode_bomb_handled(self): """Les 'unicode bombs' sont gérés.""" # Caractères Unicode qui peuvent causer des problèmes unicode_bomb = "\ufeff" * 1000 + "content" result = preprocess_product_text(unicode_bomb, "") assert isinstance(result, str) # ============================================================================= # TESTS Input Validation # ============================================================================= @pytest.mark.security class TestInputValidation: """Tests de validation des entrées.""" def test_validate_rejects_empty(self): """La validation rejette les entrées vides.""" is_valid, message = validate_text_input("") assert is_valid is False def test_validate_rejects_whitespace_only(self): """La validation rejette les espaces seuls.""" is_valid, message = validate_text_input(" \t\n ") assert is_valid is False def test_validate_rejects_none(self): """La validation rejette None.""" is_valid, message = validate_text_input(None) assert is_valid is False def test_validate_accepts_normal_input(self): """La validation accepte les entrées normales.""" is_valid, message = validate_text_input("iPhone 15 Pro Max") assert is_valid is True def test_validate_provides_error_message(self): """La validation fournit un message d'erreur.""" is_valid, message = validate_text_input("") assert isinstance(message, str) assert len(message) > 0 # ============================================================================= # TESTS Character Encoding # ============================================================================= @pytest.mark.security class TestCharacterEncoding: """Tests de gestion de l'encodage des caractères.""" def test_handles_null_bytes(self): """Les null bytes sont gérés.""" input_with_null = "Product\x00Name" result = preprocess_product_text(input_with_null, "") assert "\x00" not in result def test_handles_control_characters(self): """Les caractères de contrôle sont gérés.""" control_chars = "".join(chr(i) for i in range(32)) input_with_control = f"Product{control_chars}Name" result = preprocess_product_text(input_with_control, "") assert isinstance(result, str) def test_handles_mixed_encodings(self): """Les encodages mixtes sont gérés.""" mixed = "Téléphone 电话 телефон" result = preprocess_product_text(mixed, "") assert isinstance(result, str) def test_handles_rtl_characters(self): """Les caractères RTL sont gérés.""" rtl = "Product \u202e\u0645\u0646\u062a\u062c" result = preprocess_product_text(rtl, "") assert isinstance(result, str)