summaryrefslogtreecommitdiff
path: root/tests/test_helpers.py
blob: c351b77ca4b15fa80a7a78e1cf4b651e6c836c2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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',
                },
            },
        )