Files
website-v2/users/tests/test_forms.py
Natalia 06cd04f263 Expose view for user preferences (email notifications so far).
Added tests for the new form and view for updating user preferences.
2023-06-20 12:24:40 -03:00

109 lines
3.8 KiB
Python

import pytest
from ..forms import PreferencesForm
from ..models import Preferences
from news.models import NEWS_MODELS
def test_preferences_form_fields_no_user():
form = PreferencesForm()
assert sorted(form.fields.keys()) == [
"allow_notification_others_news_posted",
"allow_notification_own_news_approved",
]
all_news = sorted(m.news_type for m in NEWS_MODELS)
assert form.initial == {
"allow_notification_others_news_posted": all_news,
"allow_notification_own_news_approved": all_news,
}
def test_preferences_form_fields_regular_user(user):
instance = user.preferences
form = PreferencesForm(instance=user.preferences)
assert sorted(form.fields.keys()) == [
"allow_notification_others_news_posted",
"allow_notification_own_news_approved",
]
assert form.initial == {i: getattr(instance, i) for i in form.fields}
def test_preferences_form_fields_moderator_user(moderator_user):
instance = moderator_user.preferences
form = PreferencesForm(instance=moderator_user.preferences)
assert sorted(form.fields.keys()) == [
"allow_notification_others_news_needs_moderation",
"allow_notification_others_news_posted",
"allow_notification_own_news_approved",
]
assert form.initial == {i: getattr(instance, i) for i in form.fields}
@pytest.mark.parametrize("form_field", PreferencesForm.Meta.fields)
@pytest.mark.parametrize("model_class", NEWS_MODELS)
def test_preferences_form_model_modifies_instance_empty_list_no_moderator(
user, form_field, model_class
):
original = Preferences.ALL_NEWS_TYPES
setattr(user.preferences, form_field, original)
expected = []
form = PreferencesForm(instance=user.preferences, data={form_field: expected})
assert form.is_valid(), form.errors
result = form.save()
# Since the user is not moderator, the value for
# allow_notification_others_news_needs_moderation should not change.
if form_field == "allow_notification_others_news_needs_moderation":
expected = original
assert getattr(result, form_field) == expected
user.refresh_from_db()
assert getattr(user.preferences, form_field) == expected
# Now, set a single item.
expected = [model_class.news_type]
form = PreferencesForm(instance=user.preferences, data={form_field: expected})
assert form.is_valid(), form.errors
result = form.save()
# Since the user is not moderator, the value for
# allow_notification_others_news_needs_moderation should not change.
if form_field == "allow_notification_others_news_needs_moderation":
expected = original
assert getattr(result, form_field) == expected
user.refresh_from_db()
assert getattr(user.preferences, form_field) == expected
@pytest.mark.parametrize("form_field", PreferencesForm.Meta.fields)
@pytest.mark.parametrize("model_class", NEWS_MODELS)
def test_preferences_form_model_modifies_instance_empty_list_user_moderator(
moderator_user, form_field, model_class
):
setattr(moderator_user.preferences, form_field, Preferences.ALL_NEWS_TYPES)
expected = []
form = PreferencesForm(
instance=moderator_user.preferences, data={form_field: expected}
)
assert form.is_valid(), form.errors
result = form.save()
assert getattr(result, form_field) == expected
moderator_user.refresh_from_db()
assert getattr(moderator_user.preferences, form_field) == expected
# Now, set a single item.
expected = [model_class.news_type]
form = PreferencesForm(
instance=moderator_user.preferences, data={form_field: expected}
)
assert form.is_valid(), form.errors
result = form.save()
assert getattr(result, form_field) == expected
moderator_user.refresh_from_db()
assert getattr(moderator_user.preferences, form_field) == expected