| """ |
| Pytest configuration and fixtures for SPARKNET tests |
| Following FAANG best practices for test infrastructure |
| """ |
|
|
| import pytest |
| import asyncio |
| import sys |
| from pathlib import Path |
| from typing import Generator, AsyncGenerator |
| from unittest.mock import MagicMock, AsyncMock |
|
|
| |
| sys.path.insert(0, str(Path(__file__).parent.parent / "src")) |
|
|
|
|
| |
| |
| |
|
|
| @pytest.fixture(scope="session") |
| def event_loop(): |
| """Create an event loop for async tests.""" |
| loop = asyncio.new_event_loop() |
| yield loop |
| loop.close() |
|
|
|
|
| |
| |
| |
|
|
| @pytest.fixture |
| def mock_ollama_client(): |
| """Mock Ollama client for unit tests.""" |
| client = MagicMock() |
| client.generate = MagicMock(return_value="Mock LLM response") |
| client.chat = MagicMock(return_value="Mock chat response") |
| client.list_models = MagicMock(return_value=["llama3.2:latest", "qwen2.5:14b"]) |
| return client |
|
|
|
|
| @pytest.fixture |
| def mock_langchain_client(): |
| """Mock LangChain Ollama client for unit tests.""" |
| client = MagicMock() |
|
|
| |
| mock_llm = MagicMock() |
| mock_llm.invoke = MagicMock(return_value=MagicMock(content="Mock response")) |
| mock_llm.ainvoke = AsyncMock(return_value=MagicMock(content="Mock async response")) |
|
|
| client.get_llm = MagicMock(return_value=mock_llm) |
| client.get_embeddings = MagicMock(return_value=MagicMock()) |
|
|
| return client |
|
|
|
|
| |
| |
| |
|
|
| @pytest.fixture |
| def mock_memory_agent(): |
| """Mock memory agent for unit tests.""" |
| agent = MagicMock() |
| agent.retrieve_relevant_context = AsyncMock(return_value=[]) |
| agent.store_episode = AsyncMock(return_value=None) |
| agent.search_stakeholders = AsyncMock(return_value=[]) |
| return agent |
|
|
|
|
| @pytest.fixture |
| def mock_planner_agent(): |
| """Mock planner agent for unit tests.""" |
| from src.agents.base_agent import Task |
|
|
| agent = MagicMock() |
|
|
| mock_task = Task( |
| id="test_task", |
| description="Test task", |
| status="completed", |
| result={ |
| "task_graph": MagicMock( |
| subtasks={}, |
| get_execution_order=MagicMock(return_value=[]) |
| ), |
| "execution_order": [], |
| "total_subtasks": 0, |
| } |
| ) |
| agent.process_task = AsyncMock(return_value=mock_task) |
|
|
| return agent |
|
|
|
|
| @pytest.fixture |
| def mock_critic_agent(): |
| """Mock critic agent for unit tests.""" |
| from src.agents.base_agent import Task |
|
|
| agent = MagicMock() |
|
|
| mock_validation = MagicMock( |
| overall_score=0.9, |
| issues=[], |
| suggestions=[], |
| dimension_scores={"completeness": 0.9, "clarity": 0.9} |
| ) |
|
|
| mock_task = Task( |
| id="test_task", |
| description="Test task", |
| status="completed", |
| result=mock_validation |
| ) |
| agent.process_task = AsyncMock(return_value=mock_task) |
| agent.get_feedback_for_iteration = MagicMock(return_value="Good quality output") |
|
|
| return agent |
|
|
|
|
| |
| |
| |
|
|
| @pytest.fixture |
| def sample_patent_analysis(): |
| """Sample patent analysis result for testing.""" |
| return { |
| "title": "Test Patent: Novel AI System", |
| "abstract": "A system for processing natural language using transformers", |
| "claims": [ |
| "Claim 1: A method for natural language processing", |
| "Claim 2: A system implementing the method of claim 1" |
| ], |
| "trl_level": 4, |
| "innovation_domains": ["Artificial Intelligence", "Natural Language Processing"], |
| "key_innovations": ["Novel attention mechanism", "Efficient inference"], |
| "filing_date": "2023-01-15", |
| "patent_number": "US12345678", |
| } |
|
|
|
|
| @pytest.fixture |
| def sample_market_analysis(): |
| """Sample market analysis result for testing.""" |
| return { |
| "opportunities": [ |
| { |
| "name": "Enterprise NLP Market", |
| "market_size": 12.5, |
| "growth_rate": 0.25, |
| "relevance_score": 0.85, |
| }, |
| { |
| "name": "Conversational AI", |
| "market_size": 8.2, |
| "growth_rate": 0.32, |
| "relevance_score": 0.78, |
| }, |
| ], |
| "competitive_landscape": "Moderate competition with major players", |
| "commercialization_potential": 0.8, |
| } |
|
|
|
|
| @pytest.fixture |
| def sample_stakeholder_match(): |
| """Sample stakeholder match for testing.""" |
| return { |
| "name": "Tech Corp Inc", |
| "type": "company", |
| "domain": "Enterprise Software", |
| "relevance_score": 0.92, |
| "contact_info": { |
| "email": "licensing@techcorp.example", |
| "phone": "+1-555-0123", |
| }, |
| "match_rationale": "Strong alignment with NLP focus areas", |
| } |
|
|
|
|
| |
| |
| |
|
|
| @pytest.fixture |
| def test_config(): |
| """Test configuration dictionary.""" |
| return { |
| "gpu": { |
| "primary": 0, |
| "fallback": [1, 2, 3], |
| "max_memory_per_model": "8GB", |
| }, |
| "ollama": { |
| "host": "localhost", |
| "port": 11434, |
| "default_model": "llama3.2:latest", |
| "timeout": 300, |
| }, |
| "memory": { |
| "vector_store": "chromadb", |
| "embedding_model": "nomic-embed-text:latest", |
| "max_context_length": 4096, |
| "persist_directory": "/tmp/sparknet_test_memory", |
| }, |
| "workflow": { |
| "max_parallel_tasks": 5, |
| "task_timeout": 600, |
| "retry_attempts": 3, |
| }, |
| } |
|
|
|
|
| |
| |
| |
|
|
| @pytest.fixture(autouse=True) |
| def cleanup_test_files(): |
| """Clean up any test files after each test.""" |
| yield |
|
|
| |
| test_output_dir = Path("/tmp/sparknet_test_outputs") |
| if test_output_dir.exists(): |
| import shutil |
| shutil.rmtree(test_output_dir, ignore_errors=True) |
|
|
|
|
| |
| |
| |
|
|
| def pytest_configure(config): |
| """Configure pytest markers.""" |
| config.addinivalue_line( |
| "markers", "slow: mark test as slow (deselect with '-m \"not slow\"')" |
| ) |
| config.addinivalue_line( |
| "markers", "integration: mark test as integration test" |
| ) |
| config.addinivalue_line( |
| "markers", "gpu: mark test as requiring GPU" |
| ) |
| config.addinivalue_line( |
| "markers", "ollama: mark test as requiring Ollama server" |
| ) |
|
|