mcp-text-editor

by tumf
MIT License
48
  • Apple
  • Linux
"""Tests for InsertTextFileContentsHandler.""" import json import pytest from mcp_text_editor.handlers.insert_text_file_contents import ( InsertTextFileContentsHandler, ) from mcp_text_editor.text_editor import TextEditor @pytest.fixture def handler(): """Create handler instance.""" editor = TextEditor() return InsertTextFileContentsHandler(editor) @pytest.mark.asyncio async def test_missing_path(handler): """Test handling of missing file_path argument.""" with pytest.raises(RuntimeError, match="Missing required argument: file_path"): await handler.run_tool({"file_hash": "hash", "contents": "content"}) @pytest.mark.asyncio async def test_missing_hash(handler): """Test handling of missing file_hash argument.""" with pytest.raises(RuntimeError, match="Missing required argument: file_hash"): await handler.run_tool({"file_path": "/tmp/test.txt", "contents": "content"}) @pytest.mark.asyncio async def test_missing_contents(handler): """Test handling of missing contents argument.""" with pytest.raises(RuntimeError, match="Missing required argument: contents"): await handler.run_tool({"file_path": "/tmp/test.txt", "file_hash": "hash"}) @pytest.mark.asyncio async def test_relative_path(handler): """Test handling of relative file path.""" with pytest.raises(RuntimeError, match="File path must be absolute"): await handler.run_tool( { "file_path": "relative/path.txt", "file_hash": "hash", "contents": "content", "before": 1, } ) @pytest.mark.asyncio async def test_neither_before_nor_after(handler): """Test handling of neither before nor after specified.""" with pytest.raises( RuntimeError, match="Exactly one of 'before' or 'after' must be specified" ): await handler.run_tool( {"file_path": "/tmp/test.txt", "file_hash": "hash", "contents": "content"} ) @pytest.mark.asyncio async def test_both_before_and_after(handler): """Test handling of both before and after specified.""" with pytest.raises( RuntimeError, match="Exactly one of 'before' or 'after' must be specified" ): await handler.run_tool( { "file_path": "/tmp/test.txt", "file_hash": "hash", "contents": "content", "before": 1, "after": 2, } ) @pytest.mark.asyncio async def test_successful_insert_before(handler, tmp_path): """Test successful insert before line.""" test_file = tmp_path / "test.txt" test_file.write_text("line1\nline2\n") file_path = str(test_file) # Get the current hash content, _, _, init_hash, _, _ = await handler.editor.read_file_contents( file_path=file_path, start=1 ) result = await handler.run_tool( { "file_path": file_path, "file_hash": init_hash, "contents": "new_line\n", "before": 2, } ) assert len(result) == 1 assert result[0].type == "text" response_data = json.loads(result[0].text) assert response_data[file_path]["result"] == "ok" # Verify the content assert test_file.read_text() == "line1\nnew_line\nline2\n"