import pytest import redis from redis.connection import Connection from .conftest import _get_client class TestEncoding: @pytest.fixture() def r(self, request): return _get_client(redis.Redis, request=request, decode_responses=True) @pytest.fixture() def r_no_decode(self, request): return _get_client( redis.Redis, request=request, decode_responses=False, ) def test_simple_encoding(self, r_no_decode): unicode_string = chr(3456) + "abcd" + chr(3421) r_no_decode["unicode-string"] = unicode_string.encode("utf-8") cached_val = r_no_decode["unicode-string"] assert isinstance(cached_val, bytes) assert unicode_string == cached_val.decode("utf-8") def test_simple_encoding_and_decoding(self, r): unicode_string = chr(3456) + "abcd" + chr(3421) r["unicode-string"] = unicode_string cached_val = r["unicode-string"] assert isinstance(cached_val, str) assert unicode_string == cached_val def test_memoryview_encoding(self, r_no_decode): unicode_string = chr(3456) + "abcd" + chr(3421) unicode_string_view = memoryview(unicode_string.encode("utf-8")) r_no_decode["unicode-string-memoryview"] = unicode_string_view cached_val = r_no_decode["unicode-string-memoryview"] # The cached value won't be a memoryview because it's a copy from Redis assert isinstance(cached_val, bytes) assert unicode_string == cached_val.decode("utf-8") def test_memoryview_encoding_and_decoding(self, r): unicode_string = chr(3456) + "abcd" + chr(3421) unicode_string_view = memoryview(unicode_string.encode("utf-8")) r["unicode-string-memoryview"] = unicode_string_view cached_val = r["unicode-string-memoryview"] assert isinstance(cached_val, str) assert unicode_string == cached_val def test_list_encoding(self, r): unicode_string = chr(3456) + "abcd" + chr(3421) result = [unicode_string, unicode_string, unicode_string] r.rpush("a", *result) assert r.lrange("a", 0, -1) == result class TestEncodingErrors: def test_ignore(self, request): r = _get_client( redis.Redis, request=request, decode_responses=True, encoding_errors="ignore", ) r.set("a", b"foo\xff") assert r.get("a") == "foo" def test_replace(self, request): r = _get_client( redis.Redis, request=request, decode_responses=True, encoding_errors="replace", ) r.set("a", b"foo\xff") assert r.get("a") == "foo\ufffd" class TestMemoryviewsAreNotPacked: def test_memoryviews_are_not_packed(self): c = Connection() arg = memoryview(b"some_arg") arg_list = ["SOME_COMMAND", arg] cmd = c.pack_command(*arg_list) assert cmd[1] is arg cmds = c.pack_commands([arg_list, arg_list]) assert cmds[1] is arg assert cmds[3] is arg class TestCommandsAreNotEncoded: @pytest.fixture() def r(self, request): return _get_client(redis.Redis, request=request, encoding="utf-16") def test_basic_command(self, r): r.set("hello", "world") class TestInvalidUserInput: def test_boolean_fails(self, r): with pytest.raises(redis.DataError): r.set("a", True) def test_none_fails(self, r): with pytest.raises(redis.DataError): r.set("a", None) def test_user_type_fails(self, r): class Foo: def __str__(self): return "Foo" with pytest.raises(redis.DataError): r.set("a", Foo())