"""Unit tests for prompt handlers."""

import pytest
from typing import Dict
from arxiv_mcp_server.prompts.handlers import list_prompts, get_prompt
from mcp.types import GetPromptResult, PromptMessage, TextContent

@pytest.mark.asyncio
async def test_list_prompts():
    """Test listing available prompts."""
    prompts = await list_prompts()
    assert len(prompts) == 1
    
    prompt_names = {p.name for p in prompts}
    expected_names = {"deep-paper-analysis"}
    assert prompt_names == expected_names

@pytest.mark.asyncio
async def test_get_paper_analysis_prompt():
    """Test getting paper analysis prompt."""
    result = await get_prompt(
        "deep-paper-analysis",
        {"paper_id": "2401.00123"}
    )
    
    assert isinstance(result, GetPromptResult)
    assert len(result.messages) == 1
    message = result.messages[0]
    
    assert isinstance(message, PromptMessage)
    assert message.role == "user"
    assert isinstance(message.content, TextContent)
    assert "2401.00123" in message.content.text

@pytest.mark.asyncio
async def test_get_prompt_with_invalid_name():
    """Test getting prompt with invalid name."""
    with pytest.raises(ValueError, match="Prompt not found"):
        await get_prompt("invalid-prompt", {})

@pytest.mark.asyncio
async def test_get_prompt_with_no_arguments():
    """Test getting prompt with no arguments."""
    with pytest.raises(ValueError, match="No arguments provided"):
        await get_prompt("deep-paper-analysis", None)

@pytest.mark.asyncio
async def test_get_prompt_with_missing_required_argument():
    """Test getting prompt with missing required argument."""
    with pytest.raises(ValueError, match="Missing required argument"):
        await get_prompt("deep-paper-analysis", {})