File: test_logging_filters.py

package info (click to toggle)
python-django-extensions 4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,820 kB
  • sloc: python: 18,601; javascript: 7,354; makefile: 108; xml: 17
file content (76 lines) | stat: -rw-r--r-- 2,660 bytes parent folder | download
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
# -*- coding: utf-8 -*-
import time

from django.test import TestCase
from django.test.utils import override_settings

from django_extensions.logging.filters import RateLimiterFilter

from unittest import mock


TEST_SUBJECT = "test_subect"


class RateLimiterFilterTests(TestCase):
    """Tests for RateLimiterFilter."""

    def setUp(self):
        self.rate_limiter_filter = RateLimiterFilter()
        self.record = mock.Mock(msg=TEST_SUBJECT)
        self.record.getMessage.return_value = TEST_SUBJECT.encode()
        self.time_patch = mock.patch.object(time, "time", return_value="test_time")
        self.time_patch.start()

    def tearDown(self):
        self.time_patch.stop()

    @override_settings(RATE_LIMITER_FILTER_PREFIX="test_prefix")
    @mock.patch("django.core.cache.cache")
    def test_should_incr_cache_with_custom_prefix_and_return_False(self, m_cache):
        m_cache.get_many.return_value = {
            "test_prefix:114392702498ad1d75c1829b9519b8c7": 10,
            "test_prefix:114392702498ad1d75c1829b9519b8c7:count": 1,
        }

        result = self.rate_limiter_filter.filter(self.record)

        self.assertIs(m_cache.set.called, False)
        m_cache.incr.assert_called_once_with(
            "test_prefix:114392702498ad1d75c1829b9519b8c7:count"
        )
        self.assertIs(result, False)

    @override_settings(RATE_LIMITER_FILTER_RATE=1)
    @mock.patch("django.core.cache.cache")
    def test_should_set_cache_key_with_custom_rate_and_return_True(self, m_cache):
        m_cache.get_many.return_value = {}
        expected_calls = [
            mock.call(
                "ratelimiterfilter:114392702498ad1d75c1829b9519b8c7:count", 1, 61
            ),
            mock.call(
                "ratelimiterfilter:114392702498ad1d75c1829b9519b8c7", "test_time", 1
            ),
        ]

        result = self.rate_limiter_filter.filter(self.record)

        self.assertEqual(self.record.msg, "[1x] test_subect")
        m_cache.set.assert_has_calls(expected_calls, any_order=False)
        self.assertIs(result, True)

    @mock.patch("django.core.cache.cache")
    def test_should_modify_record_msg_and_return_True(self, m_cache):
        """Default rate and prefix values."""
        m_cache.get_many.return_value = {
            "ratelimiterfilter:114392702498ad1d75c1829b9519b8c7:count": 999,
        }

        result = self.rate_limiter_filter.filter(self.record)

        self.assertEqual(self.record.msg, "[999x] test_subect")
        m_cache.set.assert_called_once_with(
            "ratelimiterfilter:114392702498ad1d75c1829b9519b8c7", "test_time", 10
        )
        self.assertIs(result, True)