Actionsync / test_production_engine.py
barathvasan-dev
Docs: Add comprehensive query examples and production test suite
48e12b8
Raw
History Blame Contribute Delete
9.61 kB
#!/usr/bin/env python3
"""
COMPREHENSIVE TEST SUITE for Production-Grade NLP Engine
Tests all query types and filter combinations
Run: python test_production_engine.py
"""
import sys
from database import FilterExtractor, ask_llm
def test_basic_filters():
"""Test basic single-filter extraction"""
print("\n" + "="*70)
print("TEST 1: BASIC FILTERS")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("show TN vehicles", {"state": "TN"}),
("show buses", {"vehicle_type": "bus"}),
("show vehicles in adyar", {"location": "adyar"}),
("track TN63MB3157", {"plate": "TN63MB3157"}),
]
for query, expected_filters in test_cases:
filters = extractor.extract_filters(query)
status = "βœ…" if all(
filters.get(k) == v for k, v in expected_filters.items()
) else "❌"
print(f"{status} {query}")
print(f" Extracted: {expected_filters}")
def test_multi_filters():
"""Test multi-filter extraction"""
print("\n" + "="*70)
print("TEST 2: MULTI-FILTER COMBINATIONS")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("show TN buses in adyar",
{"state": "TN", "vehicle_type": "bus", "location": "adyar"}),
("show Karnataka cars in velachery",
{"state": "KA", "vehicle_type": "car", "location": "velachery"}),
("show TN buses in besant nagar on monday",
{"state": "TN", "vehicle_type": "bus", "location": "besant nagar", "day": "Monday"}),
]
for query, expected_filters in test_cases:
filters = extractor.extract_filters(query)
status = "βœ…" if all(
filters.get(k) == v for k, v in expected_filters.items()
) else "❌"
print(f"{status} {query}")
def test_date_range():
"""Test date range extraction"""
print("\n" + "="*70)
print("TEST 3: DATE RANGE EXTRACTION")
print("="*70)
extractor = FilterExtractor()
test_cases = [
"show vehicles from 01-05-2026 to 10-05-2026",
"show buses between 2026-05-01 and 2026-05-10",
"show vehicles from 01/05/2026 to 10/05/2026",
]
for query in test_cases:
filters = extractor.extract_filters(query)
date_range = filters.get("date_range")
if date_range:
print(f"βœ… {query}")
print(f" Start: {date_range['start']}, End: {date_range['end']}")
else:
print(f"❌ {query}")
def test_time_range():
"""Test time range extraction"""
print("\n" + "="*70)
print("TEST 4: TIME RANGE EXTRACTION")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("show vehicles after 8 PM", {"start": 20, "end": 23}),
("show vehicles before 6 AM", {"start": 0, "end": 6}),
("show vehicles between 6 PM and 9 PM", {"start": 18, "end": 21}),
("show vehicles in the morning", {"start": 5, "end": 12}),
("show vehicles in the evening", {"start": 17, "end": 21}),
]
for query, expected_range in test_cases:
filters = extractor.extract_filters(query)
time_range = filters.get("time_range")
if time_range:
if (time_range.get("start") == expected_range["start"] and
time_range.get("end") == expected_range["end"]):
print(f"βœ… {query}")
else:
print(f"⚠️ {query}")
print(f" Expected: {expected_range}, Got: {time_range}")
else:
print(f"❌ {query}")
def test_intent_detection():
"""Test intent detection"""
print("\n" + "="*70)
print("TEST 5: INTENT DETECTION")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("track TN63MB3157", ["tracking"]),
("count buses", ["count"]),
("show top vehicles", ["top", "analytics"]),
("show hourly traffic", ["hourly", "analytics"]),
("show suspicious vehicles", ["suspicious", "analytics"]),
("show vehicles in multiple locations", ["location_based"]),
]
for query, expected_intents in test_cases:
intents = extractor.detect_intents(query)
detected = [k for k, v in intents.items() if v]
match = all(intent in detected for intent in expected_intents)
status = "βœ…" if match else "⚠️"
print(f"{status} {query}")
print(f" Intents: {', '.join(detected) if detected else 'general'}")
def test_sql_generation():
"""Test SQL generation for various queries"""
print("\n" + "="*70)
print("TEST 6: SQL GENERATION")
print("="*70)
test_cases = [
"show TN buses",
"show buses in adyar",
"show TN buses in adyar from 01-05-2026 to 10-05-2026",
"show vehicles after 8 PM",
"show buses between 6 PM and 9 PM",
"count TN vehicles",
"track TN63MB3157",
"show top vehicles",
"show hourly traffic",
"show suspicious vehicles",
]
for query in test_cases:
sql = ask_llm(query)
# Validate SQL
if sql.strip().startswith("SELECT"):
print(f"βœ… {query}")
# Show first line of SQL
first_line = sql.split("\n")[0]
print(f" {first_line}...")
else:
print(f"❌ {query}")
print(f" Invalid SQL: {sql[:50]}...")
def test_complex_queries():
"""Test complex multi-dimension queries"""
print("\n" + "="*70)
print("TEST 7: COMPLEX MULTI-DIMENSION QUERIES")
print("="*70)
complex_queries = [
"show TN buses in adyar from 01-05-2026 to 10-05-2026 after 8 PM",
"show TN high-confidence buses detected in multiple locations",
"show Kerala cars in velachery on weekend between 6 PM and 9 PM",
"count vehicles in adyar from 01-05-2026 to 10-05-2026",
"track TN63MB3157 in adyar on monday",
]
for query in complex_queries:
sql = ask_llm(query)
if "SELECT" in sql and "FROM vehicle_logs" in sql:
print(f"βœ… {query}")
else:
print(f"❌ {query}")
def test_location_variants():
"""Test location variant matching"""
print("\n" + "="*70)
print("TEST 8: LOCATION VARIANT MATCHING")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("adyar", "adyar"),
("besant nagar", "besant nagar"),
("besant", "besant nagar"),
("t nagar", "t nagar"),
("tnagar", "t nagar"),
("anna nagar", "anna nagar"),
("anna", "anna nagar"),
("velachery", "velachery"),
]
for query_location, expected in test_cases:
filters = extractor.extract_filters(f"show vehicles in {query_location}")
location = filters.get("location")
status = "βœ…" if location == expected else "❌"
print(f"{status} '{query_location}' β†’ '{location}'")
def test_vehicle_synonyms():
"""Test vehicle type synonym matching"""
print("\n" + "="*70)
print("TEST 9: VEHICLE TYPE SYNONYMS")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("buses", "bus"),
("truck", "truck"),
("lorry", "truck"),
("motorcycle", "bike"),
("motorbike", "bike"),
("autorickshaw", "auto"),
("auto-rickshaw", "auto"),
("compact", "car"),
("sedan", "car"),
("cabs", "taxi"),
]
for query_type, expected in test_cases:
filters = extractor.extract_filters(f"show {query_type}")
vehicle_type = filters.get("vehicle_type")
status = "βœ…" if vehicle_type == expected else "❌"
print(f"{status} '{query_type}' β†’ '{vehicle_type}'")
def test_confidence_threshold():
"""Test confidence threshold extraction"""
print("\n" + "="*70)
print("TEST 10: CONFIDENCE THRESHOLD")
print("="*70)
extractor = FilterExtractor()
test_cases = [
("show vehicles with 0.9 confidence", 0.9),
("show high confidence detections above 0.95", 0.95),
("vehicles with 0.85 confidence", 0.85),
]
for query, expected_conf in test_cases:
filters = extractor.extract_filters(query)
confidence = filters.get("confidence")
if confidence:
status = "βœ…" if abs(confidence - expected_conf) < 0.01 else "⚠️"
print(f"{status} {query}")
print(f" Confidence: {confidence}")
else:
print(f"⚠️ {query}")
print(f" Confidence not extracted")
def run_all_tests():
"""Run all test suites"""
print("\n\n")
print("β•”" + "═"*68 + "β•—")
print("β•‘" + " "*68 + "β•‘")
print("β•‘" + " PRODUCTION-GRADE NLP ENGINE TEST SUITE ".center(68) + "β•‘")
print("β•‘" + " "*68 + "β•‘")
print("β•š" + "═"*68 + "╝")
try:
test_basic_filters()
test_multi_filters()
test_date_range()
test_time_range()
test_intent_detection()
test_sql_generation()
test_complex_queries()
test_location_variants()
test_vehicle_synonyms()
test_confidence_threshold()
print("\n" + "="*70)
print("βœ… ALL TESTS COMPLETED")
print("="*70 + "\n")
except Exception as e:
print(f"\n❌ Test failed with error: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
run_all_tests()