Completed
Push — master ( a65260...307dd7 )
by Paolo
07:35
created

uid.tests.test_views   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 224
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 21
eloc 124
dl 0
loc 224
rs 10
c 0
b 0
f 0

21 Methods

Rating   Name   Duplication   Size   Complexity  
A Initialize.setUp() 0 3 1
A AboutUploadingViewTest.setUp() 0 7 1
A IndexViewTest.test_url_resolves_view() 0 3 1
A ProtectedViewTest.setUp() 0 13 1
A AboutViewTest.test_url_resolves_view() 0 3 1
A DashBoardViewTest.setUp() 0 9 1
A SummaryViewTest.setUp() 0 9 1
A TermsViewTest.setUp() 0 7 1
A AboutUploadingViewTest.test_url_resolves_view() 0 3 1
A DashBoardViewTest.test_contains_navigation_links() 0 6 1
A ProtectedViewTest.test_response() 0 8 1
A AboutViewTest.setUp() 0 7 1
A TermsViewTest.test_url_resolves_view() 0 3 1
A SummaryViewTest.test_url_resolves_view() 0 3 1
A PrivacyViewTest.test_url_resolves_view() 0 3 1
A UpdateOrganizationViewTest.setUp() 0 6 1
A PrivacyViewTest.setUp() 0 7 1
A UpdateOrganizationViewTest.test_url_resolves_view() 0 3 1
A UpdateOrganizationViewTest.test_form_inputs() 0 12 1
A IndexViewTest.setUp() 0 7 1
A DashBoardViewTest.test_url_resolves_view() 0 3 1
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Wed Apr  4 16:11:23 2018
5
6
@author: Paolo Cozzi <[email protected]>
7
"""
8
9
from django.test import Client, TestCase
10
from django.urls import resolve, reverse
11
12
from common.tests import (
13
    GeneralMixinTestCase, StatusMixinTestCase, FormMixinTestCase,
14
    OwnerMixinTestCase, LoginMixinTestCase)
15
16
from . import DataSourceMixinTestCase, PersonMixinTestCase
17
from ..forms import OrganizationForm
18
from ..models import Submission
19
from ..views import (
20
    DashBoardView, SummaryView, AboutView, IndexView, PrivacyView, TermsView,
21
    AboutUploadingView, UpdateOrganizationView)
22
23
24
class Initialize(TestCase):
25
    """Does the common stuff when testing cases are run"""
26
27
    fixtures = [
28
        "uid/user"
29
    ]
30
31
    def setUp(self):
32
        self.client = Client()
33
        self.client.login(username='test', password='test')
34
35
36
class IndexViewTest(StatusMixinTestCase, Initialize):
37
    def setUp(self):
38
        # create a test user
39
        super().setUp()
40
41
        # test page
42
        self.url = reverse('index')
43
        self.response = self.client.get(self.url)
44
45
    def test_url_resolves_view(self):
46
        view = resolve('/')
47
        self.assertIsInstance(view.func.view_class(), IndexView)
48
49
50
class DashBoardViewTest(GeneralMixinTestCase, Initialize):
51
    def setUp(self):
52
        # create a test user
53
        super().setUp()
54
55
        # get the url for dashboard
56
        self.url = reverse('uid:dashboard')
57
58
        # get a response
59
        self.response = self.client.get(self.url)
60
61
    def test_url_resolves_view(self):
62
        view = resolve('/uid/dashboard/')
63
        self.assertIsInstance(view.func.view_class(), DashBoardView)
64
65
    def test_contains_navigation_links(self):
66
        create_url = reverse('submissions:create')
67
        summary_url = reverse('uid:summary')
68
69
        self.assertContains(self.response, 'href="{0}"'.format(create_url))
70
        self.assertContains(self.response, 'href="{0}"'.format(summary_url))
71
72
        # TODO: test resume submission link
73
74
    # TODO: test submission button inactive
75
76
77
class AboutViewTest(StatusMixinTestCase, Initialize):
78
    def setUp(self):
79
        # create a test user
80
        super().setUp()
81
82
        # get the url and a respose
83
        self.url = reverse('about')
84
        self.response = self.client.get(self.url)
85
86
    def test_url_resolves_view(self):
87
        view = resolve('/about/')
88
        self.assertIsInstance(view.func.view_class(), AboutView)
89
90
91
class PrivacyViewTest(StatusMixinTestCase, Initialize):
92
    def setUp(self):
93
        # create a test user
94
        super().setUp()
95
96
        # get the url and a respose
97
        self.url = reverse('privacy-policy')
98
        self.response = self.client.get(self.url)
99
100
    def test_url_resolves_view(self):
101
        view = resolve('/privacy/')
102
        self.assertIsInstance(view.func.view_class(), PrivacyView)
103
104
105
class TermsViewTest(StatusMixinTestCase, Initialize):
106
    def setUp(self):
107
        # create a test user
108
        super().setUp()
109
110
        # get the url and a respose
111
        self.url = reverse('terms-and-conditions')
112
        self.response = self.client.get(self.url)
113
114
    def test_url_resolves_view(self):
115
        view = resolve('/terms/')
116
        self.assertIsInstance(view.func.view_class(), TermsView)
117
118
119
class AboutUploadingViewTest(StatusMixinTestCase, Initialize):
120
    def setUp(self):
121
        # create a test user
122
        super().setUp()
123
124
        # get the url and a respose
125
        self.url = reverse('about-uploading')
126
        self.response = self.client.get(self.url)
127
128
    def test_url_resolves_view(self):
129
        view = resolve('/about_uploading/')
130
        self.assertIsInstance(view.func.view_class(), AboutUploadingView)
131
132
133
class SummaryViewTest(GeneralMixinTestCase, Initialize):
134
    def setUp(self):
135
        # create a test user
136
        super().setUp()
137
138
        # get the url for dashboard
139
        self.url = reverse('uid:summary')
140
141
        # get a response
142
        self.response = self.client.get(self.url)
143
144
    def test_url_resolves_view(self):
145
        view = resolve('/uid/summary/')
146
        self.assertIsInstance(view.func.view_class(), SummaryView)
147
148
    # TODO: test summary after data load
149
150
151
class ProtectedViewTest(DataSourceMixinTestCase, OwnerMixinTestCase,
152
                        LoginMixinTestCase, TestCase):
153
    """A class to test protected view"""
154
155
    fixtures = [
156
        "uid/user",
157
        "uid/dictcountry",
158
        "uid/dictrole",
159
        "uid/organization",
160
        "uid/submission"
161
    ]
162
163
    def setUp(self):
164
        super().setUp()
165
166
        self.client = Client()
167
        self.client.login(username='test', password='test')
168
169
        self.submission_id = 1
170
        self.submission = Submission.objects.get(pk=self.submission_id)
171
172
        self.file_name = self.submission.get_uploaded_file_basename()
173
174
        # define url
175
        self.url = "/protected/%s" % (self.submission.uploaded_file)
176
177
    def test_response(self):
178
        # get a response
179
        response = self.client.get(self.url)
180
181
        self.assertEqual(
182
            response.get('Content-Disposition'),
183
            'attachment; filename="{}"'.format(
184
                self.file_name)
185
        )
186
187
188
class UpdateOrganizationViewTest(
189
        FormMixinTestCase, PersonMixinTestCase, Initialize):
190
    """A class to test UpdateOrganizationView"""
191
192
    form_class = OrganizationForm
193
194
    fixtures = [
195
        "uid/user",
196
        "uid/dictcountry",
197
        "uid/dictrole",
198
        "uid/organization",
199
    ]
200
201
    def setUp(self):
202
        """call base method"""
203
        super().setUp()
204
205
        self.url = reverse("uid:organization_update")
206
        self.response = self.client.get(self.url)
207
208
    def test_url_resolves_view(self):
209
        view = resolve('/uid/organization/update/')
210
        self.assertIsInstance(view.func.view_class(), UpdateOrganizationView)
211
212
    def test_form_inputs(self):
213
214
        # total input is n of form fields + (CSRF) + 1 select
215
        self.assertContains(self.response, '<input', 4)
216
        self.assertContains(self.response, 'type="text"', 2)
217
        self.assertContains(self.response, '<select', 2)
218
        self.assertContains(self.response, "required disabled", 1)
219
220
        # this is specific to my data
221
        self.assertContains(
222
            self.response,
223
            'name="name" value="Test organization"')
224
225
# HINT: I don't have to test succesful or invalid update cases, since
226
# OrganizationForm inherit from well tested modules and has no custom methods
227
# (apart get_object, which is implicitely tested)
228