"""Tests for validation utilities."""
import pytest
from jana_mcp.tools.validation import (
require_location_filter,
validate_bbox,
validate_coordinates,
validate_date_format,
)
class TestRequireLocationFilter:
"""Test require_location_filter function."""
def test_returns_none_for_valid_bbox(self):
"""Test returns None for valid bounding box."""
args = {"location_bbox": [-122.5, 37.5, -122.0, 38.0]}
assert require_location_filter(args) is None
def test_returns_none_for_valid_point(self):
"""Test returns None for valid point."""
args = {"location_point": [-122.4, 37.8]}
assert require_location_filter(args) is None
def test_returns_none_for_valid_country_codes(self):
"""Test returns None for valid country codes."""
args = {"country_codes": ["US", "CA"]}
assert require_location_filter(args) is None
def test_returns_error_for_empty_arguments(self):
"""Test returns error for empty arguments."""
result = require_location_filter({})
assert result is not None
assert "location filter" in result.lower()
def test_returns_error_for_empty_bbox(self):
"""Test returns error for empty bounding box."""
result = require_location_filter({"location_bbox": []})
assert result is not None
def test_returns_error_for_empty_point(self):
"""Test returns error for empty point."""
result = require_location_filter({"location_point": []})
assert result is not None
def test_returns_error_for_empty_country_codes(self):
"""Test returns error for empty country codes."""
result = require_location_filter({"country_codes": []})
assert result is not None
def test_returns_error_for_insufficient_bbox_coords(self):
"""Test returns error for bbox with insufficient coordinates."""
result = require_location_filter({"location_bbox": [-122.5, 37.5]})
assert result is not None
def test_returns_error_for_insufficient_point_coords(self):
"""Test returns error for point with insufficient coordinates."""
result = require_location_filter({"location_point": [-122.5]})
assert result is not None
class TestValidateCoordinates:
"""Test validate_coordinates function."""
def test_returns_none_for_valid_coordinates(self):
"""Test returns None for valid coordinates."""
assert validate_coordinates(0.0, 0.0) is None
assert validate_coordinates(-122.4, 37.8) is None
assert validate_coordinates(180.0, 90.0) is None
assert validate_coordinates(-180.0, -90.0) is None
def test_returns_error_for_longitude_too_high(self):
"""Test returns error for longitude > 180."""
result = validate_coordinates(181.0, 0.0)
assert result is not None
assert "longitude" in result.lower()
assert "181" in result
def test_returns_error_for_longitude_too_low(self):
"""Test returns error for longitude < -180."""
result = validate_coordinates(-181.0, 0.0)
assert result is not None
assert "longitude" in result.lower()
def test_returns_error_for_latitude_too_high(self):
"""Test returns error for latitude > 90."""
result = validate_coordinates(0.0, 91.0)
assert result is not None
assert "latitude" in result.lower()
assert "91" in result
def test_returns_error_for_latitude_too_low(self):
"""Test returns error for latitude < -90."""
result = validate_coordinates(0.0, -91.0)
assert result is not None
assert "latitude" in result.lower()
class TestValidateBbox:
"""Test validate_bbox function."""
def test_returns_none_for_valid_bbox(self):
"""Test returns None for valid bounding box."""
assert validate_bbox([-122.5, 37.5, -122.0, 38.0]) is None
def test_returns_error_for_wrong_coordinate_count(self):
"""Test returns error for wrong number of coordinates."""
result = validate_bbox([-122.5, 37.5, -122.0])
assert result is not None
assert "4" in result
def test_returns_error_for_invalid_min_coordinates(self):
"""Test returns error for invalid min coordinates."""
result = validate_bbox([-200.0, 37.5, -122.0, 38.0])
assert result is not None
assert "longitude" in result.lower()
def test_returns_error_for_invalid_max_coordinates(self):
"""Test returns error for invalid max coordinates."""
result = validate_bbox([-122.5, 37.5, -122.0, 100.0])
assert result is not None
assert "latitude" in result.lower()
def test_returns_error_for_min_lon_gte_max_lon(self):
"""Test returns error when min_lon >= max_lon."""
result = validate_bbox([-122.0, 37.5, -122.5, 38.0])
assert result is not None
assert "min_lon" in result
assert "max_lon" in result
def test_returns_error_for_min_lat_gte_max_lat(self):
"""Test returns error when min_lat >= max_lat."""
result = validate_bbox([-122.5, 38.0, -122.0, 37.5])
assert result is not None
assert "min_lat" in result
assert "max_lat" in result
def test_returns_error_for_equal_lon(self):
"""Test returns error when min_lon == max_lon."""
result = validate_bbox([-122.0, 37.5, -122.0, 38.0])
assert result is not None
assert "min_lon" in result
def test_returns_error_for_equal_lat(self):
"""Test returns error when min_lat == max_lat."""
result = validate_bbox([-122.5, 37.5, -122.0, 37.5])
assert result is not None
assert "min_lat" in result
class TestValidateDateFormat:
"""Test validate_date_format function."""
def test_returns_none_for_iso_date(self):
"""Test returns None for ISO date format."""
assert validate_date_format("2024-01-15") is None
def test_returns_none_for_iso_datetime(self):
"""Test returns None for ISO datetime format."""
assert validate_date_format("2024-01-15T10:30:00") is None
def test_returns_none_for_iso_datetime_with_z(self):
"""Test returns None for ISO datetime with Z timezone."""
assert validate_date_format("2024-01-15T10:30:00Z") is None
def test_returns_none_for_iso_datetime_with_offset(self):
"""Test returns None for ISO datetime with offset."""
assert validate_date_format("2024-01-15T10:30:00+00:00") is None
def test_returns_error_for_invalid_format(self):
"""Test returns error for invalid date format."""
result = validate_date_format("15/01/2024")
assert result is not None
assert "invalid" in result.lower()
def test_returns_error_for_non_string(self):
"""Test returns error for non-string input."""
result = validate_date_format(20240115) # type: ignore[arg-type]
assert result is not None
assert "string" in result.lower()
def test_returns_error_for_garbage_string(self):
"""Test returns error for garbage string."""
result = validate_date_format("not-a-date")
assert result is not None
assert "invalid" in result.lower()
def test_returns_error_for_partial_date(self):
"""Test returns error for partial date."""
result = validate_date_format("2024-01")
assert result is not None