Skip to content

Commit d70fbc5

Browse files
committed
Fix TcpFakeServer EVALSHA NOSCRIPT error handling
- Add NOSCRIPT prefix to NoScriptError messages in TCP protocol - Add test for EVALSHA with missing script
1 parent f576458 commit d70fbc5

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

fakeredis/_tcp_server.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from socketserver import ThreadingTCPServer, StreamRequestHandler
66
from typing import Dict, Tuple, Any, Union
77

8+
import redis.exceptions
89
from redis.lock import Lock
910

1011
from fakeredis import FakeRedis
@@ -84,7 +85,11 @@ def dump(self, value: Any, dump_bulk: bool = False) -> None:
8485
elif value is None:
8586
self.writer.write("$-1\r\n".encode())
8687
elif isinstance(value, Exception):
87-
self.writer.write(f"-{value.args[0]}\r\n".encode())
88+
if isinstance(value, redis.exceptions.NoScriptError):
89+
error_msg = f"NOSCRIPT {value.args[0]}"
90+
else:
91+
error_msg = value.args[0]
92+
self.writer.write(f"-{error_msg}\r\n".encode())
8893

8994

9095
class TCPFakeRequestHandler(StreamRequestHandler):
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import time
2+
from threading import Thread
3+
4+
import redis
5+
6+
from fakeredis import TcpFakeServer
7+
from test import testtools
8+
9+
10+
@testtools.run_test_if_lupa_installed()
11+
def test_evalsha_missing_script():
12+
"""Test that EVALSHA with a non-existent script returns NOSCRIPT error."""
13+
server_address = ("127.0.0.1", 19000)
14+
server = TcpFakeServer(server_address)
15+
t = Thread(target=server.serve_forever, daemon=True)
16+
t.start()
17+
time.sleep(0.1)
18+
19+
with redis.Redis(host=server_address[0], port=server_address[1]) as r:
20+
fake_sha = "0" * 40 # Non-existent script/hash
21+
try:
22+
r.evalsha(fake_sha, 0)
23+
assert False, "Expected NoScriptError"
24+
except redis.exceptions.NoScriptError:
25+
# Success - the server correctly sent NOSCRIPT error and redis-py recognized it
26+
pass
27+
28+
server.server_close()
29+
server.shutdown()
30+
t.join()

0 commit comments

Comments
 (0)