Skip to content

Commit

Permalink
Merge pull request #8462 from cfpb/fix/test-patch-super
Browse files Browse the repository at this point in the history
Modify Python tests to avoid patching super()
  • Loading branch information
chosak committed Jun 11, 2024
2 parents 7e454c6 + 934cbb6 commit 44e1a06
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 145 deletions.
11 changes: 0 additions & 11 deletions cfgov/v1/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,17 +306,6 @@ def set_interpreted_date_values(self, cleaned_data):

return cleaned_data

# Sets the html name by replacing the render method to use the given name.
def set_field_html_name(self, field, new_name):
"""
This creates wrapper around the normal widget rendering,
allowing for a custom field name (new_name).
"""
old_render = field.widget.render
field.widget.render = lambda name, value, **kwargs: old_render(
new_name, value, **kwargs
)


class EnforcementActionsFilterForm(FilterableListForm):
statuses = forms.MultipleChoiceField(
Expand Down
203 changes: 69 additions & 134 deletions cfgov/v1/tests/test_forms.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import datetime
from unittest import mock
from datetime import date
from unittest.mock import MagicMock, patch

from django import forms
from django.test import TestCase
from django.test import SimpleTestCase, TestCase

from wagtail.images.forms import get_image_form

Expand All @@ -12,137 +12,72 @@
from v1.models import CFGOVImage


class TestFilterableListForm(TestCase):
@mock.patch("v1.forms.FilterableListForm.__init__")
@mock.patch("builtins.super")
def test_clean_returns_cleaned_data_if_in_future(
self, mock_super, mock_init
):
mock_init.return_value = None
from_date = datetime.date(2048, 1, 23)
to_date = from_date + datetime.timedelta(weeks=52)
form_data = {"from_date": from_date, "to_date": to_date}

form = FilterableListForm()
mock_super().clean.return_value = form_data
form.cleaned_data = form_data
form.data = {"from_date": "1/23/2048", "to_date": "1/23/2049"}
form._errors = {}

result = form.clean()
assert result["from_date"] == from_date
assert result["to_date"] == to_date

@mock.patch("v1.forms.FilterableListForm.__init__")
@mock.patch("builtins.super")
@freeze_time("2017-07-04")
def test_clean_returns_cleaned_data_if_valid(self, mock_super, mock_init):
mock_init.return_value = None
from_date = datetime.date(2017, 7, 4)
to_date = from_date + datetime.timedelta(days=1)
form_data = {"from_date": from_date, "to_date": to_date}

form = FilterableListForm()
mock_super().clean.return_value = form_data
form.cleaned_data = form_data
form.data = {"from_date": "7/4/2017", "to_date": "7/5/2017"}
form._errors = {}

result = form.clean()
assert result["from_date"] == from_date
assert result["to_date"] == to_date

@mock.patch("v1.forms.FilterableListForm.first_page_date")
@mock.patch("v1.forms.FilterableListForm.__init__")
@mock.patch("builtins.super")
@freeze_time("2017-01-15")
def test_clean_uses_earliest_result_if_fromdate_field_is_empty(
self, mock_super, mock_init, mock_pub_date
):
mock_init.return_value = None
from_date = None
to_date = datetime.date(2017, 1, 15)
form_data = {"from_date": from_date, "to_date": to_date}

form = FilterableListForm()
mock_super().clean.return_value = form_data
form.cleaned_data = form_data
form.data = {"to_date": "1-15-2017"}
form._errors = {}
mock_pub_date.return_value = datetime.date(1995, 1, 1)

result = form.clean()
assert result["from_date"] == datetime.date(1995, 1, 1)
assert result["to_date"] == to_date

@mock.patch("v1.forms.FilterableListForm.__init__")
@mock.patch("builtins.super")
@freeze_time("2016-05-15")
def test_clean_uses_today_if_todate_field_is_empty(
self, mock_super, mock_init
):
mock_init.return_value = None
from_date = datetime.date(2016, 5, 15)
to_date = None
form_data = {"from_date": from_date, "to_date": to_date}

form = FilterableListForm()
mock_super().clean.return_value = form_data
form.cleaned_data = form_data
form.data = {"from_date": "5-15-2016"}
form._errors = {}

result = form.clean()
assert result["from_date"] == from_date
assert result["to_date"] == datetime.date.today()

@mock.patch("v1.forms.FilterableListForm.__init__")
@mock.patch("builtins.super")
def test_clean_returns_cleaned_data_if_both_date_fields_are_empty(
self, mock_super, mock_init
):
mock_init.return_value = None
from_date = None
to_date = None

form = FilterableListForm()
mock_super().clean.return_value = {
"from_date": from_date,
"to_date": to_date,
}
form.cleaned_data = {"from_date": from_date, "to_date": to_date}
form.data = {}
form._errors = {}

result = form.clean()
assert result["from_date"] == from_date
assert result["to_date"] == to_date

@mock.patch("v1.forms.FilterableListForm.__init__")
@mock.patch("builtins.super")
@freeze_time("2000-03-15")
def test_clean_switches_date_fields_if_todate_is_less_than_fromdate(
self, mock_super, mock_init
):
mock_init.return_value = None
to_date = datetime.date(2000, 3, 15)
from_date = to_date + datetime.timedelta(days=1)

form = FilterableListForm()
mock_super().clean.return_value = {
"from_date": from_date,
"to_date": to_date,
}
form.cleaned_data = {"from_date": from_date, "to_date": to_date}
form.data = {"from_date": "3/16/2000", "to_date": "3/15/2000"}
form._errors = {}

result = form.clean()
assert result["from_date"] == to_date
assert result["to_date"] == from_date


class TestFilterableDateField(TestCase):
class TestFilterableListFormDateFields(SimpleTestCase):
def check_date_fields(self, data, expected_from_date, expected_to_date):
form = FilterableListForm(filterable_search=MagicMock(), data=data)
self.assertTrue(form.is_valid())
self.assertEqual(form.cleaned_data["from_date"], expected_from_date)
self.assertEqual(form.cleaned_data["to_date"], expected_to_date)

@freeze_time("2020-01-01")
def test_clean_returns_cleaned_data_if_in_future(self):
self.check_date_fields(
data={
"from_date": "2048-01-23",
"to_date": "2049-01-23",
},
expected_from_date=date(2048, 1, 23),
expected_to_date=date(2049, 1, 23),
)

def test_clean_returns_cleaned_data_if_valid(self):
self.check_date_fields(
data={
"from_date": "2017-07-04",
"to_date": "2017-07-05",
},
expected_from_date=date(2017, 7, 4),
expected_to_date=date(2017, 7, 5),
)

@patch(
"v1.forms.FilterableListForm.first_page_date",
return_value=date(1995, 1, 1),
)
def test_clean_uses_earliest_result_if_fromdate_field_is_empty(self, _):
self.check_date_fields(
data={"to_date": "2017-01-15"},
expected_from_date=date(1995, 1, 1),
expected_to_date=date(2017, 1, 15),
)

@freeze_time("2020-01-01")
def test_clean_uses_today_if_todate_field_is_empty(self):
self.check_date_fields(
data={"from_date": "2016-05-15"},
expected_from_date=date(2016, 5, 15),
expected_to_date=date(2020, 1, 1),
)

def test_clean_returns_cleaned_data_if_both_date_fields_are_empty(self):
self.check_date_fields(
data={},
expected_from_date=None,
expected_to_date=None,
)

def test_clean_switches_date_fields_if_todate_is_less_than_fromdate(self):
self.check_date_fields(
data={
"from_date": "2017-07-05",
"to_date": "2017-07-04",
},
expected_from_date=date(2017, 7, 4),
expected_to_date=date(2017, 7, 5),
)


class TestFilterableDateField(SimpleTestCase):
def test_default_required(self):
field = FilterableDateField()
self.assertFalse(field.required)
Expand Down

0 comments on commit 44e1a06

Please sign in to comment.