forked from pythonprobr/pythonpro-website
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_middleware.py
More file actions
82 lines (65 loc) · 2.95 KB
/
test_middleware.py
File metadata and controls
82 lines (65 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from unittest.mock import Mock
import pytest
from django.core.exceptions import MiddlewareNotUsed
from django.http import HttpResponseRedirect
from pythonpro.core.middleware import SSLMiddleware
@pytest.fixture
def ssl_middleware_class():
""" Keeping original class attribute value to isolate tests """
original_value = SSLMiddleware.debug_flag
yield SSLMiddleware
SSLMiddleware.debug_flag = original_value
@pytest.mark.parametrize('debug', [True, False])
def test_ssl_middleware_removed_for_debug_true(debug, mocker, ssl_middleware_class):
setttings_mock = mocker.patch('pythonpro.core.middleware.settings')
setttings_mock.DEBUG = True
ssl_middleware_class.debug_flag = debug
with pytest.raises(MiddlewareNotUsed):
ssl_middleware_class(None)
assert ssl_middleware_class.debug_flag
@pytest.mark.parametrize('debug', [True, False])
def test_ssl_middleware_removed_for_debug_flag(debug, mocker, ssl_middleware_class):
setttings_mock = mocker.patch('pythonpro.core.middleware.settings')
setttings_mock.DEBUG = debug
ssl_middleware_class.debug_flag = True
with pytest.raises(MiddlewareNotUsed):
ssl_middleware_class(None)
def test_ssl_redirect_for_unsecure_request(mocker, ssl_middleware_class):
setttings_mock = mocker.patch('pythonpro.core.middleware.settings')
setttings_mock.DEBUG = False
ssl_middleware_class.debug_flag = False
request = Mock()
request.is_secure.return_value = False
request.META.get.return_value = 'http'
request.build_absolute_uri.return_value = 'http://python.pro.br'
mid = ssl_middleware_class(None)
response = mid(request)
assert isinstance(response, HttpResponseRedirect)
assert response.url == 'https://python.pro.br'
def test_ssl_no_redirect_for_secure_request(mocker, ssl_middleware_class):
setttings_mock = mocker.patch('pythonpro.core.middleware.settings')
setttings_mock.DEBUG = False
ssl_middleware_class.debug_flag = False
request = Mock()
request.is_secure.return_value = True
request.META.get.return_value = 'http'
expected_response = Mock()
get_response = Mock(return_value=expected_response)
mid = ssl_middleware_class(get_response)
response = mid(request)
assert expected_response is response
get_response.assert_called_once_with(request)
def test_ssl_no_redirect_for_https_heroku_header(mocker, ssl_middleware_class):
setttings_mock = mocker.patch('pythonpro.core.middleware.settings')
setttings_mock.DEBUG = False
ssl_middleware_class.debug_flag = False
request = Mock()
request.is_secure.return_value = False
request.META.get.return_value = 'https'
expected_response = Mock()
get_response = Mock(return_value=expected_response)
mid = ssl_middleware_class(get_response)
response = mid(request)
assert expected_response is response
get_response.assert_called_once_with(request)
request.META.get.assert_called_once_with('HTTP_X_FORWARDED_PROTO', '')