Pour certaines de mes vues Django, j'ai créé un décorateur qui effectue une authentification d'accès HTTP de base. Cependant, lors de l'écriture des cas de test dans Django, il m'a fallu un certain temps pour comprendre comment m'authentifier auprès de la vue. Voici comment j'ai procédé. J'espère que quelqu'un trouvera cela utile.
Réponses
Trop de publicités?Dans votre Django TestCase, vous pouvez mettre à jour les valeurs par défaut du client pour contenir vos informations d'authentification de base HTTP.
import base64
from django.test import TestCase
class TestMyStuff(TestCase):
def setUp(self):
credentials = base64.b64encode('username:password')
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials
Pour python3, vous pouvez encoder en base64 votre chaîne username:password
base64.b64encode(b'username:password')
Cela renvoie des octets, vous devez donc le transférer dans une chaîne ASCII avec .decode('ascii')
:
Exemple complet :
import base64
from django.test import TestCase
class TestClass(TestCase):
def test_authorized(self):
headers = {
'HTTP_AUTHORIZATION': 'Basic ' +
base64.b64encode(b'username:password').decode("ascii")
}
response = self.client.get('/', **headers)
self.assertEqual(response.status_code, 200)
En supposant que j'ai un formulaire de connexion, j'utilise la technique suivante pour me connecter via le framework de test :
client = Client()
client.post('/login/', {'username': 'john.smith', 'password': 'secret'})
Je transporte ensuite le client
dans mes autres tests car il est déjà authentifié. Quelle est votre question à ce poste?
(python3) J'utilise ceci dans un test :
credentials_string = '%s:%s' % ('invalid', 'invalid')
credentials = base64.b64encode(credentials_string.encode())
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials.decode()
et ce qui suit dans une vue :
import base64
[...]
type, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
auth = base64.b64decode(auth.strip()).decode()