Passed
Pull Request — master (#55)
by Paolo
05:45
created

InvalidCreateUserViewTests.setUp()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Tue Jul 10 14:55:11 2018
5
6
@author: Paolo Cozzi <[email protected]>
7
"""
8
9
from unittest.mock import patch
10
11
from django.contrib.auth import get_user_model
12
from django.contrib.messages import get_messages
13
from django.test import Client, TestCase
14
from django.urls import resolve, reverse
15
16
from image_app.models import Organization
17
from pyUSIrest.auth import Auth
18
19
from ..forms import CreateUserForm
20
from ..views import CreateUserView
21
from .test_token import generate_token
22
23
24
class Basetest(TestCase):
25
    def setUp(self):
26
        User = get_user_model()
27
28
        # create a testuser
29
        User.objects.create_user(
30
            username='test',
31
            password='test',
32
            email="[email protected]")
33
34
        self.client = Client()
35
        self.client.login(username='test', password='test')
36
37
        # get the url for dashboard
38
        self.url = reverse('biosample:create')
39
        self.response = self.client.get(self.url)
40
41 View Code Duplication
    def check_messages(self, response, tag, message_text):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
42
        """Check that a response has warnings"""
43
44
        # each element is an instance
45
        # of django.contrib.messages.storage.base.Message
46
        all_messages = [msg for msg in get_messages(response.wsgi_request)]
47
48
        found = False
49
50
        # I can have moltiple message, and maybe I need to find a specific one
51
        for message in all_messages:
52
            if tag in message.tags and message_text in message.message:
53
                found = True
54
55
        self.assertTrue(found)
56
57
58
class CreateUserViewTest(Basetest):
59
    def test_redirection(self):
60
        '''Non Authenticated user are directed to login page'''
61
62
        login_url = reverse("login")
63
        client = Client()
64
        response = client.get(self.url)
65
66
        self.assertRedirects(
67
            response, '{login_url}?next={url}'.format(
68
                login_url=login_url, url=self.url)
69
        )
70
71
    def test_status_code(self):
72
        self.assertEqual(self.response.status_code, 200)
73
74
    def test_url_resolves_view(self):
75
        view = resolve('/biosample/create/')
76
        self.assertIsInstance(view.func.view_class(), CreateUserView)
77
78
    def test_csrf(self):
79
        self.assertContains(self.response, 'csrfmiddlewaretoken')
80
81
    def test_contains_form(self):
82
        form = self.response.context.get('form')
83
84
        self.assertIsInstance(form, CreateUserForm)
85
86
    def test_form_inputs(self):
87
        '''
88
        The view must contain eleven inputs: csrf, username, first_name,
89
        last_name, email, password1, password2, affiliation, role,
90
        organization and agree_gdpr checkbox
91
        '''
92
93
        # total input is n of form fields + (CSRF)
94
        self.assertContains(self.response, '<input', 3)
95
        self.assertContains(self.response, 'type="password"', 2)
96
97
98
class SuccessfulCreateUserViewTest(Basetest):
99
    fixtures = [
100
        "image_app/dictcountry.json",
101
        "image_app/dictrole.json",
102
        "image_app/organization.json"
103
    ]
104
105
    def setUp(self):
106
        User = get_user_model()
107
108
        # create a testuser
109
        user = User.objects.create_user(
110
            username='test',
111
            password='test',
112
            email="[email protected]")
113
114
        # add organization (affiliation) to user
115
        affiliation = Organization.objects.first()
116
        user.person.affiliation = affiliation
117
118
        # add other infor to user
119
        user.first_name = "Foo"
120
        user.last_name = "Bar"
121
122
        # saving updated object
123
        user.save()
124
125
        # this is django.test.Client
126
        self.client = Client()
127
        self.client.login(username='test', password='test')
128
129
        # get the url for dashboard
130
        self.url = reverse('biosample:create')
131
        self.response = self.client.get(self.url)
132
133
    def mocked_auth(**kwargs):
134
        token = generate_token(
135
                    domains=['subs.test-team-1', 'subs.test-team-3'])
136
        return Auth(token=token)
137
138
    @patch('pyUSIrest.client.User.add_user_to_team')
139
    @patch('pyUSIrest.client.User.get_domain_by_name')
140
    @patch('pyUSIrest.client.User.create_team')
141
    @patch('biosample.views.get_manager_auth', new=mocked_auth)
142
    @patch('biosample.views.get_auth', new=mocked_auth)
143
    @patch('pyUSIrest.client.User.create_user',
144
           return_value="usr-2a28ca65-2c2f-41e7-9aa5-e829830c6c71")
145
    def test_user_create(
146
            self, create_user, create_team, get_domain_by_name,
147
            add_user_to_team):
148
        """Testing create user"""
149
150
        # setting mock objects
151
        create_team.return_value.name = "subs.test-team-3"
152
        get_domain_by_name.return_value.domainReference = (
153
                "dom-41fd3271-d14b-47ff-8de1-e3f0a6d0a693")
154
155
        self.data = {
156
            'password1': 'image-password',
157
            'password2': 'image-password',
158
        }
159
160
        # posting user and password to generate a new user
161
        response = self.client.post(self.url, self.data)
162
        dashboard_url = reverse('image_app:dashboard')
163
164
        self.assertRedirects(response, dashboard_url)
165
        self.check_messages(response, "success", "Account created")
166
167
        self.assertTrue(create_user.called)
168
        self.assertTrue(create_team.called)
169
        self.assertTrue(get_domain_by_name.called)
170
        self.assertTrue(add_user_to_team.called)
171
172
    @patch('pyUSIrest.client.User.add_user_to_team')
173
    @patch('pyUSIrest.client.User.get_domain_by_name')
174
    @patch('pyUSIrest.client.User.create_team')
175
    @patch('biosample.helpers.Auth', new=mocked_auth)
176
    @patch('pyUSIrest.client.User.create_user',
177
           side_effect=ConnectionError("test"))
178
    def test_error_with_create_user(
179
            self, create_user, create_team, get_domain_by_name,
180
            add_user_to_team):
181
        """Testing create user with biosample errors"""
182
183
        self.data = {
184
            'password1': 'image-password',
185
            'password2': 'image-password',
186
        }
187
188
        response = self.client.post(self.url, self.data)
189
        self.assertEqual(response.status_code, 200)
190
        self.check_messages(response, "error", "Problem in creating user")
191
192
        self.assertTrue(create_user.called)
193
        self.assertFalse(create_team.called)
194
        self.assertFalse(get_domain_by_name.called)
195
        self.assertFalse(add_user_to_team.called)
196
197
    def mock_create_team_error(**kwargs):
198
        """Raise a custom exception when creating team"""
199
200
        msg = (
201
            '{"timestamp":1569592802046,"status":500,"error":"Internal Server '
202
            'Error","exception":"org.springframework.web.client.ResourceAccess'
203
            'Exception","message":"I/O error on POST request for \"https://'
204
            'explore.api.aai.ebi.ac.uk/domains/\": No content to map due '
205
            'to end-of-input\n at [Source: ; line: 1, column: 0]; nested '
206
            'exception is com.fasterxml.jackson.databind.JsonMappingException:'
207
            ' No content to map due to end-of-input\n at [Source: ; line: 1, '
208
            'column: 0]","path":"/api/user/teams"}')
209
210
        return ConnectionError(msg)
211
212 View Code Duplication
    @patch('pyUSIrest.client.User.add_user_to_team')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
213
    @patch('pyUSIrest.client.User.get_domain_by_name')
214
    @patch('pyUSIrest.client.User.create_team',
215
           side_effect=mock_create_team_error())
216
    @patch('biosample.views.get_manager_auth', new=mocked_auth)
217
    @patch('biosample.views.get_auth', new=mocked_auth)
218
    @patch('pyUSIrest.client.User.create_user',
219
           return_value="usr-2a28ca65-2c2f-41e7-9aa5-e829830c6c71")
220
    def test_error_with_create_team(
221
            self, create_user, create_team, get_domain_by_name,
222
            add_user_to_team):
223
        """Testing create user"""
224
225
        # setting mock objects
226
        get_domain_by_name.return_value.domainReference = (
227
                "dom-41fd3271-d14b-47ff-8de1-e3f0a6d0a693")
228
229
        self.data = {
230
            'password1': 'image-password',
231
            'password2': 'image-password',
232
        }
233
234
        response = self.client.post(self.url, self.data)
235
        self.assertEqual(response.status_code, 200)
236
        self.check_messages(response, "error", "Problem in creating team")
237
238
        self.assertTrue(create_user.called)
239
        self.assertTrue(create_team.called)
240
        self.assertFalse(get_domain_by_name.called)
241
        self.assertFalse(add_user_to_team.called)
242
243 View Code Duplication
    @patch('pyUSIrest.client.User.add_user_to_team',
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
244
           side_effect=ConnectionError("test"))
245
    @patch('pyUSIrest.client.User.get_domain_by_name')
246
    @patch('pyUSIrest.client.User.create_team')
247
    @patch('biosample.views.get_manager_auth', new=mocked_auth)
248
    @patch('biosample.views.get_auth', new=mocked_auth)
249
    @patch('pyUSIrest.client.User.create_user',
250
           return_value="usr-2a28ca65-2c2f-41e7-9aa5-e829830c6c71")
251
    def test_error_with_add_user_to_team(
252
            self, create_user, create_team, get_domain_by_name,
253
            add_user_to_team):
254
255
        """Testing a generic error during user creation step"""
256
257
        # setting mock objects
258
        create_team.return_value.name = "subs.test-team-3"
259
        get_domain_by_name.return_value.domainReference = (
260
                "dom-41fd3271-d14b-47ff-8de1-e3f0a6d0a693")
261
262
        self.data = {
263
            'password1': 'image-password',
264
            'password2': 'image-password',
265
        }
266
267
        # posting user and password to generate a new user
268
        response = self.client.post(self.url, self.data)
269
270
        self.assertEqual(response.status_code, 200)
271
        self.check_messages(
272
            response,
273
            "error",
274
            "Problem in adding user")
275
276
        self.assertTrue(create_user.called)
277
        self.assertTrue(create_team.called)
278
        self.assertTrue(get_domain_by_name.called)
279
        self.assertTrue(add_user_to_team.called)
280
281 View Code Duplication
    @patch('pyUSIrest.client.User.add_user_to_team')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
282
    @patch('pyUSIrest.client.User.get_domain_by_name')
283
    @patch('pyUSIrest.client.User.create_team')
284
    @patch('biosample.views.get_manager_auth',
285
           side_effect=ConnectionError("test"))
286
    @patch('biosample.views.get_auth', new=mocked_auth)
287
    @patch('pyUSIrest.client.User.create_user',
288
           return_value="usr-2a28ca65-2c2f-41e7-9aa5-e829830c6c71")
289
    def test_generic_error(
290
            self, create_user, manager_auth, create_team, get_domain_by_name,
291
            add_user_to_team):
292
293
        """Testing a generic error during user creation step"""
294
295
        # setting mock objects
296
        create_team.return_value.name = "subs.test-team-3"
297
        get_domain_by_name.return_value.domainReference = (
298
                "dom-41fd3271-d14b-47ff-8de1-e3f0a6d0a693")
299
300
        self.data = {
301
            'password1': 'image-password',
302
            'password2': 'image-password',
303
        }
304
305
        # posting user and password to generate a new user
306
        response = self.client.post(self.url, self.data)
307
        self.assertEqual(response.status_code, 200)
308
        self.check_messages(
309
            response,
310
            "error",
311
            "Problem with EBI-AAP endoints. Please contact IMAGE team")
312
313
        # the firts manager auth called is in create user
314
        self.assertTrue(create_user.called)
315
        self.assertFalse(create_team.called)
316
        self.assertFalse(get_domain_by_name.called)
317
        self.assertFalse(add_user_to_team.called)
318
319
320
class InvalidCreateUserViewTests(Basetest):
321
    def setUp(self):
322
        # create a test user
323
        super().setUp()
324
325
        # submit an empty dictionary
326
        self.response = self.client.post(self.url, {})
327
328
    def test_signup_status_code(self):
329
        '''
330
        An invalid form submission should return to the same page
331
        '''
332
        self.assertEqual(self.response.status_code, 200)
333
334
    def test_form_errors(self):
335
        form = self.response.context.get('form')
336
        self.assertGreater(len(form.errors), 0)
337