File size: 6,279 Bytes
4e96b7a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
"""
Test per configurazioni sistema.
"""
import os
import sys

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')))

import pytest
import os
from unittest.mock import patch
from config import Config, REGEX_PATTERNS

class TestConfig:
    """Test classe Config"""
    
    def test_config_attributes_exist(self):
        """Test che tutti gli attributi richiesti esistano"""
        assert hasattr(Config, 'NER_MODEL')
        assert hasattr(Config, 'AZURE_ENDPOINT')
        assert hasattr(Config, 'AZURE_API_KEY')
        assert hasattr(Config, 'DEPLOYMENT_NAME')
        
    def test_ner_model_default(self):
        """Test modello NER di default"""
        assert Config.NER_MODEL == "Davlan/bert-base-multilingual-cased-ner-hrl"
        
    def test_deployment_name_default(self):
        """Test deployment name di default"""
        assert Config.DEPLOYMENT_NAME == "gpt-4o"
        
    def test_api_version_default(self):
        """Test API version di default"""
        assert Config.AZURE_API_VERSION == "2024-02-01"
    
    @patch.dict(os.environ, {
        'AZURE_ENDPOINT': 'https://test.openai.azure.com/',
        'AZURE_API_KEY': 'test-key'
    })
    def test_azure_config_from_env(self):
        """Test lettura configurazione da environment"""
        # Reload config per leggere nuove env vars
        import importlib
        import config
        importlib.reload(config)
        
        assert config.Config.AZURE_ENDPOINT == 'https://test.openai.azure.com/'
        assert config.Config.AZURE_API_KEY == 'test-key'
    
    @patch.dict(os.environ, {}, clear=True)
    def test_azure_config_missing(self):
        """Test configurazione Azure mancante"""
        import importlib
        import config
        importlib.reload(config)
        
        assert config.Config.AZURE_ENDPOINT is None
        assert config.Config.AZURE_API_KEY is None
    
    def test_openai_api_key_set(self):
        """Test che OPENAI_API_KEY sia settata se Azure disponibile"""
        with patch.dict(os.environ, {'AZURE_API_KEY': 'test-key'}):
            import importlib
            import config
            importlib.reload(config)
            
            assert os.environ.get('OPENAI_API_KEY') == 'test-key'

class TestRegexPatterns:
    """Test pattern regex"""
    
    def test_regex_patterns_exist(self):
        """Test che tutti i pattern esistano"""
        required_patterns = ["IBAN", "EMAIL", "CF", "CARD", "PHONE"]
        
        for pattern in required_patterns:
            assert pattern in REGEX_PATTERNS
            assert isinstance(REGEX_PATTERNS[pattern], str)
            assert len(REGEX_PATTERNS[pattern]) > 0
    
    def test_iban_pattern(self):
        """Test pattern IBAN italiano"""
        import re
        pattern = re.compile(REGEX_PATTERNS["IBAN"])
        
        # IBAN valido
        assert pattern.search("IT60 X054 2811 1010 0000 0123 4567")
        assert pattern.search("IT60X05428111010000001234567")
        
        # IBAN invalido
        assert not pattern.search("GB60 X054 2811 1010 0000 0123 456")  # Non IT
        assert not pattern.search("IT60 X054")  # Troppo corto
    
    def test_email_pattern(self):
        """Test pattern email"""
        import re
        pattern = re.compile(REGEX_PATTERNS["EMAIL"])
        
        # Email valide
        assert pattern.search("test@example.com")
        assert pattern.search("user.name@domain.co.uk")
        assert pattern.search("test123@test-domain.org")
        
        # Email invalide
        assert not pattern.search("invalid-email")
        assert not pattern.search("@domain.com")
        assert not pattern.search("test@")
    
    def test_cf_pattern(self):
        """Test pattern codice fiscale"""
        import re
        pattern = re.compile(REGEX_PATTERNS["CF"])
        
        # CF valido (formato)
        assert pattern.search("RSSMRA80A01H501Z")
        assert pattern.search("VRDLCU85D15F205W")
        
        # CF invalido
        assert not pattern.search("RSSMRA80A01H501")  # Troppo corto
        assert not pattern.search("rssmra80a01h501z")  # Minuscolo
        assert not pattern.search("123456789012345")   # Solo numeri
    
    def test_card_pattern(self):
        """Test pattern carta di credito"""
        import re
        pattern = re.compile(REGEX_PATTERNS["CARD"])
        
        # Carte valide (formato)
        assert pattern.search("1234 5678 9012 3456")
        assert pattern.search("1234-5678-9012-3456")
        assert pattern.search("1234567890123456")
        
        # Carte invalide
        assert not pattern.search("1234 5678 9012")     # Troppo corto
        assert not pattern.search("abcd efgh ijkl mnop") # Lettere
    
    def test_phone_pattern(self):
        """Test pattern telefono"""
        import re
        pattern = re.compile(REGEX_PATTERNS["PHONE"])
        
        # Telefoni validi
        assert pattern.search("+39 333 1234567")
        assert pattern.search("333-123-4567")
        assert pattern.search("(02) 12345678")
        assert pattern.search("3331234567")
        
        # Telefoni invalidi
        assert not pattern.search("123")      # Troppo corto
        assert not pattern.search("abc-def")  # Lettere

class TestPatternValidation:
    """Test validazione pattern"""
    
    def test_all_patterns_compile(self):
        """Test che tutti i pattern si compilino correttamente"""
        import re
        
        for name, pattern in REGEX_PATTERNS.items():
            try:
                re.compile(pattern)
            except re.error:
                pytest.fail(f"Pattern {name} non valido: {pattern}")
    
    def test_patterns_not_empty(self):
        """Test che nessun pattern sia vuoto"""
        for name, pattern in REGEX_PATTERNS.items():
            assert pattern.strip(), f"Pattern {name} è vuoto"
    
    def test_patterns_have_word_boundaries(self):
        """Test che i pattern usino word boundaries appropriati"""
        for name, pattern in REGEX_PATTERNS.items():
            # La maggior parte dei pattern dovrebbe avere \b per word boundary
            if name in ["IBAN", "CF", "CARD", "PHONE"]:
                assert "\\b" in pattern, f"Pattern {name} dovrebbe usare word boundaries"