mirror of
https://github.com/blackboxprogramming/BlackRoad-Operating-System.git
synced 2026-03-17 07:57:19 -05:00
MASSIVE UPDATE - 271 new files ## Agent Library (208 agents across 10 categories) - DevOps (28 agents): deployment, monitoring, infrastructure - Engineering (30 agents): code generation, testing, documentation - Data (25 agents): ETL, analysis, visualization - Security (20 agents): scanning, compliance, threat detection - Finance (20 agents): trading, portfolio, risk analysis - Creative (20 agents): content generation, SEO, translation - Business (20 agents): CRM, automation, project management - Research (15 agents): literature review, experiments, analysis - Web (15 agents): scraping, API integration, webhooks - AI/ML (15 agents): training, deployment, monitoring ## Base Framework - BaseAgent class with lifecycle management - AgentExecutor with parallel/sequential/DAG execution - AgentRegistry with discovery and search - Configuration management - Comprehensive error handling and retries ## Python SDK - Production-ready pip-installable package - Sync and async clients - Full type hints and Pydantic models - Comprehensive examples and tests - Auth, Blockchain, and Agent clients ## TypeScript/JavaScript SDK - Production-ready npm-publishable package - Full TypeScript types - ESM + CommonJS dual package - Browser and Node.js support - Comprehensive examples and tests ## Backend Integration - /api/agents endpoints in FastAPI - Agent execution API - Agent discovery and search - Execution plans and orchestration Value: $5M+ worth of engineering work
286 lines
9.4 KiB
Python
286 lines
9.4 KiB
Python
"""Tests for the BlackRoad client."""
|
|
|
|
import os
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
from blackroad import (
|
|
AuthenticationError,
|
|
BlackRoadClient,
|
|
ConfigurationError,
|
|
NotFoundError,
|
|
)
|
|
from blackroad.models import Token, User, Wallet
|
|
|
|
|
|
class TestBlackRoadClient:
|
|
"""Test suite for BlackRoadClient."""
|
|
|
|
def test_client_initialization(self) -> None:
|
|
"""Test client initialization."""
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
assert client._base_url == "http://localhost:8000"
|
|
client.close()
|
|
|
|
def test_client_initialization_from_env(self) -> None:
|
|
"""Test client initialization from environment variables."""
|
|
with patch.dict(os.environ, {"BLACKROAD_BASE_URL": "http://env-url:8000"}):
|
|
client = BlackRoadClient()
|
|
assert client._base_url == "http://env-url:8000"
|
|
client.close()
|
|
|
|
def test_client_initialization_no_url(self) -> None:
|
|
"""Test client initialization without base URL."""
|
|
with patch.dict(os.environ, {}, clear=True):
|
|
with pytest.raises(ConfigurationError):
|
|
BlackRoadClient()
|
|
|
|
def test_client_context_manager(self) -> None:
|
|
"""Test client as context manager."""
|
|
with BlackRoadClient(base_url="http://localhost:8000") as client:
|
|
assert client._base_url == "http://localhost:8000"
|
|
|
|
def test_set_token(self) -> None:
|
|
"""Test setting authentication token."""
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.set_token("test_token")
|
|
assert "Authorization" in client._http.headers
|
|
assert client._http.headers["Authorization"] == "Bearer test_token"
|
|
client.close()
|
|
|
|
def test_clear_token(self) -> None:
|
|
"""Test clearing authentication token."""
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.set_token("test_token")
|
|
client.clear_token()
|
|
assert "Authorization" not in client._http.headers
|
|
client.close()
|
|
|
|
def test_add_header(self) -> None:
|
|
"""Test adding custom header."""
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.add_header("X-Custom", "value")
|
|
assert client._http.headers["X-Custom"] == "value"
|
|
client.close()
|
|
|
|
def test_remove_header(self) -> None:
|
|
"""Test removing custom header."""
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.add_header("X-Custom", "value")
|
|
client.remove_header("X-Custom")
|
|
assert "X-Custom" not in client._http.headers
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.post")
|
|
def test_auth_login(self, mock_post: MagicMock) -> None:
|
|
"""Test authentication login."""
|
|
mock_post.return_value = {
|
|
"access_token": "test_access_token",
|
|
"refresh_token": "test_refresh_token",
|
|
"token_type": "bearer",
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
token = client.auth.login(username="testuser", password="testpass")
|
|
|
|
assert isinstance(token, Token)
|
|
assert token.access_token == "test_access_token"
|
|
assert token.token_type == "bearer"
|
|
|
|
mock_post.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.post")
|
|
def test_auth_register(self, mock_post: MagicMock) -> None:
|
|
"""Test user registration."""
|
|
mock_post.return_value = {
|
|
"id": 1,
|
|
"username": "testuser",
|
|
"email": "test@example.com",
|
|
"full_name": "Test User",
|
|
"is_active": True,
|
|
"is_verified": False,
|
|
"is_admin": False,
|
|
"wallet_address": "0x1234567890abcdef",
|
|
"balance": 100.0,
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
user = client.auth.register(
|
|
username="testuser",
|
|
email="test@example.com",
|
|
password="testpass",
|
|
full_name="Test User",
|
|
)
|
|
|
|
assert isinstance(user, User)
|
|
assert user.username == "testuser"
|
|
assert user.email == "test@example.com"
|
|
|
|
mock_post.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.get")
|
|
def test_auth_me(self, mock_get: MagicMock) -> None:
|
|
"""Test getting current user."""
|
|
mock_get.return_value = {
|
|
"id": 1,
|
|
"username": "testuser",
|
|
"email": "test@example.com",
|
|
"full_name": "Test User",
|
|
"is_active": True,
|
|
"is_verified": False,
|
|
"is_admin": False,
|
|
"wallet_address": "0x1234567890abcdef",
|
|
"balance": 100.0,
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.set_token("test_token")
|
|
user = client.auth.me()
|
|
|
|
assert isinstance(user, User)
|
|
assert user.username == "testuser"
|
|
|
|
mock_get.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.get")
|
|
def test_blockchain_get_wallet(self, mock_get: MagicMock) -> None:
|
|
"""Test getting wallet."""
|
|
mock_get.return_value = {
|
|
"address": "0x1234567890abcdef",
|
|
"balance": 100.0,
|
|
"label": "Primary Wallet",
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.set_token("test_token")
|
|
wallet = client.blockchain.get_wallet()
|
|
|
|
assert isinstance(wallet, Wallet)
|
|
assert wallet.address == "0x1234567890abcdef"
|
|
assert wallet.balance == 100.0
|
|
|
|
mock_get.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.post")
|
|
def test_blockchain_create_transaction(self, mock_post: MagicMock) -> None:
|
|
"""Test creating a transaction."""
|
|
from blackroad.models import Transaction
|
|
|
|
mock_post.return_value = {
|
|
"id": 1,
|
|
"transaction_hash": "0xabcdef",
|
|
"from_address": "0x1234",
|
|
"to_address": "0x5678",
|
|
"amount": 50.0,
|
|
"fee": 0.001,
|
|
"is_confirmed": False,
|
|
"confirmations": 0,
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.set_token("test_token")
|
|
tx = client.blockchain.create_transaction(
|
|
to_address="0x5678", amount=50.0, message="Test"
|
|
)
|
|
|
|
assert isinstance(tx, Transaction)
|
|
assert tx.amount == 50.0
|
|
|
|
mock_post.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.get")
|
|
def test_blockchain_get_stats(self, mock_get: MagicMock) -> None:
|
|
"""Test getting blockchain stats."""
|
|
from blackroad.models import BlockchainStats
|
|
|
|
mock_get.return_value = {
|
|
"latest_block_index": 100,
|
|
"latest_block_hash": "0xabcdef",
|
|
"total_blocks": 101,
|
|
"total_transactions": 500,
|
|
"pending_transactions": 10,
|
|
"difficulty": 4,
|
|
"mining_reward": 50.0,
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
stats = client.blockchain.get_stats()
|
|
|
|
assert isinstance(stats, BlockchainStats)
|
|
assert stats.total_blocks == 101
|
|
assert stats.total_transactions == 500
|
|
|
|
mock_get.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.get")
|
|
def test_agents_list(self, mock_get: MagicMock) -> None:
|
|
"""Test listing agents."""
|
|
from blackroad.models import AgentInfo
|
|
|
|
mock_get.return_value = [
|
|
{
|
|
"name": "test-agent",
|
|
"description": "Test agent",
|
|
"category": "test",
|
|
"version": "1.0.0",
|
|
"author": "BlackRoad",
|
|
"tags": [],
|
|
"status": "idle",
|
|
"dependencies": [],
|
|
}
|
|
]
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
agents = client.agents.list_agents()
|
|
|
|
assert len(agents) == 1
|
|
assert isinstance(agents[0], AgentInfo)
|
|
assert agents[0].name == "test-agent"
|
|
|
|
mock_get.assert_called_once()
|
|
client.close()
|
|
|
|
@patch("blackroad.utils.http.HTTPClient.post")
|
|
def test_agents_execute(self, mock_post: MagicMock) -> None:
|
|
"""Test executing an agent."""
|
|
from blackroad.models import AgentResult
|
|
|
|
mock_post.return_value = {
|
|
"agent_name": "test-agent",
|
|
"execution_id": "123e4567-e89b-12d3-a456-426614174000",
|
|
"status": "completed",
|
|
"data": {"result": "success"},
|
|
"error": None,
|
|
"started_at": "2024-01-01T00:00:00Z",
|
|
"completed_at": "2024-01-01T00:01:00Z",
|
|
"duration_seconds": 60.0,
|
|
"metadata": {},
|
|
}
|
|
|
|
client = BlackRoadClient(base_url="http://localhost:8000")
|
|
client.set_token("test_token")
|
|
result = client.agents.execute_agent(
|
|
agent_name="test-agent", params={"test": "value"}
|
|
)
|
|
|
|
assert isinstance(result, AgentResult)
|
|
assert result.agent_name == "test-agent"
|
|
assert result.status.value == "completed"
|
|
|
|
mock_post.assert_called_once()
|
|
client.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__, "-v"])
|