Zotero MCP Server

import pytest from unittest.mock import Mock, patch from zotero_mcp.server import search_papers, get_paper_notes, add_note, request_summary, get_paper, get_pdf_content # Mock data MOCK_ITEMS = [ { "key": "ABC123", "data": { "key": "ABC123", "title": "Test Paper", "tags": [{"tag": "test"}], "date": "2024", "creators": [{"firstName": "John", "lastName": "Doe"}], "itemType": "journalArticle", "abstractNote": "This is a test abstract" }, "links": { "attachment": { "href": "/items/PDF123", "attachmentType": "application/pdf" } } } ] MOCK_NOTES = [ { "key": "NOTE123", "data": { "itemType": "note", "note": "Test note content", "tags": [{"tag": "test"}] } } ] MOCK_CHILDREN = [ { "key": "PDF456", "data": { "itemType": "attachment", "contentType": "application/pdf" } } ] @pytest.fixture def mock_zotero(): with patch('zotero_mcp.server.zot') as mock_zot: mock_zot.items.return_value = MOCK_ITEMS mock_zot.children.return_value = MOCK_NOTES mock_zot.item_template.return_value = {"note": "", "tags": []} mock_zot.create_items.return_value = {"successful": {"0": {"key": "NEW123"}}} mock_zot.item.return_value = MOCK_ITEMS[0] mock_zot.update_item.return_value = None mock_zot.file.return_value = b"PDF content" yield mock_zot def test_search_papers(mock_zotero): """Test the search_papers function.""" # Test searching by tags only result = search_papers(tags=['tag1']) assert result['status'] == "success" assert len(result['items']) == 1 assert result['items'][0]['title'] == 'Test Paper' # Test searching by query only result = search_papers(query='Test Paper') assert result['status'] == "success" assert len(result['items']) == 1 assert result['items'][0]['title'] == 'Test Paper' # Test searching by both tags and query result = search_papers(tags=['tag1'], query='Test Paper') assert result['status'] == "success" assert len(result['items']) == 1 assert result['items'][0]['title'] == 'Test Paper' # Test searching with no parameters result = search_papers() assert result['status'] == "success" assert len(result['items']) == 1 def test_get_paper(mock_zotero): result = get_paper("ABC123") assert result["status"] == "success" assert result["item"]["title"] == "Test Paper" assert result["item"]["key"] == "ABC123" def test_get_paper_notes(mock_zotero): result = get_paper_notes("ABC123") assert len(result["notes"]) == 1 assert result["notes"][0]["key"] == "NOTE123" assert result["notes"][0]["text"] == "Test note content" def test_add_note(mock_zotero): result = add_note("ABC123", "New note", tags=["test"]) assert result["status"] == "success" assert result["note_key"] == "NEW123" def test_get_pdf_content_from_links(mock_zotero): result = get_pdf_content("ABC123") assert result["success"] == True assert result["content"] == b"PDF content" assert result["attachment_key"] == "PDF123" def test_get_pdf_content_from_children(mock_zotero): # Remove attachment from links and set up children with PDF mock_item = MOCK_ITEMS[0].copy() mock_item["links"] = {} mock_zotero.item.return_value = mock_item mock_zotero.children.return_value = MOCK_CHILDREN result = get_pdf_content("ABC123") assert result["success"] == True assert result["content"] == b"PDF content" assert result["attachment_key"] == "PDF456" def test_request_summary(mock_zotero): result = request_summary("ABC123") assert result["status"] == "success" assert result["message"] == "Summary requested" mock_zotero.update_item.assert_called_once()