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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
import pytest
from django.contrib.auth.models import Permission
from django.test import RequestFactory
from ctrack.core.views import home_page
from ctrack.organisations.views import OrganisationListView
from ctrack.users.models import User
from ctrack.users.views import UserDetailView, UserRedirectView, UserUpdateView
pytestmark = pytest.mark.django_db
class TestUserUpdateView:
"""
TODO:
extracting view initialization code as class-scoped fixture
would be great if only pytest-django supported non-function-scoped
fixture db access -- this is a work-in-progress for now:
https://github.com/pytest-dev/pytest-django/pull/258
"""
def test_get_success_url(self, user: User, request_factory: RequestFactory):
view = UserUpdateView()
request = request_factory.get("/fake-url/")
request.user = user
view.request = request
assert view.get_success_url() == f"/users/{user.username}/"
def test_get_object(self, user: User, request_factory: RequestFactory):
view = UserUpdateView()
request = request_factory.get("/fake-url/")
request.user = user
view.request = request
assert view.get_object() == user
class TestUserRedirectView:
def test_get_redirect_url(self, user: User, request_factory: RequestFactory):
view = UserRedirectView()
request = request_factory.get("/fake-url")
request.user = user
view.request = request
assert view.get_redirect_url() == "/"
def test_profile_view_contains_organisation_information(
person, user, request_factory, stakeholder
):
"""
This tests the context_data - not the rendered page... We'll do that in the
next test.
"""
org_name = person.organisation.name
user.stakeholder = stakeholder
user.save()
request = request_factory.get(f"/users/{user.username}")
# we have to do the following to simulate logged-in user
# Django Advanced Testing Topics
request.user = user
# We pass 'username' rather than 'slug' here because we are setting 'slug_url_kwarg' in our CBV.
response = UserDetailView.as_view()(request, username=user.username)
assert response.status_code == 200
assert response.context_data["user"].username == user.username
assert response.context_data["user"].is_stakeholder is True
assert response.context_data["user"].stakeholder.person.first_name == "Toss"
# Two ways of getting the organisaton name
assert (
response.context_data["user"].stakeholder.person.get_organisation_name()
== org_name
)
assert response.context_data["user"].get_organisation_name() == org_name
assert response.context_data["user"].stakeholder.person.first_name == "Toss"
def test_home_page_h1_tag_with_client(client, django_user_model):
"""
Basic test of HTML from the home page.
"""
django_user_model.objects.create_user(username="toss", password="knob")
client.login(username="toss", password="knob")
response = client.get("/")
assert response.status_code == 200
assert response.content[:15] == b"<!DOCTYPE html>"
assert b"<title>ctrack - Department for Transport</title>" in response.content
assert b"<h1>Welcome to ctrack - Department for Transport</h1>" in response.content
assert b"</html>" in response.content
def test_regular_user_redirected_to_their_template_on_login(
django_user_model, request_factory: RequestFactory
):
"""
When a user logs in without a stakeholder mapping, they get sent to the regular user
template.
"""
user = django_user_model.objects.create_user(username="toss", password="knob")
request = request_factory.get("/")
request.user = user
response = home_page(request)
assert response.status_code == 200
assert b"<p>THIS IS A TEMPLATE FOR A REGULAR USER</p>" in response.content
def test_stakeholder_redirected_to_their_template_on_login(
django_user_model, request_factory: RequestFactory, stakeholder
):
"""
When a user logs in WITH a stakeholder mapping, they get sent to the stakehoder user
template.
"""
user = django_user_model.objects.create_user(username="toss", password="knob")
user.stakeholder = stakeholder
user.save()
request = request_factory.get("/")
request.user = user
response = home_page(request)
assert response.status_code == 200
assert b"THIS IS A TEMPLATE FOR A STAKEHOLDER USER" in response.content
def test_stakeholder_returns_is_stakeholder(
django_user_model, request_factory, stakeholder
):
user = django_user_model.objects.create_user(username="toss", password="knob")
user.stakeholder = stakeholder
user.save()
request = request_factory.get("/")
request.user = user
assert request.user.is_stakeholder is True
def test_stakeholder_user_is_not_staff(django_user_model, stakeholder):
user = django_user_model.objects.create_user(username="toss", password="knob")
user.stakeholder = stakeholder
user.save()
assert user.is_staff is False
def test_regular_user_gets_301_when_trying_to_access_view_with_perm_set(
django_user_model, client, stakeholder
):
"""
No permissions are set when a regular user is created. This test knows that a suitable
permission is set on the ctrack.organisations.view.OrganisationListView, and therefore we
would expect a redirect/403 persmission denied response when trying to reach it with a
regular user.
"""
user = django_user_model.objects.create_user(username="toss", password="knob")
user.stakeholder = stakeholder
user.save()
client.login(username="toss", password="knob")
response = client.get(path="https://localhost:8000/organisations")
assert (
response.status_code == 301
) # at this point, I don't know why it's a 301 not a 403
|