Skip to content

Commit 4fa8a77

Browse files
philippemilinkartragis
authored andcommitted
Évite une 500 si le formulaire de profil ne contient pas tous les champs
- Ajoute les tests corresondants - Refactorise le code
1 parent 66d2fa7 commit 4fa8a77

File tree

3 files changed

+86
-12
lines changed

3 files changed

+86
-12
lines changed

zds/member/tests/tests_forms.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ def test_too_long_signature_miniprofile_form(self):
238238
form = MiniProfileForm(data=data)
239239
self.assertFalse(form.is_valid())
240240

241+
def test_missing_non_required_fields_miniprofile_form(self):
242+
data = {}
243+
form = MiniProfileForm(data=data)
244+
self.assertTrue(form.is_valid())
245+
241246

242247
class ProfileFormTest(TestCase):
243248
"""

zds/member/tests/tests_views.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from django.test import TestCase
2+
from django.urls import reverse
3+
4+
from zds.member.tests.factories import ProfileFactory
5+
6+
7+
class UpdateMemberViewTest(TestCase):
8+
def setUp(self):
9+
self.profile = ProfileFactory()
10+
11+
def test_full_form(self):
12+
self.client.force_login(self.profile.user)
13+
14+
new_biography = "Biography"
15+
new_site = "https://perdu.com"
16+
new_avatar_url = "https://site.foo/img.png"
17+
new_sign = "My signature"
18+
19+
response = self.client.post(
20+
reverse("update-member"),
21+
{"biography": new_biography, "site": new_site, "avatar_url": new_avatar_url, "sign": new_sign},
22+
)
23+
self.assertEqual(302, response.status_code)
24+
25+
self.profile.refresh_from_db()
26+
27+
self.assertEqual(self.profile.biography, new_biography)
28+
self.assertEqual(self.profile.site, new_site)
29+
self.assertEqual(self.profile.avatar_url, new_avatar_url)
30+
self.assertEqual(self.profile.sign, new_sign)
31+
32+
def test_blank_form(self):
33+
self.client.force_login(self.profile.user)
34+
35+
self.profile.biography = "Biography"
36+
self.profile.site = "https://perdu.com"
37+
self.profile.avatar_url = "https://site.foo/img.png"
38+
self.profile.sign = "My signature"
39+
self.profile.save()
40+
41+
response = self.client.post(
42+
reverse("update-member"), {"biography": "", "site": "", "avatar_url": "", "sign": ""}
43+
)
44+
self.assertEqual(302, response.status_code)
45+
46+
self.profile.refresh_from_db()
47+
48+
self.assertEqual(self.profile.biography, "")
49+
self.assertEqual(self.profile.site, "")
50+
self.assertEqual(self.profile.avatar_url, "")
51+
self.assertEqual(self.profile.sign, "")
52+
53+
def test_empty_form(self):
54+
self.client.force_login(self.profile.user)
55+
56+
initial_biography = "Biography"
57+
initial_site = "https://perdu.com"
58+
initial_avatar_url = "https://site.foo/img.png"
59+
initial_sign = "My signature"
60+
61+
self.profile.biography = initial_biography
62+
self.profile.site = initial_site
63+
self.profile.avatar_url = initial_avatar_url
64+
self.profile.sign = initial_sign
65+
self.profile.save()
66+
67+
response = self.client.post(reverse("update-member"), {})
68+
self.assertEqual(302, response.status_code)
69+
70+
self.profile.refresh_from_db()
71+
72+
self.assertEqual(self.profile.biography, initial_biography)
73+
self.assertEqual(self.profile.site, initial_site)
74+
self.assertEqual(self.profile.avatar_url, initial_avatar_url)
75+
self.assertEqual(self.profile.sign, initial_sign)

zds/member/views/profile.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -267,19 +267,13 @@ def form_valid(self, form):
267267
return response
268268

269269
def update_profile(self, profile, form):
270+
for field in ["biography", "site", "avatar_url", "sign", "licence"]:
271+
if field in form.data:
272+
profile.__setattr__(field, form.cleaned_data.get(field, ""))
273+
270274
cleaned_data_options = form.cleaned_data.get("options")
271-
profile.biography = form.data["biography"]
272-
profile.site = form.data["site"]
273-
profile.show_sign = "show_sign" in cleaned_data_options
274-
profile.is_hover_enabled = "is_hover_enabled" in cleaned_data_options
275-
profile.allow_temp_visual_changes = "allow_temp_visual_changes" in cleaned_data_options
276-
profile.show_markdown_help = "show_markdown_help" in cleaned_data_options
277-
profile.email_for_answer = "email_for_answer" in cleaned_data_options
278-
profile.email_for_new_mp = "email_for_new_mp" in cleaned_data_options
279-
profile.hide_forum_activity = "hide_forum_activity" in cleaned_data_options
280-
profile.avatar_url = form.data["avatar_url"]
281-
profile.sign = form.data["sign"]
282-
profile.licence = form.cleaned_data["licence"]
275+
for option in [m[0] for m in self.form_class.multi_choices]:
276+
profile.__setattr__(option, option in cleaned_data_options)
283277

284278
def get_success_url(self):
285279
return reverse("update-member")

0 commit comments

Comments
 (0)