From b49f37924fd9217b42552ed04c6d2c8859e6c4f8 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 22:16:24 +0000 Subject: [PATCH] Add comprehensive test coverage for SettingsForm component - Add TestSettingsForm class with form validation tests - Test form save functionality and field mapping - Add TestSettingsView class for integration tests with HTMX responses - Test authentication requirements and error handling - Follow existing test patterns and assertion styles - Cover all required test scenarios: valid/invalid data, required fields, email validation, duplicate email, password handling Co-Authored-By: Jude Partovi --- realworld/accounts/tests.py | 237 +++++++++++++++++++++++++++++++++++- 1 file changed, 236 insertions(+), 1 deletion(-) diff --git a/realworld/accounts/tests.py b/realworld/accounts/tests.py index 073e947..d3340e1 100644 --- a/realworld/accounts/tests.py +++ b/realworld/accounts/tests.py @@ -4,7 +4,7 @@ from django.test import TestCase from django.urls import reverse, reverse_lazy -from .forms import UserCreationForm +from .forms import SettingsForm, UserCreationForm User = get_user_model() @@ -117,6 +117,241 @@ def test_post_valid(self): self.assertTrue(User.objects.filter(email="tester@gmail.com").exists()) +class TestSettingsForm(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = User( + email="tester@gmail.com", + name="Test User", + bio="Test bio", + image="https://example.com/image.jpg" + ) + cls.user.set_password("testpass") + cls.user.save() + + cls.other_user = User( + email="other@gmail.com", + name="Other User" + ) + cls.other_user.set_password("testpass") + cls.other_user.save() + + def test_valid_form_all_fields(self): + form_data = { + "email": "updated@gmail.com", + "name": "Updated Name", + "bio": "Updated bio", + "image": "https://example.com/updated.jpg", + "password": "newpass123" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + def test_valid_form_minimal_fields(self): + form_data = { + "email": "minimal@gmail.com", + "name": "Minimal Name", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + def test_invalid_email_format(self): + form_data = { + "email": "invalid-email", + "name": "Test Name", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertFalse(form.is_valid()) + self.assertIn("email", form.errors) + + def test_duplicate_email_validation(self): + form_data = { + "email": "other@gmail.com", + "name": "Test Name", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertFalse(form.is_valid()) + self.assertIn("email", form.errors) + + def test_required_field_validation_email(self): + form_data = { + "email": "", + "name": "Test Name", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertFalse(form.is_valid()) + self.assertIn("email", form.errors) + + def test_required_field_validation_name(self): + form_data = { + "email": "test@gmail.com", + "name": "", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertFalse(form.is_valid()) + self.assertIn("name", form.errors) + + def test_optional_password_field_empty(self): + form_data = { + "email": "test@gmail.com", + "name": "Test Name", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + def test_optional_password_field_provided(self): + form_data = { + "email": "test@gmail.com", + "name": "Test Name", + "bio": "", + "image": "", + "password": "newpass123" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + def test_form_save_updates_all_fields(self): + form_data = { + "email": "updated@gmail.com", + "name": "Updated Name", + "bio": "Updated bio", + "image": "https://example.com/updated.jpg", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + updated_user = form.save() + self.assertEqual(updated_user.email, "updated@gmail.com") + self.assertEqual(updated_user.name, "Updated Name") + self.assertEqual(updated_user.bio, "Updated bio") + self.assertEqual(updated_user.image, "https://example.com/updated.jpg") + + def test_form_save_password_hashed_when_provided(self): + original_password = self.user.password + form_data = { + "email": "test@gmail.com", + "name": "Test Name", + "bio": "", + "image": "", + "password": "newpass123" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + updated_user = form.save() + self.assertNotEqual(updated_user.password, original_password) + self.assertTrue(updated_user.check_password("newpass123")) + + def test_form_save_password_unchanged_when_empty(self): + original_password = self.user.password + form_data = { + "email": "test@gmail.com", + "name": "Test Name", + "bio": "", + "image": "", + "password": "" + } + form = SettingsForm(form_data, instance=self.user) + self.assertTrue(form.is_valid()) + + updated_user = form.save() + self.assertEqual(updated_user.password, original_password) + self.assertTrue(updated_user.check_password("testpass")) + + +class TestSettingsView(TestCase): + url = reverse_lazy("settings") + password = "testpass" + + @classmethod + def setUpTestData(cls): + cls.user = User( + email="tester@gmail.com", + name="Test User", + bio="Test bio", + image="https://example.com/image.jpg" + ) + cls.user.set_password(cls.password) + cls.user.save() + + def test_get_authenticated_user(self): + self.client.force_login(self.user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, http.HTTPStatus.OK) + self.assertContains(response, "Your Settings") + self.assertIsInstance(response.context["form"], SettingsForm) + self.assertEqual(response.context["form"].instance, self.user) + + def test_get_unauthenticated_user(self): + response = self.client.get(self.url) + self.assertEqual(response.status_code, http.HTTPStatus.FOUND) + + def test_post_valid_data_saves_and_redirects(self): + self.client.force_login(self.user) + form_data = { + "email": "updated@gmail.com", + "name": "Updated Name", + "bio": "Updated bio", + "image": "https://example.com/updated.jpg", + "password": "" + } + response = self.client.post(self.url, form_data) + + self.assertEqual(response.headers["HX-Redirect"], self.user.get_absolute_url()) + + self.user.refresh_from_db() + self.assertEqual(self.user.email, "updated@gmail.com") + self.assertEqual(self.user.name, "Updated Name") + self.assertEqual(self.user.bio, "Updated bio") + self.assertEqual(self.user.image, "https://example.com/updated.jpg") + + def test_post_invalid_data_returns_form_with_errors(self): + self.client.force_login(self.user) + form_data = { + "email": "invalid-email", + "name": "", + "bio": "", + "image": "", + "password": "" + } + response = self.client.post(self.url, form_data) + + self.assertEqual(response.status_code, http.HTTPStatus.OK) + self.assertTemplateUsed(response, "accounts/_settings.html") + self.assertIsInstance(response.context["form"], SettingsForm) + self.assertFalse(response.context["form"].is_valid()) + + def test_post_unauthenticated_user(self): + form_data = { + "email": "test@gmail.com", + "name": "Test Name", + "bio": "", + "image": "", + "password": "" + } + response = self.client.post(self.url, form_data) + self.assertEqual(response.status_code, http.HTTPStatus.FOUND) + + class TestCheckEmailView(TestCase): url = reverse_lazy("check_email")