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?