pythonasyncioeventletgeventlong-pollinglow-latencysocket-iosocketiosocketio-serverweb-serverwebsocket
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.6 KiB
142 lines
4.6 KiB
import pytest
|
|
import redis
|
|
import valkey
|
|
|
|
from socketio import redis_manager
|
|
from socketio.redis_manager import RedisManager, parse_redis_sentinel_url
|
|
|
|
|
|
class TestPubSubManager:
|
|
def test_redis_not_installed(self):
|
|
saved_redis = redis_manager.redis
|
|
redis_manager.redis = None
|
|
|
|
with pytest.raises(RuntimeError):
|
|
RedisManager('redis://')
|
|
assert RedisManager('unix:///var/sock/redis.sock') is not None
|
|
|
|
redis_manager.redis = saved_redis
|
|
|
|
def test_valkey_not_installed(self):
|
|
saved_valkey = redis_manager.valkey
|
|
redis_manager.valkey = None
|
|
|
|
with pytest.raises(RuntimeError):
|
|
RedisManager('valkey://')
|
|
assert RedisManager('unix:///var/sock/redis.sock') is not None
|
|
|
|
redis_manager.valkey = saved_valkey
|
|
|
|
def test_redis_valkey_not_installed(self):
|
|
saved_redis = redis_manager.redis
|
|
redis_manager.redis = None
|
|
saved_valkey = redis_manager.valkey
|
|
redis_manager.valkey = None
|
|
|
|
with pytest.raises(RuntimeError):
|
|
RedisManager('redis://')
|
|
with pytest.raises(RuntimeError):
|
|
RedisManager('valkey://')
|
|
with pytest.raises(RuntimeError):
|
|
RedisManager('unix:///var/sock/redis.sock')
|
|
|
|
redis_manager.redis = saved_redis
|
|
redis_manager.valkey = saved_valkey
|
|
|
|
def test_bad_url(self):
|
|
with pytest.raises(ValueError):
|
|
RedisManager('http://localhost:6379')
|
|
|
|
def test_redis_connect(self):
|
|
urls = [
|
|
'redis://localhost:6379',
|
|
'redis://localhost:6379/0',
|
|
'redis://:password@localhost:6379',
|
|
'redis://:password@localhost:6379/0',
|
|
'redis://user:password@localhost:6379',
|
|
'redis://user:password@localhost:6379/0',
|
|
|
|
'rediss://localhost:6379',
|
|
'rediss://localhost:6379/0',
|
|
'rediss://:password@localhost:6379',
|
|
'rediss://:password@localhost:6379/0',
|
|
'rediss://user:password@localhost:6379',
|
|
'rediss://user:password@localhost:6379/0',
|
|
|
|
'unix:///var/sock/redis.sock',
|
|
'unix:///var/sock/redis.sock?db=0',
|
|
'unix://user@/var/sock/redis.sock',
|
|
'unix://user@/var/sock/redis.sock?db=0',
|
|
|
|
'redis+sentinel://192.168.0.1:6379,192.168.0.2:6379/'
|
|
]
|
|
for url in urls:
|
|
c = RedisManager(url)
|
|
assert isinstance(c.redis, redis.Redis)
|
|
|
|
def test_valkey_connect(self):
|
|
saved_redis = redis_manager.redis
|
|
redis_manager.redis = None
|
|
|
|
urls = [
|
|
'valkey://localhost:6379',
|
|
'valkey://localhost:6379/0',
|
|
'valkey://:password@localhost:6379',
|
|
'valkey://:password@localhost:6379/0',
|
|
'valkey://user:password@localhost:6379',
|
|
'valkey://user:password@localhost:6379/0',
|
|
|
|
'valkeys://localhost:6379',
|
|
'valkeys://localhost:6379/0',
|
|
'valkeys://:password@localhost:6379',
|
|
'valkeys://:password@localhost:6379/0',
|
|
'valkeys://user:password@localhost:6379',
|
|
'valkeys://user:password@localhost:6379/0',
|
|
|
|
'unix:///var/sock/redis.sock',
|
|
'unix:///var/sock/redis.sock?db=0',
|
|
'unix://user@/var/sock/redis.sock',
|
|
'unix://user@/var/sock/redis.sock?db=0',
|
|
|
|
'valkey+sentinel://192.168.0.1:6379,192.168.0.2:6379/'
|
|
]
|
|
for url in urls:
|
|
c = RedisManager(url)
|
|
assert isinstance(c.redis, valkey.Valkey)
|
|
|
|
redis_manager.redis = saved_redis
|
|
|
|
@pytest.mark.parametrize('rtype', ['redis', 'valkey'])
|
|
def test_sentinel_url_parser(self, rtype):
|
|
with pytest.raises(ValueError):
|
|
parse_redis_sentinel_url(f'{rtype}://localhost:6379/0')
|
|
|
|
assert parse_redis_sentinel_url(
|
|
f'{rtype}+sentinel://localhost:6379'
|
|
) == (
|
|
[('localhost', 6379)],
|
|
None,
|
|
{}
|
|
)
|
|
assert parse_redis_sentinel_url(
|
|
f'{rtype}+sentinel://192.168.0.1:6379,192.168.0.2:6379/'
|
|
) == (
|
|
[('192.168.0.1', 6379), ('192.168.0.2', 6379)],
|
|
None,
|
|
{}
|
|
)
|
|
assert parse_redis_sentinel_url(
|
|
f'{rtype}+sentinel://h1:6379,h2:6379/0'
|
|
) == (
|
|
[('h1', 6379), ('h2', 6379)],
|
|
None,
|
|
{'db': 0}
|
|
)
|
|
assert parse_redis_sentinel_url(
|
|
f'{rtype}+sentinel://'
|
|
'user:password@h1:6379,h2:6379,h1:6380/0/myredis'
|
|
) == (
|
|
[('h1', 6379), ('h2', 6379), ('h1', 6380)],
|
|
'myredis',
|
|
{'username': 'user', 'password': 'password', 'db': 0}
|
|
)
|
|
|