Files
aitbc/cli/tests/multichain/test_marketplace.py
oib 15427c96c0 chore: update file permissions to executable across repository
- Change file mode from 644 to 755 for all project files
- Add chain_id parameter to get_balance RPC endpoint with default "ait-devnet"
- Rename Miner.extra_meta_data to extra_metadata for consistency
2026-03-06 22:17:54 +01:00

373 lines
13 KiB
Python
Executable File

"""
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!")