Coverage for clustersoftware / test_views.py: 98%

124 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 

19 

20from sm.utils import random_string, random_number 

21 

22 

23class Tester(TestCase): 

24 testversion = "{}.{}".format(random_number(), random_number()) 

25 teststring = random_string() 

26 testitem = None 

27 password = random_string() 

28 fixtures = [ 

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

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

31 ] 

32 

33 def login(self): 

34 """ 

35 Login as user 

36 """ 

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

38 

39 def setUp(self): 

40 """ 

41 Create user 

42 Create some item in models for testing 

43 """ 

44 self.user = User.objects.create_superuser( 

45 username=random_string(), 

46 password=self.password, 

47 ) 

48 

49 self.vendor = VendorModel.objects.all().first() 

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

51 name=self.teststring, 

52 version=self.testversion, 

53 vendor=self.vendor, 

54 ) 

55 

56 def test_login_redir(self): 

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

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

59 

60 def test_listview(self): 

61 Model.objects.all().delete() 

62 self.setUp() 

63 self.login() 

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

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

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

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

68 self.assertEqual(item.version, self.testversion) 

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

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

71 

72 def test_detailview(self): 

73 self.login() 

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

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

76 response = self.client.get(url) 

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

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

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

80 self.assertEqual(item.version, self.testversion) 

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

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

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

84 self.assertIsInstance(form, FormDisabled) 

85 for field in ["version", "name", "vendor"]: 

86 self.assertTrue(form.fields[field].widget.attrs["disabled"]) 

87 

88 def test_updateview(self): 

89 self.login() 

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

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

92 response = self.client.get(url) 

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

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

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

96 self.assertEqual(item.version, self.testversion) 

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

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

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

100 self.assertIsInstance(form, Form) 

101 for field in ["version", "name", "vendor"]: 

102 self.assertRaises( 

103 KeyError, form.fields[field].widget.attrs.__getitem__, "disabled" 

104 ) 

105 

106 def test_deleteview(self): 

107 self.login() 

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

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

110 response = self.client.get(url) 

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

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

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

114 self.assertEqual(item.version, self.testversion) 

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

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

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

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

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

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

121 

122 def test_deleteview_post(self): 

123 self.login() 

124 response = self.client.post( 

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

126 ) 

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

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

129 pass 

130 self.assertContains( 

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

132 ) 

133 with self.assertRaises(ObjectDoesNotExist): 

134 Model.objects.get( 

135 name=self.testitem.name, 

136 version=self.testitem.version, 

137 vendor=self.vendor, 

138 ) 

139 

140 def test_createview(self): 

141 self.login() 

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

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

144 response = self.client.get(url) 

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

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

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

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

149 self.assertRaises( 

150 KeyError, form.fields["version"].widget.attrs.__getitem__, "disabled" 

151 ) 

152 

153 def test_createview_post(self): 

154 # Make sure we have no objects in there 

155 Model.objects.all().delete() 

156 self.login() 

157 data = { 

158 "name": self.teststring, 

159 "version": self.testversion, 

160 "vendor": self.vendor.pk, 

161 } 

162 response = self.client.post( 

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

164 data, 

165 follow=True, 

166 ) 

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

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

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

170 self.assertEqual(item.version, data["version"]) 

171 self.assertEqual(item.name, data["name"]) 

172 self.assertEqual(item.vendor.pk, data["vendor"]) 

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

174 

175 self.assertIsInstance(item, Model) 

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

177 "utf-8" 

178 ): 

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

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

181 

182 # Class specific tests 

183 def test_get_initial(self): 

184 from clustersoftware.views import CreateView as View 

185 

186 v = View() 

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

188 initial = v.get_initial() 

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

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