from unittest import mock from rq.cli.helpers import get_redis_from_config from tests import RQTestCase class TestHelpers(RQTestCase): @mock.patch('rq.cli.helpers.Sentinel') def test_get_redis_from_config(self, sentinel_class_mock): """Ensure Redis connection params are properly parsed""" settings = {'REDIS_URL': 'redis://localhost:1/1'} # Ensure REDIS_URL is read redis = get_redis_from_config(settings) connection_kwargs = redis.connection_pool.connection_kwargs self.assertEqual(connection_kwargs['db'], 1) self.assertEqual(connection_kwargs['port'], 1) settings = { 'REDIS_URL': 'redis://localhost:1/1', 'REDIS_HOST': 'foo', 'REDIS_DB': 2, 'REDIS_PORT': 2, 'REDIS_PASSWORD': 'bar', } # Ensure REDIS_URL is preferred redis = get_redis_from_config(settings) connection_kwargs = redis.connection_pool.connection_kwargs self.assertEqual(connection_kwargs['db'], 1) self.assertEqual(connection_kwargs['port'], 1) # Ensure fall back to regular connection parameters settings['REDIS_URL'] = None redis = get_redis_from_config(settings) connection_kwargs = redis.connection_pool.connection_kwargs self.assertEqual(connection_kwargs['host'], 'foo') self.assertEqual(connection_kwargs['db'], 2) self.assertEqual(connection_kwargs['port'], 2) self.assertEqual(connection_kwargs['password'], 'bar') # Add Sentinel to the settings settings.update( { 'SENTINEL': { 'INSTANCES': [ ('remote.host1.org', 26379), ('remote.host2.org', 26379), ('remote.host3.org', 26379), ], 'MASTER_NAME': 'master', 'DB': 2, 'USERNAME': 'redis-user', 'PASSWORD': 'redis-secret', 'SOCKET_TIMEOUT': None, 'CONNECTION_KWARGS': { 'ssl_ca_path': None, }, 'SENTINEL_KWARGS': { 'username': 'sentinel-user', 'password': 'sentinel-secret', }, }, } ) # Ensure SENTINEL is preferred against REDIS_* parameters redis = get_redis_from_config(settings) sentinel_init_sentinels_args = sentinel_class_mock.call_args[0] sentinel_init_sentinel_kwargs = sentinel_class_mock.call_args[1] self.assertEqual( sentinel_init_sentinels_args, ([('remote.host1.org', 26379), ('remote.host2.org', 26379), ('remote.host3.org', 26379)],), ) self.assertDictEqual( sentinel_init_sentinel_kwargs, { 'db': 2, 'ssl': False, 'username': 'redis-user', 'password': 'redis-secret', 'socket_timeout': None, 'ssl_ca_path': None, 'sentinel_kwargs': { 'username': 'sentinel-user', 'password': 'sentinel-secret', }, }, )