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

1from django.test import TestCase 

2 

3 

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 

13 

14from django.contrib.auth.models import User 

15 

16from django.core.exceptions import ObjectDoesNotExist 

17 

18try: 

19 from django.urls import reverse 

20except Exception: # pragma: no cover 

21 from django.urls import reverse # pragma: no cover 

22 

23from sm.utils import random_string 

24 

25import datetime 

26 

27 

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 ] 

44 

45 def login(self): 

46 """ 

47 Login as user 

48 """ 

49 self.client.login(username=self.user.username, password=self.password) 

50 

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 ) 

68 

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 ) 

80 

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?") 

84 

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) 

95 

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!?") 

104 

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) 

124 

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"]) 

140 

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") 

154 

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 ) 

170 

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 ) 

187 

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"]) 

220 

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"]) 

227 

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"]) 

267 

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"]) 

274 

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"])