Coverage for servermodel / test_views.py: 98%

136 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 vendor.models import Model as VendorModel 

6from .forms import FormDisabled 

7from .forms import Form 

8from . import app_label 

9 

10from django.contrib.auth.models import User 

11 

12from django.core.exceptions import ObjectDoesNotExist 

13 

14try: 

15 from django.urls import reverse 

16except Exception: # pragma: no cover 

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

18 

19from sm.utils import random_string 

20 

21 

22class Tester(TestCase): 

23 teststring = random_string() 

24 testitem = None 

25 password = random_string() 

26 fixtures = [ 

27 "%s/fixtures/01_initial.yaml" % "vendor", 

28 "%s/fixtures/01_initial.yaml" % app_label, 

29 ] 

30 

31 def login(self): 

32 """ 

33 Login as user 

34 """ 

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

36 

37 def setUp(self): 

38 """ 

39 Create user 

40 Create some item in models for testing 

41 """ 

42 self.user = User.objects.create_superuser( 

43 username=random_string(), 

44 password=self.password, 

45 ) 

46 

47 self.vendor = VendorModel.objects.all().order_by("name").first() 

48 self.testitem, created = Model.objects.get_or_create( 

49 name=self.teststring, 

50 vendor=self.vendor, 

51 ) 

52 

53 def test_login_redir(self): 

54 response = self.client.get(reverse("%s:index" % app_label)) 

55 self.assertEqual(response.status_code, 302, "no redirect?") 

56 

57 def test_listview(self): 

58 self.login() 

59 response = self.client.get(reverse("%s:index" % app_label)) 

60 self.assertEqual(response.status_code, 200, "no status 200?") 

61 item = response.context[-1]["object_list"].first() 

62 self.assertIsInstance(item, VendorModel, "object not the correct model!?") 

63 self.assertEqual(item.servermodel_set.all().first().name, self.teststring) 

64 

65 def test_detailview(self): 

66 self.login() 

67 url = reverse("%s:detail" % app_label, args=[self.testitem.pk]) 

68 self.assertEqual("/%s/detail/%i/" % (app_label, self.testitem.pk), url) 

69 response = self.client.get(url) 

70 self.assertEqual(response.status_code, 200, "no status 200?") 

71 item = response.context[-1]["object"] 

72 self.assertIsInstance(item, Model, "object not the correct model!?") 

73 self.assertEqual(item.name, self.teststring) 

74 form = response.context[-1]["form"] 

75 self.assertIsInstance(form, FormDisabled) 

76 self.assertTrue(form.fields["name"].widget.attrs["disabled"]) 

77 

78 def test_updateview(self): 

79 self.login() 

80 url = reverse("%s:update" % app_label, args=[self.testitem.pk]) 

81 self.assertEqual("/%s/update/%i/" % (app_label, self.testitem.pk), url) 

82 response = self.client.get(url) 

83 self.assertEqual(response.status_code, 200, "no status 200?") 

84 item = response.context[-1]["object"] 

85 self.assertIsInstance(item, Model, "object not the correct model!?") 

86 self.assertEqual(item.name, self.teststring) 

87 form = response.context[-1]["form"] 

88 self.assertIsInstance(form, Form) 

89 self.assertRaises( 

90 KeyError, form.fields["name"].widget.attrs.__getitem__, "disabled" 

91 ) 

92 

93 def test_deleteview(self): 

94 self.login() 

95 url = reverse("%s:delete" % app_label, args=[self.testitem.pk]) 

96 self.assertEqual("/%s/delete/%i/" % (app_label, self.testitem.pk), url) 

97 response = self.client.get(url) 

98 self.assertEqual(response.status_code, 200, "no status 200?") 

99 item = response.context[-1]["object"] 

100 self.assertIsInstance(item, Model, "object not the correct model!?") 

101 self.assertEqual(item.name, self.teststring) 

102 if "Are you sure you want to" not in response.content.decode("utf-8"): 

103 print(f"FAILED TO FIND MESSAGE IN: {response.content.decode('utf-8')}") 

104 self.assertContains(response, "Are you sure you want to delete") 

105 self.assertContains(response, "Confirm Delete") 

106 

107 def test_deleteview_post(self): 

108 self.login() 

