Python. Тестирование функции http-сервиса

Имеется http-сервис, реализованный на django. Функция, ослеживающая количество запросов к серверу в течении заданного времени. Пытаюсь написать тесты для тестирования данного сервиса. При попытке запуска тестов из poetry (poetry run pytest) тесты проходят в половине процентов случаев. Т.е. первый запуск выдает ошибку:

E django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

Следующий запуск выдает результат,что все тесты пройдены на 100%.

views.py

from django.shortcuts import render
from redis import Redis

MAX_REQ = 3 #limit of requests for a specified time
EXP = 120 #wait time after limit

def check_raite_limit(request, remote_addr):
    r = Redis()
    _ip = r.exists(remote_addr)
    if _ip:
        r.set_response_callback('HGET', float)
        count = r.hget(remote_addr, "count")

        if count >= MAX_REQ:
            return render(request, 'ratelimited.html', status=429)

        r.hincrby(remote_addr, "count", 1)
        data = r.hgetall(remote_addr)
        return render(request, 'index.html', context={
            'ip': data,
        })

    else:
        data = {remote_addr:
            {"count": 0},
        }
        with r.pipeline() as pipe:
            for _ip, _data in data.items():
                pipe.hmset(_ip, _data)
                pipe.expire(_ip, EXP)
            pipe.execute()
        r.bgsave()
        data = r.hgetall(_ip)
        return render(request, 'index.html', context={
            'ip': data,
        })


def get_client_ip(req):
    """
    This is used to get the user's IP from the request object.

    """
    x_forwarded_for = req.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = req.META.get('REMOTE_ADDR', "unknown")
    return ip


def index(request):
    print(request)
    ip = str(get_client_ip(request))
    data = check_raite_limit(request, ip)
    return data

test_views.py

from req_limit.limit.views import check_raite_limit
from redis import Redis

MAX_REQ = 3 #limit of requests for a specified time
EXP = 120 #wait time after limit

def test_check_raite_limit():
    ip = '123.456.789.0'
    r = Redis()
    #request = "<WSGIRequest: GET '/'>"
    _ip = r.exists(ip)
    if _ip:
        r.delete(ip)
    else:
        #data = {b'count':b'0'}
        assert str(check_raite_limit(request, ip)) == """
        render(<WSGIRequest: GET '/'>, 'index.html', context={'ip': {b'count':b'0'},})
        """
        #assert check_raite_limit(request, ip)) == render(request, 'index.html', context={'ip': data,})

К сожалению, мне так и не удалось реализовать более правильное использование значения переменных request и data, в следствии чего в assert сравниваю строки.

В чем причина ошибки прохождения теста и ее последующего отсутсвия? Каким образом можно более грамотно реализовать применеие переменных request и data?

Github

Вернуться на верх