test
This commit is contained in:
468
tests/conftest_fixtures.py
Normal file
468
tests/conftest_fixtures.py
Normal file
@@ -0,0 +1,468 @@
|
||||
"""
|
||||
Comprehensive test fixtures for AITBC testing
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import asyncio
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any, Generator
|
||||
from unittest.mock import Mock, AsyncMock
|
||||
from fastapi.testclient import TestClient
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
# Import all necessary modules
|
||||
from apps.coordinator_api.src.app.main import app as coordinator_app
|
||||
from apps.wallet_daemon.src.app.main import app as wallet_app
|
||||
from apps.blockchain_node.src.aitbc_chain.node import BlockchainNode
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def event_loop():
|
||||
"""Create an instance of the default event loop for the test session."""
|
||||
loop = asyncio.get_event_loop_policy().new_event_loop()
|
||||
yield loop
|
||||
loop.close()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def coordinator_client():
|
||||
"""Create a test client for coordinator API"""
|
||||
return TestClient(coordinator_app)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def wallet_client():
|
||||
"""Create a test client for wallet daemon"""
|
||||
return TestClient(wallet_app)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def blockchain_client():
|
||||
"""Create a test client for blockchain node"""
|
||||
node = BlockchainNode()
|
||||
return TestClient(node.app)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def marketplace_client():
|
||||
"""Create a test client for marketplace"""
|
||||
from apps.marketplace.src.app.main import app as marketplace_app
|
||||
return TestClient(marketplace_app)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_tenant():
|
||||
"""Create a sample tenant for testing"""
|
||||
return {
|
||||
"id": "tenant-123",
|
||||
"name": "Test Tenant",
|
||||
"created_at": datetime.utcnow(),
|
||||
"status": "active"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_user():
|
||||
"""Create a sample user for testing"""
|
||||
return {
|
||||
"id": "user-123",
|
||||
"email": "test@example.com",
|
||||
"tenant_id": "tenant-123",
|
||||
"role": "user",
|
||||
"created_at": datetime.utcnow()
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_wallet_data():
|
||||
"""Sample wallet creation data"""
|
||||
return {
|
||||
"name": "Test Wallet",
|
||||
"type": "hd",
|
||||
"currency": "AITBC"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_wallet():
|
||||
"""Sample wallet object"""
|
||||
return {
|
||||
"id": "wallet-123",
|
||||
"address": "0x1234567890abcdef1234567890abcdef12345678",
|
||||
"user_id": "user-123",
|
||||
"balance": "1000.0",
|
||||
"status": "active",
|
||||
"created_at": datetime.utcnow()
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_job_data():
|
||||
"""Sample job creation data"""
|
||||
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 sample_job():
|
||||
"""Sample job object"""
|
||||
return {
|
||||
"id": "job-123",
|
||||
"job_type": "ai_inference",
|
||||
"status": "pending",
|
||||
"tenant_id": "tenant-123",
|
||||
"created_at": datetime.utcnow(),
|
||||
"parameters": {
|
||||
"model": "gpt-4",
|
||||
"prompt": "Test prompt"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_transaction():
|
||||
"""Sample transaction object"""
|
||||
return {
|
||||
"hash": "0x1234567890abcdef",
|
||||
"from": "0xsender1234567890",
|
||||
"to": "0xreceiver1234567890",
|
||||
"value": "1000",
|
||||
"gas": "21000",
|
||||
"gas_price": "20",
|
||||
"nonce": 1,
|
||||
"status": "pending"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_block():
|
||||
"""Sample block object"""
|
||||
return {
|
||||
"number": 100,
|
||||
"hash": "0xblock1234567890",
|
||||
"parent_hash": "0xparent0987654321",
|
||||
"timestamp": datetime.utcnow(),
|
||||
"transactions": [],
|
||||
"validator": "0xvalidator123"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_account():
|
||||
"""Sample account object"""
|
||||
return {
|
||||
"address": "0xaccount1234567890",
|
||||
"balance": "1000000",
|
||||
"nonce": 25,
|
||||
"code_hash": "0xempty"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def signed_receipt():
|
||||
"""Sample signed receipt"""
|
||||
return {
|
||||
"job_id": "job-123",
|
||||
"hash": "0xreceipt123456",
|
||||
"signature": "sig789012345",
|
||||
"miner_id": "miner-123",
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_tenant_quota():
|
||||
"""Sample tenant quota"""
|
||||
return {
|
||||
"tenant_id": "tenant-123",
|
||||
"jobs_per_day": 1000,
|
||||
"jobs_per_month": 30000,
|
||||
"max_concurrent": 50,
|
||||
"storage_gb": 100
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def validator_address():
|
||||
"""Sample validator address"""
|
||||
return "0xvalidator1234567890abcdef"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def miner_address():
|
||||
"""Sample miner address"""
|
||||
return "0xminer1234567890abcdef"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_transactions():
|
||||
"""List of sample transactions"""
|
||||
return [
|
||||
{
|
||||
"hash": "0xtx123",
|
||||
"from": "0xaddr1",
|
||||
"to": "0xaddr2",
|
||||
"value": "100"
|
||||
},
|
||||
{
|
||||
"hash": "0xtx456",
|
||||
"from": "0xaddr3",
|
||||
"to": "0xaddr4",
|
||||
"value": "200"
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_block(sample_transactions):
|
||||
"""Sample block with transactions"""
|
||||
return {
|
||||
"number": 100,
|
||||
"hash": "0xblockhash123",
|
||||
"parent_hash": "0xparenthash456",
|
||||
"transactions": sample_transactions,
|
||||
"timestamp": datetime.utcnow(),
|
||||
"validator": "0xvalidator123"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_database():
|
||||
"""Mock database session"""
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
yield session
|
||||
session.close()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_redis():
|
||||
"""Mock Redis client"""
|
||||
from unittest.mock import Mock
|
||||
redis_mock = Mock()
|
||||
redis_mock.get.return_value = None
|
||||
redis_mock.set.return_value = True
|
||||
redis_mock.delete.return_value = 1
|
||||
return redis_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_web3():
|
||||
"""Mock Web3 instance"""
|
||||
from unittest.mock import Mock
|
||||
web3_mock = Mock()
|
||||
web3_mock.eth.contract.return_value = Mock()
|
||||
web3_mock.eth.get_balance.return_value = 1000000
|
||||
web3_mock.eth.gas_price = 20
|
||||
return web3_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def browser():
|
||||
"""Selenium WebDriver fixture for E2E tests"""
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.chrome.options import Options
|
||||
|
||||
options = Options()
|
||||
options.add_argument("--headless")
|
||||
options.add_argument("--no-sandbox")
|
||||
options.add_argument("--disable-dev-shm-usage")
|
||||
|
||||
driver = webdriver.Chrome(options=options)
|
||||
driver.implicitly_wait(10)
|
||||
yield driver
|
||||
driver.quit()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mobile_browser():
|
||||
"""Mobile browser fixture for responsive testing"""
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.chrome.options import Options
|
||||
|
||||
options = Options()
|
||||
options.add_argument("--headless")
|
||||
options.add_argument("--no-sandbox")
|
||||
options.add_argument("--disable-dev-shm-usage")
|
||||
|
||||
mobile_emulation = {
|
||||
"deviceMetrics": {"width": 375, "height": 667, "pixelRatio": 2.0},
|
||||
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)"
|
||||
}
|
||||
options.add_experimental_option("mobileEmulation", mobile_emulation)
|
||||
|
||||
driver = webdriver.Chrome(options=options)
|
||||
driver.implicitly_wait(10)
|
||||
yield driver
|
||||
driver.quit()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base_url():
|
||||
"""Base URL for E2E tests"""
|
||||
return "http://localhost:8000"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_file_storage():
|
||||
"""Mock file storage service"""
|
||||
from unittest.mock import Mock
|
||||
storage_mock = Mock()
|
||||
storage_mock.upload.return_value = {"url": "http://example.com/file.txt"}
|
||||
storage_mock.download.return_value = b"file content"
|
||||
storage_mock.delete.return_value = True
|
||||
return storage_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_email_service():
|
||||
"""Mock email service"""
|
||||
from unittest.mock import Mock
|
||||
email_mock = Mock()
|
||||
email_mock.send.return_value = {"message_id": "msg-123"}
|
||||
email_mock.send_verification.return_value = {"token": "token-456"}
|
||||
return email_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_notification_service():
|
||||
"""Mock notification service"""
|
||||
from unittest.mock import Mock
|
||||
notification_mock = Mock()
|
||||
notification_mock.send_push.return_value = True
|
||||
notification_mock.send_webhook.return_value = {"status": "sent"}
|
||||
return notification_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_api_key():
|
||||
"""Sample API key"""
|
||||
return {
|
||||
"id": "key-123",
|
||||
"key": "aitbc_test_key_1234567890",
|
||||
"name": "Test API Key",
|
||||
"permissions": ["read", "write"],
|
||||
"created_at": datetime.utcnow()
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_service_listing():
|
||||
"""Sample marketplace service listing"""
|
||||
return {
|
||||
"id": "service-123",
|
||||
"name": "AI Inference Service",
|
||||
"description": "High-performance AI inference",
|
||||
"provider_id": "provider-123",
|
||||
"pricing": {
|
||||
"per_token": 0.0001,
|
||||
"per_minute": 0.01
|
||||
},
|
||||
"capabilities": ["text-generation", "image-generation"],
|
||||
"status": "active"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_booking():
|
||||
"""Sample booking object"""
|
||||
return {
|
||||
"id": "booking-123",
|
||||
"service_id": "service-123",
|
||||
"client_id": "client-123",
|
||||
"status": "confirmed",
|
||||
"start_time": datetime.utcnow() + timedelta(hours=1),
|
||||
"end_time": datetime.utcnow() + timedelta(hours=2),
|
||||
"total_cost": "10.0"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_blockchain_node():
|
||||
"""Mock blockchain node for testing"""
|
||||
from unittest.mock import Mock
|
||||
node_mock = Mock()
|
||||
node_mock.start.return_value = {"status": "running"}
|
||||
node_mock.stop.return_value = {"status": "stopped"}
|
||||
node_mock.get_block.return_value = {"number": 100, "hash": "0x123"}
|
||||
node_mock.submit_transaction.return_value = {"hash": "0xtx456"}
|
||||
return node_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_zk_proof():
|
||||
"""Sample zero-knowledge proof"""
|
||||
return {
|
||||
"proof": "zk_proof_123456",
|
||||
"public_inputs": ["x", "y"],
|
||||
"verification_key": "vk_789012"
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_confidential_data():
|
||||
"""Sample confidential transaction data"""
|
||||
return {
|
||||
"encrypted_payload": "encrypted_data_123",
|
||||
"commitment": "commitment_hash_456",
|
||||
"nullifier": "nullifier_789",
|
||||
"merkle_proof": {
|
||||
"root": "root_hash",
|
||||
"path": ["hash1", "hash2", "hash3"],
|
||||
"indices": [0, 1, 0]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_ipfs():
|
||||
"""Mock IPFS client"""
|
||||
from unittest.mock import Mock
|
||||
ipfs_mock = Mock()
|
||||
ipfs_mock.add.return_value = {"Hash": "QmHash123"}
|
||||
ipfs_mock.cat.return_value = b"IPFS content"
|
||||
ipfs_mock.pin.return_value = {"Pins": ["QmHash123"]}
|
||||
return ipfs_mock
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def cleanup_mocks():
|
||||
"""Cleanup after each test"""
|
||||
yield
|
||||
# Add any cleanup code here
|
||||
pass
|
||||
|
||||
|
||||
# Performance testing fixtures
|
||||
@pytest.fixture
|
||||
def performance_metrics():
|
||||
"""Collect performance metrics during test"""
|
||||
import time
|
||||
start_time = time.time()
|
||||
yield {"start": start_time}
|
||||
end_time = time.time()
|
||||
return {"duration": end_time - start_time}
|
||||
|
||||
|
||||
# Load testing fixtures
|
||||
@pytest.fixture
|
||||
def load_test_config():
|
||||
"""Configuration for load testing"""
|
||||
return {
|
||||
"concurrent_users": 100,
|
||||
"ramp_up_time": 30,
|
||||
"test_duration": 300,
|
||||
"target_rps": 50
|
||||
}
|
||||
Reference in New Issue
Block a user