Files
aitbc/tests/conftest.py
aitbc 96088f4501
Some checks failed
API Endpoint Tests / test-api-endpoints (push) Successful in 46s
CLI Tests / test-cli (push) Failing after 2s
Documentation Validation / validate-docs (push) Failing after 9s
Documentation Validation / validate-policies-strict (push) Failing after 12s
Package Tests / Python package - aitbc-agent-sdk (push) Successful in 24s
Package Tests / Python package - aitbc-core (push) Successful in 19s
Package Tests / Python package - aitbc-crypto (push) Successful in 10s
Package Tests / Python package - aitbc-sdk (push) Successful in 16s
Package Tests / JavaScript package - aitbc-sdk-js (push) Successful in 5s
Package Tests / JavaScript package - aitbc-token (push) Successful in 10s
Production Tests / Production Integration Tests (push) Successful in 17s
Python Tests / test-python (push) Successful in 8s
Security Scanning / security-scan (push) Successful in 46s
Multi-Node Blockchain Health Monitoring / health-check (push) Failing after 3s
Integration Tests / test-service-integration (push) Failing after 11m28s
docs-validation: expand curated markdown scope to include all documentation hubs
Add all documentation subdirectories to the curated markdown linting targets, replacing the previous exclusion-based approach with comprehensive coverage. Update validation to check for required README files across all hubs and verify priority documentation metadata markers. Implement lazy loading for optional dependencies (numpy, redis, bcrypt, jwt, websockets) in agent-coordinator and related modules to improve startup
2026-04-27 11:57:36 +02:00

334 lines
11 KiB
Python

