File size: 3,926 Bytes
790e0e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Tests for Safety Validator
"""
import pytest
from database.safety_validator import SafetyValidator


class TestSafetyValidator:
    """Test cases for SQL safety validation"""
    
    def setup_method(self):
        """Set up test fixtures"""
        self.validator = SafetyValidator()
    
    def test_valid_select_query(self):
        """Test that valid SELECT queries pass validation"""
        query = "SELECT * FROM cars WHERE make = 'BMW'"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is True
        assert error == ""
    
    def test_delete_query_blocked(self):
        """Test that DELETE queries are blocked"""
        query = "DELETE FROM cars WHERE id = 1"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "DELETE" in error
    
    def test_drop_query_blocked(self):
        """Test that DROP queries are blocked"""
        query = "DROP TABLE cars"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "DROP" in error
    
    def test_update_query_blocked(self):
        """Test that UPDATE queries are blocked"""
        query = "UPDATE cars SET price = 0"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "UPDATE" in error
    
    def test_insert_query_blocked(self):
        """Test that INSERT queries are blocked"""
        query = "INSERT INTO cars VALUES (1, 'test')"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "INSERT" in error
    
    def test_truncate_query_blocked(self):
        """Test that TRUNCATE queries are blocked"""
        query = "TRUNCATE TABLE cars"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "TRUNCATE" in error
    
    def test_alter_query_blocked(self):
        """Test that ALTER queries are blocked"""
        query = "ALTER TABLE cars ADD COLUMN test VARCHAR(50)"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "ALTER" in error
    
    def test_empty_query(self):
        """Test that empty queries are rejected"""
        query = ""
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "Empty query" in error
    
    def test_non_select_query(self):
        """Test that non-SELECT queries are rejected"""
        query = "SHOW TABLES"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
        assert "Only SELECT" in error
    
    def test_sql_injection_attempt(self):
        """Test that SQL injection patterns are detected"""
        query = "SELECT * FROM cars; DELETE FROM cars"
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is False
    
    def test_complex_select_query(self):
        """Test that complex SELECT queries pass"""
        query = """
            SELECT make, model, AVG(sellingprice) as avg_price
            FROM cars
            WHERE year > 2010
            GROUP BY make, model
            ORDER BY avg_price DESC
            LIMIT 10
        """
        is_valid, error = self.validator.validate_query(query)
        assert is_valid is True
        assert error == ""
    
    def test_case_insensitive_blocking(self):
        """Test that dangerous keywords are blocked regardless of case"""
        queries = [
            "delete from cars",
            "DELETE FROM cars",
            "DeLeTe FrOm cars"
        ]
        
        for query in queries:
            is_valid, error = self.validator.validate_query(query)
            assert is_valid is False
            assert "DELETE" in error.upper()


if __name__ == "__main__":
    pytest.main([__file__, "-v"])