import random import string import time from unittest.mock import patch from datetime import datetime, timedelta from django.contrib.auth.models import AnonymousUser, User from django.contrib.sessions.backends.db import SessionStore from django.db.models import Q from django.http import HttpRequest, HttpResponse from django.test.client import RequestFactory from django.test.testcases import TestCase from redis.client import Redis from django.urls import reverse import redis from defender.data import get_approx_account_lockouts_from_login_attempts from . import utils from . import config from .signals import ( ip_block as ip_block_signal, ip_unblock as ip_unblock_signal, username_block as username_block_signal, username_unblock as username_unblock_signal, ) from .connection import parse_redis_url, get_redis_connection from .decorators import watch_login from .models import AccessAttempt from .test import DefenderTestCase, DefenderTransactionTestCase LOGIN_FORM_KEY = '