Django 1.11 compatibility fixes.
[django-ssify.git] / tests / tests / test_csrf.py
1 # -*- coding: utf-8 -*-
2 # This file is part of django-ssify, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See README.md for more information.
4 #
5 from __future__ import unicode_literals
6
7 import re
8 from django.conf import settings
9 from django.test import Client, TestCase
10
11 try:
12     from django.middleware.csrf import _compare_salted_tokens
13 except ImportError:
14     # Django < 1.10
15     _compare_salted_tokens = lambda t1, t2: t1 == t2
16
17
18 class CsrfTestCase(TestCase):
19     def setUp(self):
20         self.client = Client(enforce_csrf_checks=True)
21
22     def assertCsrfTokenOk(self, response):
23         token = response.cookies[settings.CSRF_COOKIE_NAME].value
24         self.assertTrue(token)
25         match = re.match(
26             r"<!--#set var='vd07f6920655622adc90dd591c545bb2a' value='([A-Za-z0-9]*)'-->\n\n"
27             r"<input type='hidden' name='csrfmiddlewaretoken' value='"
28             r"<!--#echo var='vd07f6920655622adc90dd591c545bb2a' "
29             r"encoding='none'-->' />",
30             response.content.strip().decode('ascii'),
31             re.MULTILINE
32         )
33         self.assertTrue(_compare_salted_tokens(match.group(1), token))
34         return token
35
36     def test_csrf_token(self):
37         response = self.client.get('/csrf')
38         token = self.assertCsrfTokenOk(response)
39
40         # Make a bad request to see that CSRF protection works.
41         response = self.client.post('/csrf_check', {
42             'test': 'some data',
43             })
44         self.assertEqual(response.status_code, 403)
45
46         # Make a good request.
47         response = self.client.post('/csrf_check', {
48             'test': 'some data',
49             'csrfmiddlewaretoken': token,
50             })
51         self.assertEqual(response.status_code, 200)
52         self.assertEqual(response.content, b'some data')
53
54     def test_new_csrf_token_in_cached_response(self):
55         Client().get('/csrf')
56         response = Client().get('/csrf')
57         token = self.assertCsrfTokenOk(response)