mirror of
https://github.com/smittix/intercept.git
synced 2026-07-07 17:18:11 -07:00
style: apply ruff-format to entire codebase
First-time run of ruff-format via pre-commit hook normalises quote style, trailing commas, and whitespace across 188 Python files. No logic changes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -38,23 +38,22 @@ DEFAULT_PORT = 5000
|
||||
# SCHEMA VALIDATORS
|
||||
# =============================================================================
|
||||
|
||||
|
||||
def validate_device_schema(device: dict, context: str = "") -> list[str]:
|
||||
"""Validate that a device dict has expected fields (backwards compatible)."""
|
||||
errors = []
|
||||
required_fields = [
|
||||
'device_id', 'address', 'rssi_current', 'last_seen', 'seen_count'
|
||||
]
|
||||
required_fields = ["device_id", "address", "rssi_current", "last_seen", "seen_count"]
|
||||
|
||||
for field in required_fields:
|
||||
if field not in device:
|
||||
errors.append(f"{context}Missing required field: {field}")
|
||||
|
||||
# New tracker fields should be present (v2) but are optional
|
||||
tracker_fields = ['is_tracker', 'tracker_type', 'tracker_confidence']
|
||||
tracker_fields = ["is_tracker", "tracker_type", "tracker_confidence"]
|
||||
for field in tracker_fields:
|
||||
if field in device:
|
||||
# Field exists, check type
|
||||
if field == 'is_tracker' and not isinstance(device[field], bool):
|
||||
if field == "is_tracker" and not isinstance(device[field], bool):
|
||||
errors.append(f"{context}is_tracker should be bool, got {type(device[field])}")
|
||||
|
||||
return errors
|
||||
@@ -64,17 +63,15 @@ def validate_tracker_schema(tracker: dict, context: str = "") -> list[str]:
|
||||
"""Validate tracker endpoint response schema."""
|
||||
errors = []
|
||||
|
||||
required_fields = [
|
||||
'device_id', 'address', 'tracker'
|
||||
]
|
||||
required_fields = ["device_id", "address", "tracker"]
|
||||
for field in required_fields:
|
||||
if field not in tracker:
|
||||
errors.append(f"{context}Missing required field: {field}")
|
||||
|
||||
# Tracker sub-object
|
||||
if 'tracker' in tracker:
|
||||
tracker_obj = tracker['tracker']
|
||||
tracker_required = ['type', 'confidence', 'evidence']
|
||||
if "tracker" in tracker:
|
||||
tracker_obj = tracker["tracker"]
|
||||
tracker_required = ["type", "confidence", "evidence"]
|
||||
for field in tracker_required:
|
||||
if field not in tracker_obj:
|
||||
errors.append(f"{context}tracker.{field} missing")
|
||||
@@ -86,12 +83,12 @@ def validate_diagnostics_schema(diagnostics: dict) -> list[str]:
|
||||
"""Validate diagnostics endpoint response schema."""
|
||||
errors = []
|
||||
|
||||
required_sections = ['system', 'bluez', 'adapters', 'permissions', 'backends']
|
||||
required_sections = ["system", "bluez", "adapters", "permissions", "backends"]
|
||||
for section in required_sections:
|
||||
if section not in diagnostics:
|
||||
errors.append(f"Missing diagnostics section: {section}")
|
||||
|
||||
if 'can_scan' not in diagnostics:
|
||||
if "can_scan" not in diagnostics:
|
||||
errors.append("Missing can_scan field")
|
||||
|
||||
return errors
|
||||
@@ -101,6 +98,7 @@ def validate_diagnostics_schema(diagnostics: dict) -> list[str]:
|
||||
# TEST CASES
|
||||
# =============================================================================
|
||||
|
||||
|
||||
class SmokeTests:
|
||||
"""Smoke test runner."""
|
||||
|
||||
@@ -128,9 +126,9 @@ class SmokeTests:
|
||||
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
|
||||
data = resp.json()
|
||||
self._check("Has 'available' field", 'available' in data or 'can_scan' in data)
|
||||
self._check("Has 'adapters' field", 'adapters' in data)
|
||||
self._check("Has 'recommended_backend' field", 'recommended_backend' in data or 'preferred_backend' in data)
|
||||
self._check("Has 'available' field", "available" in data or "can_scan" in data)
|
||||
self._check("Has 'adapters' field", "adapters" in data)
|
||||
self._check("Has 'recommended_backend' field", "recommended_backend" in data or "preferred_backend" in data)
|
||||
|
||||
except requests.RequestException as e:
|
||||
self._check("Request succeeded", False, str(e))
|
||||
@@ -143,18 +141,19 @@ class SmokeTests:
|
||||
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
|
||||
data = resp.json()
|
||||
self._check("Has 'count' field", 'count' in data)
|
||||
self._check("Has 'devices' array", 'devices' in data and isinstance(data['devices'], list))
|
||||
self._check("Has 'count' field", "count" in data)
|
||||
self._check("Has 'devices' array", "devices" in data and isinstance(data["devices"], list))
|
||||
|
||||
# If devices exist, validate schema
|
||||
if data.get('devices'):
|
||||
device = data['devices'][0]
|
||||
if data.get("devices"):
|
||||
device = data["devices"][0]
|
||||
errors = validate_device_schema(device, "First device: ")
|
||||
self._check("Device schema valid", len(errors) == 0, "; ".join(errors))
|
||||
|
||||
# Check for new tracker fields (should exist even if empty)
|
||||
self._check("Has tracker fields", 'is_tracker' in device,
|
||||
"New tracker field missing (backwards compat issue)")
|
||||
self._check(
|
||||
"Has tracker fields", "is_tracker" in device, "New tracker field missing (backwards compat issue)"
|
||||
)
|
||||
|
||||
except requests.RequestException as e:
|
||||
self._check("Request succeeded", False, str(e))
|
||||
@@ -167,13 +166,13 @@ class SmokeTests:
|
||||
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
|
||||
data = resp.json()
|
||||
self._check("Has 'count' field", 'count' in data)
|
||||
self._check("Has 'trackers' array", 'trackers' in data and isinstance(data['trackers'], list))
|
||||
self._check("Has 'summary' field", 'summary' in data)
|
||||
self._check("Has 'count' field", "count" in data)
|
||||
self._check("Has 'trackers' array", "trackers" in data and isinstance(data["trackers"], list))
|
||||
self._check("Has 'summary' field", "summary" in data)
|
||||
|
||||
# If trackers exist, validate schema
|
||||
if data.get('trackers'):
|
||||
tracker = data['trackers'][0]
|
||||
if data.get("trackers"):
|
||||
tracker = data["trackers"][0]
|
||||
errors = validate_tracker_schema(tracker, "First tracker: ")
|
||||
self._check("Tracker schema valid", len(errors) == 0, "; ".join(errors))
|
||||
|
||||
@@ -191,7 +190,7 @@ class SmokeTests:
|
||||
errors = validate_diagnostics_schema(data)
|
||||
self._check("Diagnostics schema valid", len(errors) == 0, "; ".join(errors))
|
||||
|
||||
self._check("Has recommendations", 'recommendations' in data)
|
||||
self._check("Has recommendations", "recommendations" in data)
|
||||
|
||||
except requests.RequestException as e:
|
||||
self._check("Request succeeded", False, str(e))
|
||||
@@ -204,7 +203,7 @@ class SmokeTests:
|
||||
self._check("Status code 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
|
||||
data = resp.json()
|
||||
self._check("Has 'is_scanning' field", 'is_scanning' in data)
|
||||
self._check("Has 'is_scanning' field", "is_scanning" in data)
|
||||
|
||||
except requests.RequestException as e:
|
||||
self._check("Request succeeded", False, str(e))
|
||||
@@ -218,7 +217,7 @@ class SmokeTests:
|
||||
self._check("List baselines: Status 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
|
||||
data = resp.json()
|
||||
self._check("Has 'baselines' array", 'baselines' in data)
|
||||
self._check("Has 'baselines' array", "baselines" in data)
|
||||
|
||||
except requests.RequestException as e:
|
||||
self._check("Request succeeded", False, str(e))
|
||||
@@ -242,22 +241,22 @@ class SmokeTests:
|
||||
# JSON export
|
||||
resp = requests.get(f"{self.base_url}/api/bluetooth/export?format=json", timeout=5)
|
||||
self._check("JSON export: Status 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
self._check("JSON export: Content-Type", 'application/json' in resp.headers.get('Content-Type', ''))
|
||||
self._check("JSON export: Content-Type", "application/json" in resp.headers.get("Content-Type", ""))
|
||||
|
||||
# CSV export
|
||||
resp = requests.get(f"{self.base_url}/api/bluetooth/export?format=csv", timeout=5)
|
||||
self._check("CSV export: Status 200", resp.status_code == 200, f"Got {resp.status_code}")
|
||||
self._check("CSV export: Content-Type", 'text/csv' in resp.headers.get('Content-Type', ''))
|
||||
self._check("CSV export: Content-Type", "text/csv" in resp.headers.get("Content-Type", ""))
|
||||
|
||||
except requests.RequestException as e:
|
||||
self._check("Request succeeded", False, str(e))
|
||||
|
||||
def run_all(self):
|
||||
"""Run all smoke tests."""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"\n{'=' * 60}")
|
||||
print("BLUETOOTH API SMOKE TESTS")
|
||||
print(f"Target: {self.base_url}")
|
||||
print(f"{'='*60}")
|
||||
print(f"{'=' * 60}")
|
||||
|
||||
self.test_capabilities_endpoint()
|
||||
self.test_devices_endpoint()
|
||||
@@ -268,9 +267,9 @@ class SmokeTests:
|
||||
self.test_export_endpoint()
|
||||
self.test_tscm_integration()
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print(f"\n{'=' * 60}")
|
||||
print(f"RESULTS: {self.passed} passed, {self.failed} failed")
|
||||
print(f"{'='*60}")
|
||||
print(f"{'=' * 60}")
|
||||
|
||||
if self.errors:
|
||||
print("\nFailed tests:")
|
||||
@@ -284,6 +283,7 @@ class SmokeTests:
|
||||
# MAIN
|
||||
# =============================================================================
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Bluetooth API smoke tests")
|
||||
parser.add_argument("--host", default=DEFAULT_HOST, help="Server host")
|
||||
|
||||
Reference in New Issue
Block a user