test_gender_profilefield.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. from django.contrib.auth import get_user_model
  2. from django.urls import reverse
  3. from ...admin.test import AdminTestCase
  4. User = get_user_model()
  5. class GenderProfileFieldTests(AdminTestCase):
  6. def setUp(self):
  7. super().setUp()
  8. self.test_link = reverse("misago:admin:users:edit", kwargs={"pk": self.user.pk})
  9. def test_field_displays_in_admin(self):
  10. """field displays in admin"""
  11. response = self.client.get(self.test_link)
  12. self.assertContains(response, 'name="gender"')
  13. def test_admin_clears_field(self):
  14. """admin form allows admins to clear field"""
  15. self.user.profile_fields["gender"] = "female"
  16. self.user.save()
  17. self.reload_user()
  18. self.assertEqual(self.user.profile_fields["gender"], "female")
  19. response = self.client.post(
  20. self.test_link,
  21. data={
  22. "username": "Edited",
  23. "rank": str(self.user.rank_id),
  24. "roles": str(self.user.roles.all()[0].pk),
  25. "email": "reg@stered.com",
  26. "new_password": "",
  27. "signature": "",
  28. "is_signature_locked": "0",
  29. "is_hiding_presence": "0",
  30. "limits_private_thread_invites_to": "0",
  31. "signature_lock_staff_message": "",
  32. "signature_lock_user_message": "",
  33. "subscribe_to_started_threads": "2",
  34. "subscribe_to_replied_threads": "2",
  35. },
  36. )
  37. self.assertEqual(response.status_code, 302)
  38. self.reload_user()
  39. self.assertEqual(self.user.profile_fields["gender"], "")
  40. def test_admin_validates_field(self):
  41. """admin form allows admins to edit field"""
  42. response = self.client.post(
  43. self.test_link,
  44. data={
  45. "username": "Edited",
  46. "rank": str(self.user.rank_id),
  47. "roles": str(self.user.roles.all()[0].pk),
  48. "email": "reg@stered.com",
  49. "gender": "attackcopter",
  50. "new_password": "",
  51. "signature": "",
  52. "is_signature_locked": "0",
  53. "is_hiding_presence": "0",
  54. "limits_private_thread_invites_to": "0",
  55. "signature_lock_staff_message": "",
  56. "signature_lock_user_message": "",
  57. "subscribe_to_started_threads": "2",
  58. "subscribe_to_replied_threads": "2",
  59. },
  60. )
  61. self.assertContains(
  62. response, "attackcopter is not one of the available choices."
  63. )
  64. def test_admin_edits_field(self):
  65. """admin form allows admins to edit field"""
  66. response = self.client.post(
  67. self.test_link,
  68. data={
  69. "username": "Edited",
  70. "rank": str(self.user.rank_id),
  71. "roles": str(self.user.roles.all()[0].pk),
  72. "email": "reg@stered.com",
  73. "gender": "female",
  74. "new_password": "",
  75. "signature": "",
  76. "is_signature_locked": "0",
  77. "is_hiding_presence": "0",
  78. "limits_private_thread_invites_to": "0",
  79. "signature_lock_staff_message": "",
  80. "signature_lock_user_message": "",
  81. "subscribe_to_started_threads": "2",
  82. "subscribe_to_replied_threads": "2",
  83. },
  84. )
  85. self.assertEqual(response.status_code, 302)
  86. self.reload_user()
  87. self.assertEqual(self.user.profile_fields["gender"], "female")
  88. def test_admin_search_field(self):
  89. """admin users search searches this field"""
  90. test_link = reverse("misago:admin:users:index")
  91. response = self.client.get("%s?redirected=1&profilefields=female" % test_link)
  92. self.assertContains(response, "No users matching criteria exist.")
  93. # search by value
  94. self.user.profile_fields["gender"] = "female"
  95. self.user.save()
  96. response = self.client.get("%s?redirected=1&profilefields=female" % test_link)
  97. self.assertNotContains(response, "No users matching criteria exist.")
  98. # search by choice name
  99. self.user.profile_fields["gender"] = "secret"
  100. self.user.save()
  101. response = self.client.get("%s?redirected=1&profilefields=telling" % test_link)
  102. self.assertNotContains(response, "No users matching criteria exist.")
  103. def test_field_display(self):
  104. """field displays on user profile when filled in"""
  105. test_link = reverse(
  106. "misago:user-details", kwargs={"pk": self.user.pk, "slug": self.user.slug}
  107. )
  108. response = self.client.get(test_link)
  109. self.assertNotContains(response, "Gender")
  110. self.user.profile_fields["gender"] = "secret"
  111. self.user.save()
  112. response = self.client.get(test_link)
  113. self.assertContains(response, "Gender")
  114. self.assertContains(response, "Not telling")
  115. def test_field_outdated_hidden(self):
  116. """field with outdated value is hidden"""
  117. test_link = reverse(
  118. "misago:user-details", kwargs={"pk": self.user.pk, "slug": self.user.slug}
  119. )
  120. response = self.client.get(test_link)
  121. self.assertNotContains(response, "Gender")
  122. self.user.profile_fields["gender"] = "not valid"
  123. self.user.save()
  124. response = self.client.get(test_link)
  125. self.assertNotContains(response, "Gender")
  126. def test_field_display_json(self):
  127. """field is included in display json"""
  128. test_link = reverse("misago:api:user-details", kwargs={"pk": self.user.pk})
  129. response = self.client.get(test_link)
  130. self.assertEqual(
  131. response.json()["groups"],
  132. [
  133. {
  134. "name": "IP address",
  135. "fields": [
  136. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  137. ],
  138. }
  139. ],
  140. )
  141. self.user.profile_fields["gender"] = "male"
  142. self.user.save()
  143. response = self.client.get(test_link)
  144. self.assertEqual(
  145. response.json()["groups"],
  146. [
  147. {
  148. "name": "Personal",
  149. "fields": [
  150. {"fieldname": "gender", "name": "Gender", "text": "Male"}
  151. ],
  152. },
  153. {
  154. "name": "IP address",
  155. "fields": [
  156. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  157. ],
  158. },
  159. ],
  160. )
  161. def test_field_outdated_hidden_json(self):
  162. """field with outdated value is removed in display json"""
  163. test_link = reverse("misago:api:user-details", kwargs={"pk": self.user.pk})
  164. response = self.client.get(test_link)
  165. self.assertEqual(
  166. response.json()["groups"],
  167. [
  168. {
  169. "name": "IP address",
  170. "fields": [
  171. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  172. ],
  173. }
  174. ],
  175. )
  176. self.user.profile_fields["gender"] = "invalid"
  177. self.user.save()
  178. response = self.client.get(test_link)
  179. self.assertEqual(
  180. response.json()["groups"],
  181. [
  182. {
  183. "name": "IP address",
  184. "fields": [
  185. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  186. ],
  187. }
  188. ],
  189. )
  190. def test_api_returns_field_json(self):
  191. """field json is returned from API"""
  192. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  193. response = self.client.get(test_link)
  194. found_field = None
  195. for group in response.json():
  196. for field in group["fields"]:
  197. if field["fieldname"] == "gender":
  198. found_field = field
  199. self.assertEqual(
  200. found_field,
  201. {
  202. "fieldname": "gender",
  203. "label": "Gender",
  204. "help_text": None,
  205. "input": {
  206. "type": "select",
  207. "choices": [
  208. {"label": "Not specified", "value": ""},
  209. {"label": "Not telling", "value": "secret"},
  210. {"label": "Female", "value": "female"},
  211. {"label": "Male", "value": "male"},
  212. ],
  213. },
  214. "initial": "",
  215. },
  216. )
  217. def test_api_clears_field(self):
  218. """field can be cleared via api"""
  219. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  220. self.user.profile_fields["gender"] = "secret"
  221. self.user.save()
  222. self.reload_user()
  223. self.assertEqual(self.user.profile_fields["gender"], "secret")
  224. response = self.client.post(test_link, data={})
  225. self.assertEqual(response.status_code, 200)
  226. self.reload_user()
  227. self.assertEqual(self.user.profile_fields["gender"], "")
  228. def test_api_validates_field(self):
  229. """field can be edited via api"""
  230. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  231. response = self.client.post(test_link, data={"gender": "attackhelicopter"})
  232. self.assertContains(
  233. response,
  234. "attackhelicopter is not one of the available choices.",
  235. status_code=400,
  236. )
  237. def test_api_edits_field(self):
  238. """field can be edited via api"""
  239. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  240. response = self.client.post(test_link, data={"gender": "female"})
  241. self.assertEqual(response.status_code, 200)
  242. self.reload_user()
  243. self.assertEqual(self.user.profile_fields["gender"], "female")