File: test_async_middleware.py

package info (click to toggle)
python-django-guid 3.5.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 664 kB
  • sloc: python: 1,267; makefile: 16
file content (76 lines) | stat: -rw-r--r-- 3,186 bytes parent folder | download | duplicates (2)
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
import asyncio
from copy import deepcopy

from django.conf import settings as django_settings
from django.test import override_settings

import pytest


async def test_one_request(async_client, caplog, mock_uuid):
    response = await async_client.get('/asgi')
    expected = [
        ('async middleware called', None),
        (
            'Header `Correlation-ID` was not found in the incoming request. Generated '
            'new GUID: 704ae5472cae4f8daa8f2cc5a5a8mock',
            None,
        ),
        ('This log message should have a GUID', '704ae5472cae4f8daa8f2cc5a5a8mock'),
        ('Going to sleep for a sec', '704ae5472cae4f8daa8f2cc5a5a8mock'),
        ('Going to sleep for a sec', '704ae5472cae4f8daa8f2cc5a5a8mock'),
        ('Warning, I am awake!', '704ae5472cae4f8daa8f2cc5a5a8mock'),
        ('Warning, I am awake!', '704ae5472cae4f8daa8f2cc5a5a8mock'),
        ('Received signal `request_finished`, clearing guid', '704ae5472cae4f8daa8f2cc5a5a8mock'),
    ]

    assert [(x.message, x.correlation_id) for x in caplog.records] == expected
    assert response['Correlation-ID'] == '704ae5472cae4f8daa8f2cc5a5a8mock'


async def test_two_requests_concurrently(async_client, caplog, mock_uuid_two_unique, two_unique_uuid4):
    """
    Checks that a following request does not inherit a previous GUID
    """
    tasks = [asyncio.create_task(async_client.get('/asgi')), asyncio.create_task(async_client.get('/asgi'))]
    await asyncio.gather(*tasks)
    expected = [
        t
        for guid in two_unique_uuid4
        for t in [
            ('async middleware called', None),
            (
                f'Header `Correlation-ID` was not found in the incoming request. Generated new GUID: {guid}',
                None,
            ),
            ('This log message should have a GUID', guid),
            ('Going to sleep for a sec', guid),
            ('Going to sleep for a sec', guid),
            ('Warning, I am awake!', guid),
            ('Warning, I am awake!', guid),
            ('Received signal `request_finished`, clearing guid', guid),
        ]
    ]
    # Sort both lists and compare - order will vary between runs
    assert sorted((x.message, x.correlation_id) for x in caplog.records) == sorted(expected)


async def test_ignored_url(async_client, caplog, monkeypatch):
    """
    Test that a URL specified in IGNORE_URLS is ignored in the async view
    :param async_client: Django async client
    :param caplog: Caplog fixture
    :param monkeypatch: Monkeypatch for django settings
    """
    mocked_settings = deepcopy(django_settings.DJANGO_GUID)
    mocked_settings['IGNORE_URLS'] = {'no-guid'}
    with override_settings(**mocked_settings):
        await async_client.get('/no-guid')
        # No log message should have a GUID, aka `None` on index 1.
        expected = [
            ('async middleware called', None),
            ('This log message should NOT have a GUID - the URL is in IGNORE_URLS', None),
            ('Some warning in a function', None),
            ('Received signal `request_finished`, clearing guid', None),
        ]
        assert [(x.message, x.correlation_id) for x in caplog.records] == expected