Coverage for server / test_views.py: 97%
157 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-24 12:43 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-24 12:43 +0000
1from django.test import TestCase
4from .models import Model
5from cluster.models import Model as ClusterModel
6from patchtime.models import Model as PatchtimeModel
7from location.models import Model as LocationModel
8from servermodel.models import Model as ServermodelModel
9from domain.models import Model as DomainModel
10from status.models import Model as StatusModel
11from .forms import FormDisabled
12from . import app_label
14from django.contrib.auth.models import User
16from django.core.exceptions import ObjectDoesNotExist
18try:
19 from django.urls import reverse
20except Exception: # pragma: no cover
21 from django.urls import reverse # pragma: no cover
23from sm.utils import random_string
25import datetime
28class Tester(TestCase):
29 teststring = random_string()
30 testitem = None
31 password = random_string()
32 fixtures = [
33 "sm/fixtures/02_groups.yaml",
34 "%s/fixtures/01_initial.yaml" % "vendor",
35 "%s/fixtures/01_initial.yaml" % "domain",
36 "%s/fixtures/01_initial.yaml" % "location",
37 "%s/fixtures/01_initial.yaml" % "status",
38 "%s/fixtures/01_initial.yaml" % "operatingsystem",
39 "%s/fixtures/01_initial.yaml" % "clustersoftware",
40 "%s/fixtures/01_initial.yaml" % "patchtime",
41 "%s/fixtures/01_initial.yaml" % "cluster",
42 "%s/fixtures/01_initial.yaml" % "servermodel",
43 ]
45 def login(self):
46 """
47 Login as user
48 """
49 self.client.login(username=self.user.username, password=self.password)
51 def setUp(self):
52 """
53 Create user
54 Create some item in models for testing
55 """
56 self.user = User.objects.create_superuser(
57 username=random_string(),
58 password=self.password,
59 )
60 self.cluster = ClusterModel.objects.all().order_by("name").first()
61 self.patchtime = PatchtimeModel.objects.all().order_by("name").first()
62 self.location = LocationModel.objects.all().order_by("name").first()
63 self.servermodel = ServermodelModel.objects.all().order_by("name").first()
64 self.domain = DomainModel.objects.all().order_by("name").first()
65 self.status = (
66 StatusModel.objects.exclude(name="Disposed").order_by("name").first()
67 )
69 self.testitem, created = Model.objects.get_or_create(
70 hostname=self.teststring,
71 cluster=self.cluster,
72 patchtime=self.patchtime,
73 location=self.location,
74 servermodel=self.servermodel,
75 domain=self.domain,
76 status=self.status,
77 install_date=datetime.date.today(),
78 delivery_date=datetime.date.today(),
79 )
81 def test_login_redir(self):
82 response = self.client.get(reverse("%s:index" % app_label))
83 self.assertEqual(response.status_code, 302, "no redirect?")
85 def test_listview(self):
86 Model.objects.all().delete()
87 self.setUp()
88 self.login()
89 response = self.client.get(reverse("%s:index" % app_label))
90 self.assertEqual(response.status_code, 200, "no status 200?")
91 item = response.context[-1]["object_list"].first()
92 self.assertIsInstance(item, Model, "object not the correct model!?")
93 self.assertEqual(item.hostname, self.teststring)
94 self.assertEqual(item.cluster.pk, self.cluster.pk)
96 def test_detailview(self):
97 self.login()
98 url = reverse("%s:detail" % app_label, args=[self.testitem.pk])
99 self.assertEqual("/%s/detail/%i/" % (app_label, self.testitem.pk), url)
100 response = self.client.get(url)
101 self.assertEqual(response.status_code, 200, "no status 200?")
102 item = response.context[-1]["object"]
103 self.assertIsInstance(item, Model, "object not the correct model!?")
105 def test_updateview(self):
106 self.login()
107 url = reverse("%s:update" % app_label, args=[self.testitem.pk])
108 self.assertEqual("/%s/update/%i/" % (app_label, self.testitem.pk), url)
109 response = self.client.post(
110 url,
111 {
112 "hostname": self.testitem.hostname,
113 "cluster": self.testitem.cluster.pk,
114 "status": self.testitem.status.pk,
115 "location": self.testitem.location.pk,
116 "servermodel": self.testitem.servermodel.pk,
117 "patchtime": self.testitem.patchtime.pk,
118 "domain": self.testitem.domain.pk,
119 "install_date": datetime.date.today(),
120 "delivery_date": datetime.date.today(),
121 },
122 )
123 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302)
125 url = reverse("%s:detail" % app_label, args=[self.testitem.pk])
126 response = self.client.get(url)
127 item = response.context[-1]["object"]
128 self.assertIsInstance(item, Model, "object not the correct model!?")
129 self.assertEqual(item.hostname, self.teststring)
130 self.assertEqual(item.cluster.name, self.cluster.name)
131 form = response.context[-1]["form"]
132 self.assertIsInstance(form, FormDisabled)
133 for field in [
134 "hostname",
135 "domain",
136 "delivery_date",
137 "install_date",
138 ]:
139 self.assertTrue(form.fields[field].widget.attrs["disabled"])
141 def test_deleteview(self):
142 self.login()
143 url = reverse("%s:delete" % app_label, args=[self.testitem.pk])
144 self.assertEqual("/%s/delete/%i/" % (app_label, self.testitem.pk), url)
145 response = self.client.get(url)
146 self.assertEqual(response.status_code, 200, "no status 200?")
147 item = response.context[-1]["object"]
148 self.assertIsInstance(item, Model, "oobject not the correct model!?")
149 self.assertEqual(item.hostname, self.teststring)
150 if "Are you sure you want to" not in response.content.decode("utf-8"):
151 print("Message not found")
152 self.assertContains(response, "Are you sure you want to delete")
153 self.assertContains(response, "Confirm Delete")
155 def test_deleteview_post(self):
156 self.login()
157 response = self.client.post(
158 reverse("%s:delete" % app_label, args=[self.testitem.pk]), follow=True
159 )
160 self.assertEqual(response.status_code, 200, "no status 200?")
161 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302)
162 pass
163 self.assertContains(
164 response, "%s was deleted successfully" % self.testitem.hostname
165 )
166 with self.assertRaises(ObjectDoesNotExist):
167 Model.objects.get(
168 hostname=self.testitem.hostname,
169 )
171 def test_createview(self):
172 self.login()
173 url = reverse("%s:create" % app_label)
174 response = self.client.get(url)
175 self.assertEqual(response.status_code, 200, "no status 200?")
176 self.assertRaises(KeyError, response.context[-1].__getitem__, "object")
177 self.assertIn("form", response.context[-1])
178 form = response.context[-1]["form"]
179 self.assertEqual(
180 form.fields["status"].initial,
181 StatusModel.objects.get(name="In use").id,
182 'Status should be "In use" by default!',
183 )
184 self.assertRaises(
185 KeyError, form.fields["hostname"].widget.attrs.__getitem__, "disabled"
186 )
188 def test_createview_post(self):
189 # Make sure we have no objects in there
190 Model.objects.all().delete()
191 self.login()
192 data = {
193 "hostname": self.testitem.hostname,
194 "cluster": self.testitem.cluster.pk,
195 "status": self.testitem.status.pk,
196 "location": self.testitem.location.pk,
197 "servermodel": self.testitem.servermodel.pk,
198 "patchtime": self.testitem.patchtime.pk,
199 "domain": self.testitem.domain.pk,
200 "install_date": datetime.date.today(),
201 "delivery_date": datetime.date.today(),
202 }
203 response = self.client.post(
204 reverse("%s:create" % app_label),
205 data,
206 follow=True,
207 )
208 self.assertEqual(response.status_code, 200, "no status 200?")
209 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302)
210 item = response.context[-1]["object_list"].first()
211 self.assertEqual(item.hostname, data["hostname"])
212 self.assertEqual(item.cluster.pk, data["cluster"])
213 self.assertEqual(item.status.pk, data["status"])
214 self.assertEqual(item.location.pk, data["location"])
215 self.assertEqual(item.servermodel.pk, data["servermodel"])
216 self.assertEqual(item.patchtime.pk, data["patchtime"])
217 self.assertEqual(item.domain.pk, data["domain"])
218 self.assertEqual(item.install_date, data["install_date"])
219 self.assertEqual(item.delivery_date, data["delivery_date"])
221 self.assertIsInstance(item, Model)
222 if "%s was created successfully" % data[
223 "hostname"
224 ] not in response.content.decode("utf-8"):
225 print("Message not found")
226 self.assertContains(response, "%s was created successfully" % data["hostname"])
228 def test_createview_post_disposed_cookie_on(self):
229 """
230 Test if we can view disposed servers with cookie
231 srvmanager-show_disposed true
232 """
233 # Make sure we have no objects in there
234 Model.objects.all().delete()
235 # Set cookie!
236 self.client.cookies["srvmanager-show_disposed"] = "true"
237 self.login()
238 # Create a _disposed_ server
239 data = {
240 "hostname": self.testitem.hostname,
241 "cluster": self.testitem.cluster.pk,
242 "status": StatusModel.objects.get(name="Disposed").id,
243 "location": self.testitem.location.pk,
244 "servermodel": self.testitem.servermodel.pk,
245 "patchtime": self.testitem.patchtime.pk,
246 "domain": self.testitem.domain.pk,
247 "install_date": datetime.date.today(),
248 "delivery_date": datetime.date.today(),
249 }
250 response = self.client.post(
251 reverse("%s:create" % app_label),
252 data,
253 follow=True,
254 )
255 self.assertEqual(response.status_code, 200, "no status 200?")
256 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302)
257 item = response.context[-1]["object_list"].first()
258 self.assertEqual(item.hostname, data["hostname"])
259 self.assertEqual(item.cluster.pk, data["cluster"])
260 self.assertEqual(item.status.pk, data["status"])
261 self.assertEqual(item.location.pk, data["location"])
262 self.assertEqual(item.servermodel.pk, data["servermodel"])
263 self.assertEqual(item.patchtime.pk, data["patchtime"])
264 self.assertEqual(item.domain.pk, data["domain"])
265 self.assertEqual(item.install_date, data["install_date"])
266 self.assertEqual(item.delivery_date, data["delivery_date"])
268 self.assertIsInstance(item, Model)
269 if "%s was created successfully" % data[
270 "hostname"
271 ] not in response.content.decode("utf-8"):
272 print("Message not found")
273 self.assertContains(response, "%s was created successfully" % data["hostname"])
275 def test_createview_post_disposed_cookie_off(self):
276 """
277 Test if we can CANNOT view disposed servers with cookie
278 srvmanager-show_disposed false
279 """
280 # Make sure we have no objects in there
281 Model.objects.all().delete()
282 # Set cookie!
283 self.client.cookies["srvmanager-show_disposed"] = "false"
284 self.login()
285 # Create a _disposed_ server
286 data = {
287 "hostname": self.testitem.hostname,
288 "cluster": self.testitem.cluster.pk,
289 "status": StatusModel.objects.get(name="Disposed").id,
290 "location": self.testitem.location.pk,
291 "servermodel": self.testitem.servermodel.pk,
292 "patchtime": self.testitem.patchtime.pk,
293 "domain": self.testitem.domain.pk,
294 "install_date": datetime.date.today(),
295 "delivery_date": datetime.date.today(),
296 }
297 response = self.client.post(
298 reverse("%s:create" % app_label),
299 data,
300 follow=True,
301 )
302 self.assertEqual(response.status_code, 200, "no status 200?")
303 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302)
304 item = response.context[-1]["object_list"].first()
305 # We shouldn't see anything, since cookie is set to off
306 self.assertIsNone(item)
307 # But creation must have succeeded
308 if "%s was created successfully" % data[
309 "hostname"
310 ] not in response.content.decode("utf-8"):
311 print("Message not found")
312 self.assertContains(response, "%s was created successfully" % data["hostname"])