File size: 4,065 Bytes
168ae1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Test client for the FastAPI backend

import requests
import json
import time

class CodeScannerClient:
    def __init__(self, base_url="http://localhost:8000"):
        self.base_url = base_url
    
    def health_check(self):
        # Check if API is running
        try:
            response = requests.get(f"{self.base_url}/health")
            return response.json()
        except requests.exceptions.ConnectionError:
            return {"status": "error", "message": "API not reachable"}
    
    def analyze_code(self, code: str, mode="combined", detailed=False):
        # Analyze a single code snippet
        payload = {
            "code": code,
            "analysis_mode": mode,
            "detailed": detailed
        }
        
        start_time = time.time()
        response = requests.post(
            f"{self.base_url}/analyze",
            json=payload
        )
        response_time = time.time() - start_time
        
        if response.status_code == 200:
            result = response.json()
            result["response_time"] = response_time
            return result
        else:
            return {
                "error": f"API error: {response.status_code}",
                "details": response.text
            }
    
    def analyze_file(self, filepath: str):
        # Analyze code from a file
        with open(filepath, 'r') as f:
            code = f.read()
        
        return self.analyze_code(code)
    
    def batch_analyze(self, code_list: list, mode="combined"):
        # Analyze multiple code snippets
        payload = {
            "files": code_list,
            "analysis_mode": mode
        }
        
        response = requests.post(
            f"{self.base_url}/analyze/batch",
            json=payload
        )
        
        if response.status_code == 200:
            return response.json()
        else:
            return {"error": f"API error: {response.status_code}"}
    
    def upload_file(self, filepath: str):
        # Upload and analyze a file
        with open(filepath, 'rb') as f:
            files = {'file': (filepath, f, 'text/python')}
            response = requests.post(
                f"{self.base_url}/analyze/file",
                files=files
            )
        
        if response.status_code == 200:
            return response.json()
        else:
            return {"error": f"Upload error: {response.status_code}"}

# Example usage
if __name__ == "__main__":
    client = CodeScannerClient()
    
    print("🔍 Testing API Client")
    print("="*50)
    
    # 1. Health check
    print("1. Health check:")
    health = client.health_check()
    print(f"   Status: {health.get('status')}")
    
    # 2. Analyze vulnerable code
    print("\n2. Analyzing vulnerable code:")
    vulnerable_code = """def get_user(user_id):\n    query = f"SELECT * FROM users WHERE id = {user_id}"\n    return query"""
    
    result = client.analyze_code(vulnerable_code, detailed=True)
    print(f"   Security Score: {result.get('security_score')}")
    print(f"   Issues Found: {result.get('issues_count')}")
    print(f"   Response Time: {result.get('response_time', 0):.3f}s")
    
    # 3. Analyze safe code
    print("\n3. Analyzing safe code:")
    safe_code = """def get_user(user_id):\n    query = "SELECT * FROM users WHERE id = %s"\n    return execute_query(query, (user_id,))"""
    
    result = client.analyze_code(safe_code)
    print(f"   Security Score: {result.get('security_score')}")
    print(f"   Issues Found: {result.get('issues_count')}")
    
    # 4. Batch analysis
    print("\n4. Testing batch analysis:")
    batch_codes = [vulnerable_code, safe_code]
    batch_result = client.batch_analyze(batch_codes)
    
    if "results" in batch_result:
        print(f"   Processed {len(batch_result['results'])} files")
        print(f"   Average Score: {batch_result['summary'].get('average_security_score', 0):.1f}")
    
    print("\n✅ API Client Test Complete!")
    print(f"\n📚 API Documentation available at: http://localhost:8000/docs")