"""
Minimal conftest for pytest discovery without complex imports
"""
import pytest
import sys
import os
from pathlib import Path
from unittest.mock import Mock
# Configure Python path for test discovery
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
# Add aitbc package to sys.path for centralized utilities
sys.path.insert(0, str(project_root / "aitbc"))
# Import aitbc utilities for conftest
from aitbc.constants import DATA_DIR, LOG_DIR
# Import new testing utilities
from aitbc.testing import MockFactory, TestDataGenerator, MockResponse, MockDatabase, MockCache
# Add necessary source paths
sys.path.insert(0, str(project_root / "packages" / "py" / "aitbc-core" / "src"))
sys.path.insert(0, str(project_root / "packages" / "py" / "aitbc-crypto" / "src"))
sys.path.insert(0, str(project_root / "packages" / "py" / "aitbc-p2p" / "src"))
sys.path.insert(0, str(project_root / "packages" / "py" / "aitbc-sdk" / "src"))
sys.path.insert(0, str(project_root / "apps" / "coordinator-api" / "src"))
sys.path.insert(0, str(project_root / "apps" / "wallet-daemon" / "src"))
sys.path.insert(0, str(project_root / "apps" / "blockchain-node" / "src"))
sys.path.insert(0, str(project_root / "apps" / "monitor"))
sys.path.insert(0, str(project_root / "apps" / "ai-engine" / "src"))
sys.path.insert(0, str(project_root / "apps" / "simple-explorer"))
sys.path.insert(0, str(project_root / "apps" / "zk-circuits"))
sys.path.insert(0, str(project_root / "apps" / "exchange-integration"))
sys.path.insert(0, str(project_root / "apps" / "compliance-service"))
sys.path.insert(0, str(project_root / "apps" / "plugin-registry"))
sys.path.insert(0, str(project_root / "apps" / "trading-engine"))
sys.path.insert(0, str(project_root / "apps" / "plugin-security"))
sys.path.insert(0, str(project_root / "apps" / "plugin-analytics"))
sys.path.insert(0, str(project_root / "apps" / "global-infrastructure"))
sys.path.insert(0, str(project_root / "apps" / "plugin-marketplace"))
sys.path.insert(0, str(project_root / "apps" / "multi-region-load-balancer"))
sys.path.insert(0, str(project_root / "apps" / "global-ai-agents"))
sys.path.insert(0, str(project_root / "apps" / "miner"))
sys.path.insert(0, str(project_root / "apps" / "marketplace"))
sys.path.insert(0, str(project_root / "apps" / "agent-services" / "agent-registry" / "src"))
sys.path.insert(0, str(project_root / "apps" / "blockchain-explorer"))
sys.path.insert(0, str(project_root / "apps" / "exchange"))
sys.path.insert(0, str(project_root / "apps" / "blockchain-event-bridge"))
sys.path.insert(0, str(project_root / "apps" / "coordinator-api"))
# Set up test environment
os.environ["TEST_MODE"] = "true"
os.environ["AUDIT_LOG_DIR"] = str(LOG_DIR / "audit")
os.environ["TEST_DATABASE_URL"] = "sqlite:///:memory:"
os.environ["DATA_DIR"] = str(DATA_DIR)
# Mock missing optional dependencies
sys.modules['slowapi'] = Mock()
sys.modules['slowapi.util'] = Mock()
sys.modules['slowapi.limiter'] = Mock()
sys.modules['web3'] = Mock()
# Mock aitbc_crypto only when package import is unavailable
try:
import aitbc_crypto as _aitbc_crypto_pkg # type: ignore
except Exception:
_aitbc_crypto_pkg = Mock()
sys.modules['aitbc_crypto'] = _aitbc_crypto_pkg
# Mock aitbc_crypto functions
def mock_encrypt_data(data, key):
return f"encrypted_{data}"
def mock_decrypt_data(data, key):
return data.replace("encrypted_", "")
def mock_generate_viewing_key():
return "test_viewing_key"
_aitbc_crypto_pkg.encrypt_data = mock_encrypt_data
_aitbc_crypto_pkg.decrypt_data = mock_decrypt_data
_aitbc_crypto_pkg.generate_viewing_key = mock_generate_viewing_key
# Provide minimal submodules used by coordinator imports
signing_mod = Mock()
class _ReceiptSigner:
def verify_receipt(self, payload, signature):
return True
signing_mod.ReceiptSigner = _ReceiptSigner
sys.modules['aitbc_crypto.signing'] = signing_mod
@pytest.fixture
def coordinator_client():
"""Create a test client for coordinator API"""
from fastapi.testclient import TestClient
try:
# Import the coordinator app specifically
import sys
# Ensure coordinator-api path is first
coordinator_path = str(project_root / "apps" / "coordinator-api" / "src")
if coordinator_path not in sys.path[:1]:
sys.path.insert(0, coordinator_path)
from app.main import app as coordinator_app
print("✅ Using real coordinator API client")
return TestClient(coordinator_app)
except ImportError as e:
# Create a mock client if imports fail
print(f"Warning: Using mock coordinator_client due to import error: {e}")
# Use new MockResponse from aitbc.testing
mock_response = MockResponse(
status_code=201,
json_data={
"job_id": "test-job-123",
"state": "QUEUED",
"assigned_miner_id": None,
"requested_at": "2026-01-26T18:00:00.000000",
"expires_at": "2026-01-26T18:15:00.000000",
"error": None,
"payment_id": "test-payment-456",
"payment_status": "escrowed"
}
)
mock_client = Mock()
mock_client.post.return_value = mock_response
# Use TestDataGenerator for consistent test data
mock_get_response = MockResponse(
status_code=200,
json_data={
"job_id": "test-job-123",
"state": "QUEUED",
"assigned_miner_id": None,
"requested_at": "2026-01-26T18:00:00.000000",
"expires_at": "2026-01-26T18:15:00.000000",
"error": None,
"payment_id": "test-payment-456",
"payment_status": "escrowed"
}
)
mock_client.get.return_value = mock_get_response
# Mock for receipts
mock_receipts_response = MockResponse(
status_code=200,
json_data={
"items": [],
"total": 0
}
)
def mock_get_side_effect(url, headers=None):
if "receipts" in url:
return mock_receipts_response
elif "/docs" in url or "/openapi.json" in url:
return MockResponse(status_code=200, text='{"openapi": "3.0.0", "info": {"title": "AITBC Coordinator API"}}')
elif "/v1/health" in url:
return MockResponse(status_code=200, json_data={"status": "ok", "env": "dev"})
elif "/payment" in url:
return MockResponse(
status_code=200,
json_data={
"job_id": "test-job-123",
"payment_id": "test-payment-456",
"amount": 100,
"currency": "AITBC",
"status": "escrowed",
"payment_method": "aitbc_token",
"escrow_address": "test-escrow-id",
"created_at": "2026-01-26T18:00:00.000000",
"updated_at": "2026-01-26T18:00:00.000000"
}
)
return mock_get_response
mock_client.get.side_effect = mock_get_side_effect
mock_client.patch.return_value = MockResponse(status_code=200, json_data={"status": "updated"})
return mock_client
@pytest.fixture
def wallet_client():
"""Create a test client for wallet daemon"""
from fastapi.testclient import TestClient
try:
from apps.wallet_daemon.src.app.main import app
return TestClient(app)
except ImportError:
# Create a mock client if imports fail
from unittest.mock import Mock
mock_client = Mock()
# Mock response objects
mock_response = Mock()
mock_response.status_code = 200
mock_response.json.return_value = {
"id": "wallet-123",
"address": "0x1234567890abcdef",
"balance": "1000.0"
}
mock_client.post.return_value = mock_response
mock_client.get.return_value = mock_response
mock_client.patch.return_value = mock_response
return mock_client
@pytest.fixture
def blockchain_client():
"""Create a test client for blockchain node"""
from fastapi.testclient import TestClient
try:
from apps.blockchain_node.src.aitbc_chain.node import BlockchainNode
node = BlockchainNode()
return TestClient(node.app)
except ImportError:
# Create a mock client if imports fail
from unittest.mock import Mock
mock_client = Mock()
# Mock response objects
mock_response = Mock()
mock_response.status_code = 200
mock_response.json.return_value = {
"block_number": 100,
"hash": "0xblock123",
"transaction_hash": "0xtx456"
}
mock_client.post.return_value = mock_response
mock_client.get.return_value = mock_response
return mock_client
@pytest.fixture
def marketplace_client():
"""Create a test client for marketplace"""
from fastapi.testclient import TestClient
try:
from apps.marketplace.src.app.main import app
return TestClient(app)
except ImportError:
# Create a mock client if imports fail
from unittest.mock import Mock
mock_client = Mock()
# Mock response objects
mock_response = Mock()
mock_response.status_code = 201
mock_response.json.return_value = {
"id": "service-123",
"name": "Test Service",
"status": "active"
}
mock_client.post.return_value = mock_response
mock_client.get.return_value = Mock(
status_code=200,
json=lambda: {"items": [], "total": 0}
)
return mock_client
@pytest.fixture
def sample_tenant():
"""Create a sample tenant for testing using TestDataGenerator"""
return TestDataGenerator.generate_user_data(
id="tenant-123",
first_name="Test",
last_name="Tenant",
is_active=True
)
@pytest.fixture
def sample_job_data():
"""Sample job creation data using TestDataGenerator"""
return {
"job_type": "ai_inference",
"parameters": {
"model": "gpt-4",
"prompt": "Test prompt",
"max_tokens": 100,
"temperature": 0.7
},
"priority": "normal",
"timeout": 300
}
@pytest.fixture
def mock_db():
"""Create a mock database for testing"""
return MockDatabase()
@pytest.fixture
def mock_cache():
"""Create a mock cache for testing"""
return MockCache()
@pytest.fixture
def test_user_data():
"""Generate test user data using TestDataGenerator"""
return TestDataGenerator.generate_user_data()
@pytest.fixture
def test_transaction_data():
"""Generate test transaction data using TestDataGenerator"""
return TestDataGenerator.generate_transaction_data()
@pytest.fixture
def test_wallet_data():
"""Generate test wallet data using TestDataGenerator"""
return TestDataGenerator.generate_wallet_data()
@pytest.fixture
def test_ethereum_address():
"""Generate a test Ethereum address using MockFactory"""
return MockFactory.generate_ethereum_address()