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
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
334 lines
11 KiB
Python
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()
|