test_gender_profilefield.py 10.0 KB

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