Skip to content

Commit 6125417

Browse files
NishanthNishanth
authored andcommitted
Add test cases for lrem
1 parent 4379242 commit 6125417

File tree

2 files changed

+81
-22
lines changed

2 files changed

+81
-22
lines changed

src/tools/list.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,24 @@ async def llen(name: str) -> int:
8585

8686
@mcp.tool()
8787
async def lrem(name: str, count: int, element: FieldT) -> str:
88-
    """Remove elements from a Redis list.
89-
   
90-
    Args:
91-
        name: The name of the list
92-
        count: Number of elements to remove (0 = all, positive = from head, negative = from tail)
93-
        element: The element value to remove
94-
       
95-
    Returns:
96-
        A string indicating the number of elements removed.
97-
    """
98-
    try:
99-
        r = RedisConnectionManager.get_connection()
100-
        removed_count = r.lrem(name, count, element)
101-
       
102-
        if removed_count == 0:
103-
            return f"Element '{element}' not found in list '{name}' or list does not exist."
104-
        else:
105-
            return f"Removed {removed_count} occurrence(s) of '{element}' from list '{name}'."
106-
           
107-
    except RedisError as e:
108-
        return f"Error removing element from list '{name}': {str(e)}"
88+
"""Remove elements from a Redis list.
89+
90+
Args:
91+
name: The name of the list
92+
count: Number of elements to remove (0 = all, positive = from head, negative = from tail)
93+
element: The element value to remove
94+
95+
Returns:
96+
A string indicating the number of elements removed.
97+
"""
98+
try:
99+
r = RedisConnectionManager.get_connection()
100+
removed_count = r.lrem(name, count, element)
101+
102+
if removed_count == 0:
103+
return f"Element '{element}' not found in list '{name}' or list does not exist."
104+
else:
105+
return f"Removed {removed_count} occurrence(s) of '{element}' from list '{name}'."
106+
107+
except RedisError as e:
108+
return f"Error removing element from list '{name}': {str(e)}"

tests/tools/test_list.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66
from redis.exceptions import RedisError
77

8-
from src.tools.list import llen, lpop, lpush, lrange, rpop, rpush
8+
from src.tools.list import llen, lpop, lpush, lrange, rpop, rpush, lrem
99

1010

1111
class TestListOperations:
@@ -278,3 +278,62 @@ async def test_push_operations_return_new_length(
278278
# Results should indicate successful push regardless of return value
279279
assert "pushed to the left of list" in result1
280280
assert "pushed to the right of list" in result2
281+
282+
@pytest.mark.asyncio
283+
async def test_lrem_success_single_removal(self, mock_redis_connection_manager):
284+
"""Test successful removal of a single matching element."""
285+
mock_redis = mock_redis_connection_manager
286+
mock_redis.lrem.return_value = 1
287+
288+
result = await lrem("test_list", 1, "value1")
289+
290+
mock_redis.lrem.assert_called_once_with("test_list", 1, "value1")
291+
assert "Removed 1 occurrence(s) of 'value1' from list 'test_list'" in result
292+
293+
@pytest.mark.asyncio
294+
async def test_lrem_success_multiple_removal(self, mock_redis_connection_manager):
295+
"""Test successful removal of multiple matching elements."""
296+
mock_redis = mock_redis_connection_manager
297+
mock_redis.lrem.return_value = 3
298+
299+
result = await lrem("test_list", 0, "value1")
300+
301+
mock_redis.lrem.assert_called_once_with("test_list", 0, "value1")
302+
assert "Removed 3 occurrence(s) of 'value1' from list 'test_list'" in result
303+
304+
@pytest.mark.asyncio
305+
async def test_lrem_no_elements_removed(self, mock_redis_connection_manager):
306+
"""Test when no elements are removed because the element is not found."""
307+
mock_redis = mock_redis_connection_manager
308+
mock_redis.lrem.return_value = 0
309+
310+
result = await lrem("test_list", 2, "missing_value")
311+
312+
mock_redis.lrem.assert_called_once_with("test_list", 2, "missing_value")
313+
assert (
314+
"Element 'missing_value' not found in list 'test_list' or list does not exist."
315+
in result
316+
)
317+
318+
@pytest.mark.asyncio
319+
async def test_lrem_negative_count(self, mock_redis_connection_manager):
320+
"""Test removal with a negative count (from tail)."""
321+
mock_redis = mock_redis_connection_manager
322+
mock_redis.lrem.return_value = 2
323+
324+
result = await lrem("test_list", -2, "value_tail")
325+
326+
mock_redis.lrem.assert_called_once_with("test_list", -2, "value_tail")
327+
assert "Removed 2 occurrence(s) of 'value_tail' from list 'test_list'" in result
328+
329+
@pytest.mark.asyncio
330+
async def test_lrem_redis_error(self, mock_redis_connection_manager):
331+
"""Test error handling during lrem operation."""
332+
mock_redis = mock_redis_connection_manager
333+
mock_redis.lrem.side_effect = RedisError("Connection failed")
334+
335+
result = await lrem("test_list", 1, "value1")
336+
337+
assert (
338+
"Error removing element from list 'test_list': Connection failed" in result
339+
)

0 commit comments

Comments
 (0)