MHamdan's picture
Initial commit: SPARKNET framework
a9dc537
"""
Quick test script for SPARKNET FastAPI backend
Tests all major endpoints with a sample patent.
"""
import requests
import json
import time
from pathlib import Path
from rich.console import Console
from rich.table import Table
from rich.progress import Progress, SpinnerColumn, TextColumn
console = Console()
API_BASE = "http://localhost:8000"
def test_health():
"""Test health endpoint"""
console.print("\n[bold blue]1. Testing Health Endpoint[/bold blue]")
response = requests.get(f"{API_BASE}/api/health")
data = response.json()
console.print(f"Status: [green]{data['status']}[/green]")
console.print(f"Active Workflows: {data['statistics']['active_workflows']}")
console.print(f"Processed Patents: {data['statistics']['processed_patents']}")
return response.status_code == 200
def test_upload(patent_path):
"""Test patent upload"""
console.print("\n[bold blue]2. Testing Patent Upload[/bold blue]")
if not Path(patent_path).exists():
console.print(f"[red]Patent file not found: {patent_path}[/red]")
console.print("[yellow]Using mock upload test (no actual file)[/yellow]")
return None
with open(patent_path, 'rb') as f:
files = {'file': (Path(patent_path).name, f, 'application/pdf')}
response = requests.post(f"{API_BASE}/api/patents/upload", files=files)
if response.status_code == 200:
data = response.json()
console.print(f"[green]✓[/green] Patent uploaded successfully")
console.print(f"Patent ID: {data['patent_id']}")
console.print(f"Filename: {data['filename']}")
console.print(f"Size: {data['size']} bytes")
return data['patent_id']
else:
console.print(f"[red]✗[/red] Upload failed: {response.text}")
return None
def test_workflow(patent_id):
"""Test workflow execution"""
console.print("\n[bold blue]3. Testing Workflow Execution[/bold blue]")
payload = {"patent_id": patent_id, "scenario": "patent_wakeup"}
response = requests.post(
f"{API_BASE}/api/workflows/execute",
json=payload
)
if response.status_code == 200:
data = response.json()
console.print(f"[green]✓[/green] Workflow started")
console.print(f"Workflow ID: {data['workflow_id']}")
return data['workflow_id']
else:
console.print(f"[red]✗[/red] Workflow start failed: {response.text}")
return None
def monitor_workflow(workflow_id):
"""Monitor workflow progress"""
console.print("\n[bold blue]4. Monitoring Workflow Progress[/bold blue]")
with Progress(
SpinnerColumn(),
TextColumn("[progress.description]{task.description}"),
console=console
) as progress:
task = progress.add_task("Processing workflow...", total=100)
while True:
response = requests.get(f"{API_BASE}/api/workflows/{workflow_id}")
if response.status_code != 200:
console.print("[red]Failed to get workflow status[/red]")
break
data = response.json()
status = data['status']
prog = data.get('progress', 0)
current_step = data.get('current_step', 'initializing')
progress.update(task, completed=prog, description=f"Step: {current_step}")
if status in ['completed', 'failed']:
break
time.sleep(2)
# Get final result
response = requests.get(f"{API_BASE}/api/workflows/{workflow_id}")
data = response.json()
if data['status'] == 'completed':
console.print(f"\n[green]✓ Workflow completed successfully![/green]")
display_results(data['result'])
else:
console.print(f"\n[red]✗ Workflow failed: {data.get('error', 'Unknown error')}[/red]")
def display_results(result):
"""Display workflow results"""
console.print("\n[bold]Analysis Results:[/bold]\n")
# Quality and timing
console.print(f"Quality Score: [blue]{result.get('quality_score', 0):.2f}[/blue]")
# Document Analysis
doc_analysis = result.get('document_analysis', {})
if doc_analysis:
console.print(f"\n[bold]Patent Analysis:[/bold]")
console.print(f" TRL Level: {doc_analysis.get('trl_level', 'N/A')}/9")
console.print(f" Key Innovations: {len(doc_analysis.get('key_innovations', []))}")
# Market Analysis
market_analysis = result.get('market_analysis', {})
if market_analysis:
opportunities = market_analysis.get('opportunities', [])
console.print(f"\n[bold]Market Opportunities:[/bold]")
console.print(f" Found: {len(opportunities)} opportunities")
if opportunities:
table = Table(show_header=True)
table.add_column("Sector", style="cyan")
table.add_column("Market Size", justify="right")
table.add_column("Growth", justify="right")
table.add_column("Fit", style="green")
for opp in opportunities[:5]:
table.add_row(
opp.get('sector', '')[:30],
f"${opp.get('market_size_usd', 0)/1e9:.1f}B",
f"{opp.get('growth_rate_percent', 0)}%",
opp.get('technology_fit', '')
)
console.print(table)
# Stakeholder Matches
matches = result.get('matches', [])
if matches:
console.print(f"\n[bold]Stakeholder Matches:[/bold]")
console.print(f" Found: {len(matches)} potential partners")
table = Table(show_header=True)
table.add_column("Partner", style="cyan")
table.add_column("Type")
table.add_column("Location")
table.add_column("Fit Score", justify="right", style="green")
for match in matches[:5]:
table.add_row(
match.get('stakeholder_name', '')[:30],
match.get('stakeholder_type', ''),
match.get('location', ''),
f"{match.get('overall_fit_score', 0)*100:.0f}%"
)
console.print(table)
# Brief
brief = result.get('brief', {})
if brief:
console.print(f"\n[bold]Valorization Brief:[/bold]")
console.print(f" PDF: {brief.get('pdf_path', 'Not generated')}")
def test_list_endpoints():
"""Test list endpoints"""
console.print("\n[bold blue]5. Testing List Endpoints[/bold blue]")
# List patents
response = requests.get(f"{API_BASE}/api/patents/")
if response.status_code == 200:
patents = response.json()
console.print(f"[green]✓[/green] Found {len(patents)} patents")
# List workflows
response = requests.get(f"{API_BASE}/api/workflows/")
if response.status_code == 200:
workflows = response.json()
console.print(f"[green]✓[/green] Found {len(workflows)} workflows")
def main():
"""Main test function"""
console.print("\n[bold cyan]SPARKNET API Test Suite[/bold cyan]\n")
try:
# Test health
if not test_health():
console.print("[red]Health check failed - is the API running?[/red]")
console.print("Start with: [yellow]python -m api.main[/yellow]")
return
# Find a test patent
dataset_dir = Path("Dataset")
test_patents = list(dataset_dir.glob("*.pdf")) if dataset_dir.exists() else []
if not test_patents:
console.print("\n[yellow]No patents found in Dataset/ directory[/yellow]")
console.print("Skipping upload and workflow tests")
return
# Use first patent for testing
test_patent = test_patents[0]
console.print(f"\nUsing test patent: [cyan]{test_patent.name}[/cyan]")
# Test upload
patent_id = test_upload(str(test_patent))
if not patent_id:
return
# Test workflow
workflow_id = test_workflow(patent_id)
if not workflow_id:
return
# Monitor workflow
monitor_workflow(workflow_id)
# Test list endpoints
test_list_endpoints()
console.print("\n[bold green]✓ All tests completed successfully![/bold green]\n")
except requests.exceptions.ConnectionError:
console.print("\n[red]✗ Cannot connect to API[/red]")
console.print("Make sure the API is running: [yellow]python -m api.main[/yellow]")
except Exception as e:
console.print(f"\n[red]✗ Test failed: {e}[/red]")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()