diff --git a/.env.test.example b/.env.test.example index ac19819..c203910 100644 --- a/.env.test.example +++ b/.env.test.example @@ -10,10 +10,13 @@ API_BASE_URL=http://localhost:3002/api # Base path (should match VITE_BASE_PATH) VITE_BASE_PATH=/uggla -# Test authentication credentials +# Authentication configuration TEST_USERNAME=admin TEST_PASSWORD=admin123 +# Skip authentication for local testing (set to 'true' to disable auth) +SKIP_AUTH=false + # Alternative configurations: # For local development: # API_BASE_URL=http://localhost:3002/api diff --git a/test_drone_data.py b/test_drone_data.py index c0af94e..3a0fdf7 100644 --- a/test_drone_data.py +++ b/test_drone_data.py @@ -23,6 +23,11 @@ warnings.filterwarnings('ignore', message='Unverified HTTPS request') API_BASE_URL = os.getenv('API_BASE_URL', 'http://localhost:3002/api') BASE_PATH = os.getenv('VITE_BASE_PATH', '').rstrip('/') +# Authentication configuration - Optional for local testing +USERNAME = os.getenv('TEST_USERNAME', 'admin') +PASSWORD = os.getenv('TEST_PASSWORD', 'admin123') +SKIP_AUTH = os.getenv('SKIP_AUTH', 'false').lower() == 'true' # Set to 'true' to skip authentication + # If BASE_PATH is set, construct the full URL if BASE_PATH and not API_BASE_URL.endswith('/api'): # Extract domain from API_BASE_URL and add base path @@ -34,6 +39,54 @@ print(f"🔗 Using API Base URL: {API_BASE_URL}") # Debug configuration DEBUG_MODE = False # Set to True to enable payload debugging +# Global variable to store authentication token +AUTH_TOKEN = None + +def authenticate(): + """Authenticate with the API and get access token""" + global AUTH_TOKEN + + if SKIP_AUTH: + return True + + login_data = { + "username": USERNAME, + "password": PASSWORD + } + + try: + print(f"🔐 Authenticating as user: {USERNAME}") + response = requests.post(f"{API_BASE_URL}/auth/login", json=login_data, verify=False) + + if response.status_code == 200: + data = response.json() + AUTH_TOKEN = data.get('token') + if AUTH_TOKEN: + print("✅ Authentication successful") + return True + else: + print("❌ No token received in response") + return False + else: + print(f"❌ Authentication failed: {response.status_code}") + print(f"Response: {response.text}") + return False + except Exception as e: + print(f"❌ Authentication error: {e}") + return False + +def get_auth_headers(): + """Get headers with authentication token""" + if SKIP_AUTH: + return {"Content-Type": "application/json"} + + if AUTH_TOKEN: + return { + "Authorization": f"Bearer {AUTH_TOKEN}", + "Content-Type": "application/json" + } + return {"Content-Type": "application/json"} + # Global variable to store devices fetched from API DEVICES = [] @@ -50,7 +103,12 @@ def fetch_devices(): """Fetch active devices from the API""" global DEVICES try: - response = requests.get(f"{API_BASE_URL}/devices/map", verify=False) + if SKIP_AUTH: + # Try without authentication first for local testing + response = requests.get(f"{API_BASE_URL}/devices/map", verify=False) + else: + response = requests.get(f"{API_BASE_URL}/devices", headers=get_auth_headers(), verify=False) + if response.status_code == 200: data = response.json() api_devices = data.get('data', []) @@ -274,7 +332,7 @@ class DroneSimulator: def send_heartbeat(device_id): """Send heartbeat to keep device online""" global DEBUG_MODE - url = f"{API_BASE_URL}/heartbeat" + url = f"{API_BASE_URL}/detectors" headers = { "Content-Type": "application/json" } @@ -314,7 +372,7 @@ def send_heartbeat(device_id): def send_detection(detection_data): """Send detection data to the API""" global DEBUG_MODE - url = f"{API_BASE_URL}/detections" + url = f"{API_BASE_URL}/detectors" headers = { "Content-Type": "application/json" } @@ -669,6 +727,19 @@ def main(): # Show current debug status print(f"🐛 Debug mode status: {'ENABLED' if DEBUG_MODE else 'DISABLED'}") + if SKIP_AUTH: + print("⚠️ AUTHENTICATION DISABLED - Running in local test mode") + + # Authenticate first (unless skipped) + if not SKIP_AUTH and not authenticate(): + print("❌ Authentication failed. Cannot proceed with test.") + print("Please check:") + print("1. Is the server running?") + print("2. Are the credentials correct?") + print(f" Username: {USERNAME}") + print("3. Set TEST_USERNAME and TEST_PASSWORD environment variables if needed") + print("4. Or set SKIP_AUTH=true to skip authentication for local testing") + return # Fetch devices from API first print("📡 Fetching active devices from API...") diff --git a/test_orlan_detection.py b/test_orlan_detection.py index acdd8b0..713d96d 100644 --- a/test_orlan_detection.py +++ b/test_orlan_detection.py @@ -27,9 +27,10 @@ warnings.filterwarnings('ignore', message='Unverified HTTPS request') API_BASE_URL = os.getenv('API_BASE_URL', 'http://localhost:3002/api') BASE_PATH = os.getenv('VITE_BASE_PATH', '').rstrip('/') -# Authentication configuration +# Authentication configuration - Optional for local testing USERNAME = os.getenv('TEST_USERNAME', 'admin') PASSWORD = os.getenv('TEST_PASSWORD', 'admin123') +SKIP_AUTH = os.getenv('SKIP_AUTH', 'false').lower() == 'true' # Set to 'true' to skip authentication # If BASE_PATH is set, construct the full URL if BASE_PATH and not API_BASE_URL.endswith('/api'): @@ -74,6 +75,9 @@ def authenticate(): def get_auth_headers(): """Get headers with authentication token""" + if SKIP_AUTH: + return {"Content-Type": "application/json"} + if AUTH_TOKEN: return { "Authorization": f"Bearer {AUTH_TOKEN}", @@ -120,7 +124,12 @@ def is_detectable(distance_km): def fetch_devices(): """Fetch devices from API""" try: - response = requests.get(f"{API_BASE_URL}/devices", headers=get_auth_headers(), verify=False) + if SKIP_AUTH: + # Try without authentication first for local testing + response = requests.get(f"{API_BASE_URL}/devices/map", verify=False) + else: + response = requests.get(f"{API_BASE_URL}/devices", headers=get_auth_headers(), verify=False) + if response.status_code == 200: data = response.json() return data.get('data', []) @@ -181,16 +190,19 @@ def run_orlan_detection_test(): print("• End position: Directly overhead (0m)") print("=" * 70) print(f"🔗 API Endpoint: {API_BASE_URL}") + if SKIP_AUTH: + print("⚠️ AUTHENTICATION DISABLED - Running in local test mode") print() - # Authenticate first - if not authenticate(): + # Authenticate first (unless skipped) + if not SKIP_AUTH and not authenticate(): print("❌ Authentication failed. Cannot proceed with test.") print("Please check:") print("1. Is the server running?") print("2. Are the credentials correct?") print(f" Username: {USERNAME}") print("3. Set TEST_USERNAME and TEST_PASSWORD environment variables if needed") + print("4. Or set SKIP_AUTH=true to skip authentication for local testing") return # Test API connectivity first diff --git a/test_orlan_scenario.py b/test_orlan_scenario.py index 1cd3fd0..210d518 100644 --- a/test_orlan_scenario.py +++ b/test_orlan_scenario.py @@ -21,9 +21,10 @@ warnings.filterwarnings('ignore', message='Unverified HTTPS request') API_BASE_URL = os.getenv('API_BASE_URL', 'http://localhost:3002/api') BASE_PATH = os.getenv('VITE_BASE_PATH', '').rstrip('/') -# Authentication configuration +# Authentication configuration - Optional for local testing USERNAME = os.getenv('TEST_USERNAME', 'admin') PASSWORD = os.getenv('TEST_PASSWORD', 'admin123') +SKIP_AUTH = os.getenv('SKIP_AUTH', 'false').lower() == 'true' # Set to 'true' to skip authentication # If BASE_PATH is set, construct the full URL if BASE_PATH and not API_BASE_URL.endswith('/api'): @@ -68,6 +69,9 @@ def authenticate(): def get_auth_headers(): """Get headers with authentication token""" + if SKIP_AUTH: + return {"Content-Type": "application/json"} + if AUTH_TOKEN: return { "Authorization": f"Bearer {AUTH_TOKEN}",