chore: remove configuration files and enhance blockchain explorer with advanced search, analytics, and export features
- Delete .aitbc.yaml.example CLI configuration template - Delete .lycheeignore link checker exclusion rules - Delete .nvmrc Node.js version specification - Add advanced search panel with filters for address, amount range, transaction type, time range, and validator - Add analytics dashboard with transaction volume, active addresses, and block time metrics - Add Chart.js integration
This commit is contained in:
372
cli/tests/multichain/test_marketplace.py
Normal file
372
cli/tests/multichain/test_marketplace.py
Normal file
@@ -0,0 +1,372 @@
|
||||
"""
|
||||
Test for global chain marketplace system
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import pytest
|
||||
from decimal import Decimal
|
||||
from datetime import datetime, timedelta
|
||||
from aitbc_cli.core.config import MultiChainConfig
|
||||
from aitbc_cli.core.marketplace import (
|
||||
GlobalChainMarketplace, ChainListing, ChainType, MarketplaceStatus,
|
||||
MarketplaceTransaction, TransactionStatus, ChainEconomy, MarketplaceMetrics
|
||||
)
|
||||
|
||||
def test_marketplace_creation():
|
||||
"""Test marketplace system creation"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
assert marketplace.config == config
|
||||
assert marketplace.listings == {}
|
||||
assert marketplace.transactions == {}
|
||||
assert marketplace.chain_economies == {}
|
||||
assert marketplace.user_reputations == {}
|
||||
assert marketplace.market_metrics is None
|
||||
|
||||
async def test_create_listing():
|
||||
"""Test chain listing creation"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputation
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
|
||||
# Create listing
|
||||
listing_id = await marketplace.create_listing(
|
||||
chain_id="healthcare-chain-001",
|
||||
chain_name="Healthcare Analytics Chain",
|
||||
chain_type=ChainType.TOPIC,
|
||||
description="Advanced healthcare data analytics chain",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("1.5"),
|
||||
currency="ETH",
|
||||
chain_specifications={"consensus": "pos", "block_time": 5},
|
||||
metadata={"category": "healthcare", "compliance": "hipaa"}
|
||||
)
|
||||
|
||||
assert listing_id is not None
|
||||
assert listing_id in marketplace.listings
|
||||
|
||||
listing = marketplace.listings[listing_id]
|
||||
assert listing.chain_id == "healthcare-chain-001"
|
||||
assert listing.chain_name == "Healthcare Analytics Chain"
|
||||
assert listing.chain_type == ChainType.TOPIC
|
||||
assert listing.price == Decimal("1.5")
|
||||
assert listing.status == MarketplaceStatus.ACTIVE
|
||||
|
||||
async def test_purchase_chain():
|
||||
"""Test chain purchase"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputations
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
marketplace.user_reputations["buyer-1"] = 0.7
|
||||
|
||||
# Create listing
|
||||
listing_id = await marketplace.create_listing(
|
||||
chain_id="trading-chain-001",
|
||||
chain_name="Trading Analytics Chain",
|
||||
chain_type=ChainType.PRIVATE,
|
||||
description="Private trading analytics chain",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("2.0"),
|
||||
currency="ETH",
|
||||
chain_specifications={"consensus": "pos"},
|
||||
metadata={"category": "trading"}
|
||||
)
|
||||
|
||||
# Purchase chain
|
||||
transaction_id = await marketplace.purchase_chain(listing_id, "buyer-1", "crypto")
|
||||
|
||||
assert transaction_id is not None
|
||||
assert transaction_id in marketplace.transactions
|
||||
|
||||
transaction = marketplace.transactions[transaction_id]
|
||||
assert transaction.buyer_id == "buyer-1"
|
||||
assert transaction.seller_id == "seller-1"
|
||||
assert transaction.price == Decimal("2.0")
|
||||
assert transaction.status == TransactionStatus.PENDING
|
||||
|
||||
# Check listing status
|
||||
listing = marketplace.listings[listing_id]
|
||||
assert listing.status == MarketplaceStatus.SOLD
|
||||
|
||||
async def test_complete_transaction():
|
||||
"""Test transaction completion"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputations
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
marketplace.user_reputations["buyer-1"] = 0.7
|
||||
|
||||
# Create listing and purchase
|
||||
listing_id = await marketplace.create_listing(
|
||||
chain_id="research-chain-001",
|
||||
chain_name="Research Collaboration Chain",
|
||||
chain_type=ChainType.RESEARCH,
|
||||
description="Research collaboration chain",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("0.5"),
|
||||
currency="ETH",
|
||||
chain_specifications={"consensus": "pos"},
|
||||
metadata={"category": "research"}
|
||||
)
|
||||
|
||||
transaction_id = await marketplace.purchase_chain(listing_id, "buyer-1", "crypto")
|
||||
|
||||
# Complete transaction
|
||||
success = await marketplace.complete_transaction(transaction_id, "0x1234567890abcdef")
|
||||
|
||||
assert success
|
||||
|
||||
transaction = marketplace.transactions[transaction_id]
|
||||
assert transaction.status == TransactionStatus.COMPLETED
|
||||
assert transaction.transaction_hash == "0x1234567890abcdef"
|
||||
assert transaction.completed_at is not None
|
||||
|
||||
# Check escrow release
|
||||
escrow_contract = marketplace.escrow_contracts.get(transaction.escrow_address)
|
||||
assert escrow_contract is not None
|
||||
assert escrow_contract["status"] == "released"
|
||||
|
||||
async def test_chain_economy():
|
||||
"""Test chain economy tracking"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Get chain economy (should create new one)
|
||||
economy = await marketplace.get_chain_economy("test-chain-001")
|
||||
|
||||
assert economy is not None
|
||||
assert economy.chain_id == "test-chain-001"
|
||||
assert isinstance(economy.total_value_locked, Decimal)
|
||||
assert isinstance(economy.daily_volume, Decimal)
|
||||
assert economy.transaction_count >= 0
|
||||
assert economy.last_updated is not None
|
||||
|
||||
async def test_search_listings():
|
||||
"""Test listing search functionality"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputation
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
|
||||
# Create multiple listings
|
||||
listings = [
|
||||
("healthcare-chain-001", "Healthcare Chain", ChainType.TOPIC, Decimal("1.0")),
|
||||
("trading-chain-001", "Trading Chain", ChainType.PRIVATE, Decimal("2.0")),
|
||||
("research-chain-001", "Research Chain", ChainType.RESEARCH, Decimal("0.5")),
|
||||
("enterprise-chain-001", "Enterprise Chain", ChainType.ENTERPRISE, Decimal("5.0"))
|
||||
]
|
||||
|
||||
listing_ids = []
|
||||
for chain_id, name, chain_type, price in listings:
|
||||
listing_id = await marketplace.create_listing(
|
||||
chain_id=chain_id,
|
||||
chain_name=name,
|
||||
chain_type=chain_type,
|
||||
description=f"Description for {name}",
|
||||
seller_id="seller-1",
|
||||
price=price,
|
||||
currency="ETH",
|
||||
chain_specifications={},
|
||||
metadata={}
|
||||
)
|
||||
listing_ids.append(listing_id)
|
||||
|
||||
# Search by chain type
|
||||
topic_listings = await marketplace.search_listings(chain_type=ChainType.TOPIC)
|
||||
assert len(topic_listings) == 1
|
||||
assert topic_listings[0].chain_type == ChainType.TOPIC
|
||||
|
||||
# Search by price range
|
||||
price_listings = await marketplace.search_listings(min_price=Decimal("1.0"), max_price=Decimal("2.0"))
|
||||
assert len(price_listings) == 2
|
||||
|
||||
# Search by seller
|
||||
seller_listings = await marketplace.search_listings(seller_id="seller-1")
|
||||
assert len(seller_listings) == 4
|
||||
|
||||
async def test_user_transactions():
|
||||
"""Test user transaction retrieval"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputations
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
marketplace.user_reputations["buyer-1"] = 0.7
|
||||
marketplace.user_reputations["buyer-2"] = 0.6
|
||||
|
||||
# Create listings and purchases
|
||||
listing_id1 = await marketplace.create_listing(
|
||||
chain_id="chain-001",
|
||||
chain_name="Chain 1",
|
||||
chain_type=ChainType.TOPIC,
|
||||
description="Description",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("1.0"),
|
||||
currency="ETH",
|
||||
chain_specifications={},
|
||||
metadata={}
|
||||
)
|
||||
|
||||
listing_id2 = await marketplace.create_listing(
|
||||
chain_id="chain-002",
|
||||
chain_name="Chain 2",
|
||||
chain_type=ChainType.PRIVATE,
|
||||
description="Description",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("2.0"),
|
||||
currency="ETH",
|
||||
chain_specifications={},
|
||||
metadata={}
|
||||
)
|
||||
|
||||
transaction_id1 = await marketplace.purchase_chain(listing_id1, "buyer-1", "crypto")
|
||||
transaction_id2 = await marketplace.purchase_chain(listing_id2, "buyer-2", "crypto")
|
||||
|
||||
# Get seller transactions
|
||||
seller_transactions = await marketplace.get_user_transactions("seller-1", "seller")
|
||||
assert len(seller_transactions) == 2
|
||||
|
||||
# Get buyer transactions
|
||||
buyer_transactions = await marketplace.get_user_transactions("buyer-1", "buyer")
|
||||
assert len(buyer_transactions) == 1
|
||||
assert buyer_transactions[0].buyer_id == "buyer-1"
|
||||
|
||||
# Get all user transactions
|
||||
all_transactions = await marketplace.get_user_transactions("seller-1", "both")
|
||||
assert len(all_transactions) == 2
|
||||
|
||||
async def test_marketplace_overview():
|
||||
"""Test marketplace overview"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputations
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
marketplace.user_reputations["buyer-1"] = 0.7
|
||||
|
||||
# Create listings and transactions
|
||||
listing_id = await marketplace.create_listing(
|
||||
chain_id="overview-chain-001",
|
||||
chain_name="Overview Test Chain",
|
||||
chain_type=ChainType.TOPIC,
|
||||
description="Test chain for overview",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("1.5"),
|
||||
currency="ETH",
|
||||
chain_specifications={},
|
||||
metadata={}
|
||||
)
|
||||
|
||||
transaction_id = await marketplace.purchase_chain(listing_id, "buyer-1", "crypto")
|
||||
await marketplace.complete_transaction(transaction_id, "0x1234567890abcdef")
|
||||
|
||||
# Get marketplace overview
|
||||
overview = await marketplace.get_marketplace_overview()
|
||||
|
||||
assert overview is not None
|
||||
assert "marketplace_metrics" in overview
|
||||
assert "volume_24h" in overview
|
||||
assert "top_performing_chains" in overview
|
||||
assert "chain_types_distribution" in overview
|
||||
assert "user_activity" in overview
|
||||
assert "escrow_summary" in overview
|
||||
|
||||
# Check marketplace metrics
|
||||
metrics = overview["marketplace_metrics"]
|
||||
assert metrics["total_listings"] == 1
|
||||
assert metrics["total_transactions"] == 1
|
||||
assert metrics["total_volume"] == Decimal("1.5")
|
||||
|
||||
def test_validation_functions():
|
||||
"""Test validation functions"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Test user reputation update
|
||||
marketplace._update_user_reputation("user-1", 0.1)
|
||||
print(f"After +0.1: {marketplace.user_reputations['user-1']}")
|
||||
assert marketplace.user_reputations["user-1"] == 0.6 # Started at 0.5
|
||||
|
||||
marketplace._update_user_reputation("user-1", -0.2)
|
||||
print(f"After -0.2: {marketplace.user_reputations['user-1']}")
|
||||
assert abs(marketplace.user_reputations["user-1"] - 0.4) < 0.0001 # Allow for floating point precision
|
||||
|
||||
# Test bounds
|
||||
marketplace._update_user_reputation("user-1", 0.6) # Add 0.6 to reach 1.0
|
||||
print(f"After +0.6: {marketplace.user_reputations['user-1']}")
|
||||
assert marketplace.user_reputations["user-1"] == 1.0 # Max bound
|
||||
|
||||
marketplace._update_user_reputation("user-1", -1.5) # Subtract 1.5 to go below 0
|
||||
print(f"After -1.5: {marketplace.user_reputations['user-1']}")
|
||||
assert marketplace.user_reputations["user-1"] == 0.0 # Min bound
|
||||
|
||||
async def test_escrow_system():
|
||||
"""Test escrow contract system"""
|
||||
config = MultiChainConfig()
|
||||
marketplace = GlobalChainMarketplace(config)
|
||||
|
||||
# Set up user reputations
|
||||
marketplace.user_reputations["seller-1"] = 0.8
|
||||
marketplace.user_reputations["buyer-1"] = 0.7
|
||||
|
||||
# Create listing and purchase
|
||||
listing_id = await marketplace.create_listing(
|
||||
chain_id="escrow-test-chain",
|
||||
chain_name="Escrow Test Chain",
|
||||
chain_type=ChainType.TOPIC,
|
||||
description="Test escrow functionality",
|
||||
seller_id="seller-1",
|
||||
price=Decimal("3.0"),
|
||||
currency="ETH",
|
||||
chain_specifications={},
|
||||
metadata={}
|
||||
)
|
||||
|
||||
transaction_id = await marketplace.purchase_chain(listing_id, "buyer-1", "crypto")
|
||||
|
||||
# Check escrow creation
|
||||
transaction = marketplace.transactions[transaction_id]
|
||||
escrow_address = transaction.escrow_address
|
||||
assert escrow_address in marketplace.escrow_contracts
|
||||
|
||||
escrow_contract = marketplace.escrow_contracts[escrow_address]
|
||||
assert escrow_contract["status"] == "active"
|
||||
assert escrow_contract["amount"] == Decimal("3.0")
|
||||
assert escrow_contract["buyer_id"] == "buyer-1"
|
||||
assert escrow_contract["seller_id"] == "seller-1"
|
||||
|
||||
# Complete transaction and check escrow release
|
||||
await marketplace.complete_transaction(transaction_id, "0xabcdef1234567890")
|
||||
|
||||
escrow_contract = marketplace.escrow_contracts[escrow_address]
|
||||
assert escrow_contract["status"] == "released"
|
||||
assert "fee_breakdown" in escrow_contract
|
||||
|
||||
fee_breakdown = escrow_contract["fee_breakdown"]
|
||||
assert fee_breakdown["escrow_fee"] == Decimal("0.06") # 2% of 3.0
|
||||
assert fee_breakdown["marketplace_fee"] == Decimal("0.03") # 1% of 3.0
|
||||
assert fee_breakdown["seller_amount"] == Decimal("2.91") # 3.0 - 0.06 - 0.03
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Run basic tests
|
||||
test_marketplace_creation()
|
||||
test_validation_functions()
|
||||
|
||||
# Run async tests
|
||||
asyncio.run(test_create_listing())
|
||||
asyncio.run(test_purchase_chain())
|
||||
asyncio.run(test_complete_transaction())
|
||||
asyncio.run(test_chain_economy())
|
||||
asyncio.run(test_search_listings())
|
||||
asyncio.run(test_user_transactions())
|
||||
asyncio.run(test_marketplace_overview())
|
||||
asyncio.run(test_escrow_system())
|
||||
|
||||
print("✅ All marketplace tests passed!")
|
||||
Reference in New Issue
Block a user