- 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
373 lines
13 KiB
Python
Executable File
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!")
|