test_gender_profilefield.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. from django.contrib.auth import get_user_model
  2. from django.urls import reverse
  3. from misago.admin.testutils import AdminTestCase
  4. UserModel = 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(
  95. response, "No users matching search criteria have been found."
  96. )
  97. # search by value
  98. self.user.profile_fields["gender"] = "female"
  99. self.user.save()
  100. response = self.client.get("%s?redirected=1&profilefields=female" % test_link)
  101. self.assertNotContains(
  102. response, "No users matching search criteria have been found."
  103. )
  104. # search by choice name
  105. self.user.profile_fields["gender"] = "secret"
  106. self.user.save()
  107. response = self.client.get("%s?redirected=1&profilefields=telling" % test_link)
  108. self.assertNotContains(
  109. response, "No users matching search criteria have been found."
  110. )
  111. def test_field_display(self):
  112. """field displays on user profile when filled in"""
  113. test_link = reverse(
  114. "misago:user-details", kwargs={"pk": self.user.pk, "slug": self.user.slug}
  115. )
  116. response = self.client.get(test_link)
  117. self.assertNotContains(response, "Gender")
  118. self.user.profile_fields["gender"] = "secret"
  119. self.user.save()
  120. response = self.client.get(test_link)
  121. self.assertContains(response, "Gender")
  122. self.assertContains(response, "Not telling")
  123. def test_field_outdated_hidden(self):
  124. """field with outdated value is hidden"""
  125. test_link = reverse(
  126. "misago:user-details", kwargs={"pk": self.user.pk, "slug": self.user.slug}
  127. )
  128. response = self.client.get(test_link)
  129. self.assertNotContains(response, "Gender")
  130. self.user.profile_fields["gender"] = "not valid"
  131. self.user.save()
  132. response = self.client.get(test_link)
  133. self.assertNotContains(response, "Gender")
  134. def test_field_display_json(self):
  135. """field is included in display json"""
  136. test_link = reverse("misago:api:user-details", kwargs={"pk": self.user.pk})
  137. response = self.client.get(test_link)
  138. self.assertEqual(
  139. response.json()["groups"],
  140. [
  141. {
  142. "name": "IP address",
  143. "fields": [
  144. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  145. ],
  146. }
  147. ],
  148. )
  149. self.user.profile_fields["gender"] = "male"
  150. self.user.save()
  151. response = self.client.get(test_link)
  152. self.assertEqual(
  153. response.json()["groups"],
  154. [
  155. {
  156. "name": "Personal",
  157. "fields": [
  158. {"fieldname": "gender", "name": "Gender", "text": "Male"}
  159. ],
  160. },
  161. {
  162. "name": "IP address",
  163. "fields": [
  164. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  165. ],
  166. },
  167. ],
  168. )
  169. def test_field_outdated_hidden_json(self):
  170. """field with outdated value is removed in display json"""
  171. test_link = reverse("misago:api:user-details", kwargs={"pk": self.user.pk})
  172. response = self.client.get(test_link)
  173. self.assertEqual(
  174. response.json()["groups"],
  175. [
  176. {
  177. "name": "IP address",
  178. "fields": [
  179. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  180. ],
  181. }
  182. ],
  183. )
  184. self.user.profile_fields["gender"] = "invalid"
  185. self.user.save()
  186. response = self.client.get(test_link)
  187. self.assertEqual(
  188. response.json()["groups"],
  189. [
  190. {
  191. "name": "IP address",
  192. "fields": [
  193. {"fieldname": "join_ip", "name": "Join IP", "text": "127.0.0.1"}
  194. ],
  195. }
  196. ],
  197. )
  198. def test_api_returns_field_json(self):
  199. """field json is returned from API"""
  200. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  201. response = self.client.get(test_link)
  202. found_field = None
  203. for group in response.json():
  204. for field in group["fields"]:
  205. if field["fieldname"] == "gender":
  206. found_field = field
  207. self.assertEqual(
  208. found_field,
  209. {
  210. "fieldname": "gender",
  211. "label": "Gender",
  212. "help_text": None,
  213. "input": {
  214. "type": "select",
  215. "choices": [
  216. {"label": "Not specified", "value": ""},
  217. {"label": "Not telling", "value": "secret"},
  218. {"label": "Female", "value": "female"},
  219. {"label": "Male", "value": "male"},
  220. ],
  221. },
  222. "initial": "",
  223. },
  224. )
  225. def test_api_clears_field(self):
  226. """field can be cleared via api"""
  227. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  228. self.user.profile_fields["gender"] = "secret"
  229. self.user.save()
  230. self.reload_user()
  231. self.assertEqual(self.user.profile_fields["gender"], "secret")
  232. response = self.client.post(test_link, data={})
  233. self.assertEqual(response.status_code, 200)
  234. self.reload_user()
  235. self.assertEqual(self.user.profile_fields["gender"], "")
  236. def test_api_validates_field(self):
  237. """field can be edited via api"""
  238. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  239. response = self.client.post(test_link, data={"gender": "attackhelicopter"})
  240. self.assertContains(
  241. response,
  242. "attackhelicopter is not one of the available choices.",
  243. status_code=400,
  244. )
  245. def test_api_edits_field(self):
  246. """field can be edited via api"""
  247. test_link = reverse("misago:api:user-edit-details", kwargs={"pk": self.user.pk})
  248. response = self.client.post(test_link, data={"gender": "female"})
  249. self.assertEqual(response.status_code, 200)
  250. self.reload_user()
  251. self.assertEqual(self.user.profile_fields["gender"], "female")