109 response = self.client.post( 

110 reverse("%s:delete" % app_label, args=[self.testitem.pk]), follow=True 

111 ) 

112 self.assertEqual(response.status_code, 200, "no status 200?") 

113 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302) 

114 pass 

115 if ( 

116 "%s was deleted successfully" % self.testitem.name 

117 not in response.content.decode("utf-8") 

118 ): 

119 print(f"FAILED TO FIND MESSAGE IN: {response.content.decode('utf-8')}") 

120 self.assertContains( 

121 response, "%s was deleted successfully" % self.testitem.name 

122 ) 

123 with self.assertRaises(ObjectDoesNotExist): 

124 Model.objects.get(name=self.testitem.name) 

125 

126 def test_createview(self): 

127 self.login() 

128 url = reverse("%s:create" % app_label) 

129 self.assertEqual("/%s/create" % app_label, url) 

130 response = self.client.get(url) 

131 self.assertEqual(response.status_code, 200, "no status 200?") 

132 self.assertRaises(KeyError, response.context[-1].__getitem__, "object") 

133 self.assertIn("form", response.context[-1]) 

134 form = response.context[-1]["form"] 

135 self.assertRaises( 

136 KeyError, form.fields["name"].widget.attrs.__getitem__, "disabled" 

137 ) 

138 

139 def test_createview_post(self): 

140 # Make sure we have no objects in there 

141 Model.objects.all().delete() 

142 self.login() 

143 data = { 

144 "name": self.teststring, 

145 "vendor": self.vendor.pk, 

146 } 

147 response = self.client.post( 

148 reverse("%s:create" % app_label), 

149 data, 

150 follow=True, 

151 ) 

152 self.assertEqual(response.status_code, 200, "no status 200?") 

153 self.assertRedirects(response, reverse("%s:index" % app_label), status_code=302) 

154 item = response.context[-1]["object_list"].first() 

155 self.assertEqual(item.servermodel_set.all().first().name, data["name"]) 

156 self.assertIsInstance(item, VendorModel) 

157 self.assertIsInstance(item.servermodel_set.all().first(), Model) 

158 if "%s was created successfully" % data["name"] not in response.content.decode( 

159 "utf-8" 

160 ): 

161 print(f"FAILED TO FIND MESSAGE IN: {response.content.decode('utf-8')}") 

162 self.assertContains(response, "%s was created successfully" % data["name"]) 

163 

164 # Class specific tests 

165 def test_listview_empty_true_wo_obj(self): 

166 Model.objects.all().delete() 

167 self.client.cookies["srvmanager-show_empty"] = "true" 

168 self.login() 

169 response = self.client.get(reverse("%s:index" % app_label)) 

170 self.assertEqual(response.status_code, 200, "no status 200?") 

171 item = response.context[-1]["object_list"].first() 

172 self.assertIsInstance(item, VendorModel, "object not the correct model!?") 

173 self.assertEqual(item.name, self.vendor.name) 

174 

175 def test_listview_empty_false_wo_obj(self): 

176 Model.objects.all().delete() 

177 self.client.cookies["srvmanager-show_empty"] = "false" 

178 self.login() 

179 response = self.client.get(reverse("%s:index" % app_label)) 

180 self.assertEqual(response.status_code, 200, "no status 200?") 

181 item = response.context[-1]["object_list"].first() 

182 self.assertIsNone(item) 

183 

184 def test_listview_empty_false_w_obj(self): 

185 self.client.cookies["srvmanager-show_empty"] = "false" 

186 self.login() 

187 response = self.client.get(reverse("%s:index" % app_label)) 

188 item = response.context[-1]["object_list"].first() 

189 self.assertEqual(response.status_code, 200, "no status 200?") 

190 self.assertIsInstance(item, VendorModel, "object not the correct model!?") 

191 self.assertEqual(item.name, self.vendor.name) 

192 

193 # Class specific tests 

194 def test_get_initial(self): 

195 from servermodel.views import CreateView as View 

196 

197 v = View() 

198 v.kwargs = {"vendor": self.vendor.pk} 

199 initial = v.get_initial() 

200 self.assertIsInstance(initial["vendor"], VendorModel) 

201 self.assertEqual(initial["vendor"].name, self.vendor.name)