import pytest
from unittest.mock import Mock
from swarms.orchestrator.orchestrate import Orchestrator


@pytest.fixture
def mock_agent():
    return Mock()

@pytest.fixture
def mock_task():
    return {"task_id": 1, "task_data": "data"}

@pytest.fixture
def mock_vector_db():
    return Mock()

@pytest.fixture
def orchestrator(mock_agent, mock_vector_db):
    agent_list = [mock_agent for _ in range(5)]
    task_queue = []
    return Orchestrator(mock_agent, agent_list, task_queue, mock_vector_db)


def test_assign_task(orchestrator, mock_agent, mock_task, mock_vector_db):
    orchestrator.task_queue.append(mock_task)
    orchestrator.assign_task(0, mock_task)

    mock_agent.process_task.assert_called_once()
    mock_vector_db.add_documents.assert_called_once()


def test_retrieve_results(orchestrator, mock_vector_db):
    mock_vector_db.query.return_value = "expected_result"
    assert orchestrator.retrieve_results(0) == "expected_result"


def test_update_vector_db(orchestrator, mock_vector_db):
    data = {"vector": [0.1, 0.2, 0.3], "task_id": 1}
    orchestrator.update_vector_db(data)
    mock_vector_db.add_documents.assert_called_once_with([data['vector']], [str(data['task_id'])])


def test_get_vector_db(orchestrator, mock_vector_db):
    assert orchestrator.get_vector_db() == mock_vector_db


def test_append_to_db(orchestrator, mock_vector_db):
    collection = "test_collection"
    result = "test_result"
    orchestrator.append_to_db(collection, result)
    mock_vector_db.append_document.assert_called_once_with(collection, result, id=str(id(result)))


def test_run(orchestrator, mock_agent, mock_vector_db):
    objective = "test_objective"
    collection = "test_collection"
    orchestrator.run(objective, collection)

    mock_agent.process_task.assert_called()
    mock_vector_db.append_document.assert_called()
