Skip to content

Commit 6655865

Browse files
committed
resolve CR comments add unittests
1 parent 6e3360e commit 6655865

3 files changed

Lines changed: 87 additions & 3 deletions

File tree

admin_tests/maintenance/test_views.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.core.exceptions import PermissionDenied
99

1010
import website.maintenance as maintenance
11-
from osf.models import MaintenanceState
11+
from osf.models import MaintenanceState, MaintenanceMode
1212
from osf_tests.factories import AuthUserFactory
1313

1414
from admin_tests.utilities import setup_view
@@ -105,3 +105,59 @@ def test_correct_view_permissions(self, req, user, plain_view):
105105

106106
res = plain_view.as_view()(req)
107107
assert res.status_code == 200
108+
109+
110+
@pytest.mark.urls('admin.base.urls')
111+
class TestMaintenanceMode:
112+
113+
@pytest.fixture()
114+
def user(self):
115+
user = AuthUserFactory()
116+
view_permission = Permission.objects.get(codename='change_maintenancestate')
117+
user.user_permissions.add(view_permission)
118+
user.save()
119+
return user
120+
121+
@pytest.fixture()
122+
def plain_view(self):
123+
return views.MaintenanceDisplay
124+
125+
@pytest.fixture()
126+
def view(self, user, plain_view):
127+
req = RequestFactory().get('/fake_path')
128+
req.user = user
129+
view = plain_view()
130+
setup_view(view, req)
131+
return view
132+
133+
def test_get_context_data_includes_maintenance_mode(self, view):
134+
MaintenanceMode(maintenance_mode=True).save()
135+
context = view.get_context_data()
136+
assert context['maintenance_mode'] is True
137+
MaintenanceMode(maintenance_mode=False).save()
138+
context = view.get_context_data()
139+
assert context['maintenance_mode'] is False
140+
141+
def test_post_toggles_maintenance_mode_on(self, user, plain_view):
142+
MaintenanceMode(maintenance_mode=False).save()
143+
req = RequestFactory().post('/fake_path', data={'maintenance_mode': 'False'})
144+
req.user = user
145+
view = plain_view()
146+
setup_view(view, req)
147+
response = view.post(req)
148+
# It should redirect back to the display page
149+
assert response.status_code == 302
150+
# The database state should now be True
151+
assert MaintenanceMode.is_under_maintenance() is True
152+
153+
def test_post_toggles_maintenance_mode_off(self, user, plain_view):
154+
MaintenanceMode(maintenance_mode=True).save()
155+
req = RequestFactory().post('/fake_path', data={'maintenance_mode': 'True'})
156+
req.user = user
157+
view = plain_view()
158+
setup_view(view, req)
159+
response = view.post(req)
160+
# It should redirect back to the display page
161+
assert response.status_code == 302
162+
# The database state should now be False
163+
assert MaintenanceMode.is_under_maintenance() is False

api/base/middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,14 @@ def __init__(self, get_response):
141141
self.get_response = get_response
142142

143143
def __call__(self, request):
144-
if request.path.endswith(('/v2', '/v2/')):
144+
if request.path.endswith('/v2'):
145145
return self.get_response(request)
146146
if MaintenanceMode.is_under_maintenance():
147147
return JsonResponse(
148148
{
149149
'meta': {
150150
'maintenance_mode': True,
151-
'status_page': 'status',
151+
'status_page': 'https://status.cos.io',
152152
},
153153
}, status=503,
154154
)

osf_tests/test_middleware.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import json
2+
import pytest
3+
from unittest import mock
4+
5+
class TestMaintenanceModeMiddlewareIntegration:
6+
7+
MAINTENANCE_MOCK_PATH = 'api.base.middleware.MaintenanceMode.is_under_maintenance'
8+
9+
@mock.patch(MAINTENANCE_MOCK_PATH, return_value=True)
10+
def test_bypasses_v2_root_if_maintenance_mode_on(self, mock_maintenance, client):
11+
response = client.get('/v2')
12+
assert response.status_code != 503
13+
mock_maintenance.assert_not_called()
14+
15+
@pytest.mark.parametrize('method', ['post', 'patch', 'put', 'delete'])
16+
@mock.patch(MAINTENANCE_MOCK_PATH, return_value=True)
17+
def test_middleware_blocks_different_requests_if_maintenance_mode_on(self, mock_maintenance, client, method):
18+
client_method = getattr(client, method)
19+
response = client_method('/v2/nodes/', data={}, content_type='application/json')
20+
assert response.status_code == 503
21+
data = json.loads(response.content)
22+
assert data['meta']['maintenance_mode'] is True
23+
assert data['meta']['status_page'] == 'https://status.cos.io'
24+
25+
@mock.patch(MAINTENANCE_MOCK_PATH, return_value=False)
26+
def test_passes_through_when_maintenance_mode_off(self, mock_maintenance, client):
27+
response = client.get('/v2/nodes/')
28+
assert response.status_code != 503

0 commit comments

Comments
 (0)