From 91ede73e893ce2850122390c8a492d6f4df72a4c Mon Sep 17 00:00:00 2001 From: Disco DeDisco Date: Mon, 19 Jan 2026 19:09:11 -0500 Subject: [PATCH] now enforcing model validation in list FBV; all UTs & FTs passing --- src/apps/dashboard/tests/test_views.py | 51 +++++++++++-------- src/apps/dashboard/views.py | 15 ++++-- .../test_layout_and_styling.py | 2 +- .../test_list_item_validation.py | 1 - 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/apps/dashboard/tests/test_views.py b/src/apps/dashboard/tests/test_views.py index bc8308d..f2bcffc 100644 --- a/src/apps/dashboard/tests/test_views.py +++ b/src/apps/dashboard/tests/test_views.py @@ -16,6 +16,30 @@ class HomePageTest(TestCase): inputs = form.cssselect('input') self.assertIn('item_text', [input.get('name') for input in inputs]) +class NewListTest(TestCase): + def test_can_save_a_POST_request(self): + self. client.post('/apps/dashboard/newlist', data={'item_text': 'A new list item'}) + self.assertEqual(Item.objects.count(), 1) + new_item = Item.objects.get() + self.assertEqual(new_item.text, 'A new list item') + + def test_redirects_after_POST(self): + response = self.client.post('/apps/dashboard/newlist', data={'item_text': 'A new list item'}) + new_list = List.objects.get() + self.assertRedirects(response, f'/apps/dashboard/{new_list.id}/') + + def test_validation_errors_are_sent_back_to_home_page_template(self): + response = self.client.post("/apps/dashboard/newlist", data={"item_text": ""}) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "apps/dashboard/home.html") + expected_error = html.escape("You can't have an empty list item") + self.assertContains(response, expected_error) + + def test_invalid_list_items_never_save(self): + self.client.post("/apps/dashboard/newlist", data={"item_text": ""}) + self.assertEqual(List.objects.count(), 0) + self.assertEqual(Item.objects.count(), 0) + class DashViewTest(TestCase): def test_uses_list_template(self): mylist = List.objects.create() @@ -70,26 +94,13 @@ class DashViewTest(TestCase): self.assertRedirects(response, f'/apps/dashboard/{correct_list.id}/') -class NewListTest(TestCase): - def test_can_save_a_POST_request(self): - self. client.post('/apps/dashboard/newlist', data={'item_text': 'A new list item'}) - self.assertEqual(Item.objects.count(), 1) - new_item = Item.objects.get() - self.assertEqual(new_item.text, 'A new list item') - - def test_redirects_after_POST(self): - response = self.client.post('/apps/dashboard/newlist', data={'item_text': 'A new list item'}) - new_list = List.objects.get() - self.assertRedirects(response, f'/apps/dashboard/{new_list.id}/') - - def test_validation_errors_are_sent_back_to_home_page_template(self): - response = self.client.post("/apps/dashboard/newlist", data={"item_text": ""}) + def test_validation_errors_end_up_on_lists_page(self): + list_ = List.objects.create() + response = self.client.post( + f"/apps/dashboard/{list_.id}/", + data={"item_text": ""}, + ) self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "apps/dashboard/home.html") + self.assertTemplateUsed(response, "apps/dashboard/list.html") expected_error = html.escape("You can't have an empty list item") self.assertContains(response, expected_error) - - def test_invalid_list_items_never_save(self): - self.client.post("/apps/dashboard/newlist", data={"item_text": ""}) - self.assertEqual(List.objects.count(), 0) - self.assertEqual(Item.objects.count(), 0) diff --git a/src/apps/dashboard/views.py b/src/apps/dashboard/views.py index d9d6b95..72fe088 100644 --- a/src/apps/dashboard/views.py +++ b/src/apps/dashboard/views.py @@ -19,7 +19,16 @@ def new_list(request): def view_list(request, list_id): our_list = List.objects.get(id=list_id) + error = None + if request.method == "POST": - Item.objects.create(text=request.POST['item_text'], list=our_list) - return redirect(f'/apps/dashboard/{our_list.id}/') - return render(request, 'apps/dashboard/list.html', {'list': our_list}) + try: + item = Item(text=request.POST['item_text'], list=our_list) + item.full_clean() + item.save() + return redirect(f'/apps/dashboard/{our_list.id}/') + except ValidationError: + error = "You can't have an empty list item" + + return render(request, 'apps/dashboard/list.html', {'list': our_list, "error": error}) + diff --git a/src/functional_tests/test_layout_and_styling.py b/src/functional_tests/test_layout_and_styling.py index a0a01d3..32c7f0a 100644 --- a/src/functional_tests/test_layout_and_styling.py +++ b/src/functional_tests/test_layout_and_styling.py @@ -8,7 +8,7 @@ class LayoutAndStylingTest(FunctionalTest): self.browser.get(self.live_server_url) self.browser.set_window_size(1024, 768) - print("Viewport width:", self.browser.execute_script("return window.innerWidth")) + # print("Viewport width:", self.browser.execute_script("return window.innerWidth")) inputbox = self.browser.find_element(By.ID, 'id-new-item') self.assertAlmostEqual( diff --git a/src/functional_tests/test_list_item_validation.py b/src/functional_tests/test_list_item_validation.py index c992ad9..369c664 100644 --- a/src/functional_tests/test_list_item_validation.py +++ b/src/functional_tests/test_list_item_validation.py @@ -18,7 +18,6 @@ class ItemValidationTest(FunctionalTest): self.browser.find_element(By.ID, "id-new-item").send_keys("Purchase milk") self.browser.find_element(By.ID, "id-new-item").send_keys(Keys.ENTER) - return # TO-DO: re-enable rest of test self.wait_for_row_in_list_table("1. Purchase milk") self.browser.find_element(By.ID, "id-new-item").send_keys(Keys.ENTER)