Mercurial > p > roundup > code
diff test/test_templating.py @ 8285:2bf0c4e7795e
fix: issue2551390 - Replace text input/calendar popup with native date input
Docs, code and test changes for the changeover to a native date
element.
See issue for details.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sat, 18 Jan 2025 12:23:23 -0500 |
| parents | 669dfccca898 |
| children | 6445e63bb423 |
line wrap: on
line diff
--- a/test/test_templating.py Sat Jan 18 11:20:20 2025 -0500 +++ b/test/test_templating.py Sat Jan 18 12:23:23 2025 -0500 @@ -5,6 +5,7 @@ from roundup.anypy.cgi_ import FieldStorage, MiniFieldStorage from roundup.cgi.templating import * from roundup.cgi.ZTUtils.Iterator import Iterator +from roundup.test import memorydb from .test_actions import MockNull, true from .html_norm import NormalizingHtmlParser @@ -716,7 +717,11 @@ def setUp(self): self.form = FieldStorage() self.client = MockNull() - self.client.db = db = MockDatabase() + self.client.db = db = memorydb.create('admin') + db.tx_Source = "web" + + db.issue.addprop(tx_Source=hyperdb.String()) + db.security.hasPermission = lambda *args, **kw: True self.client.form = self.form @@ -725,8 +730,102 @@ self.client.session_api = MockNull(_sid="1234567890") self.client.db.getuid = lambda : 10 + @pytest.fixture(autouse=True) + def inject_fixtures(self, caplog): + self._caplog = caplog + class DateHTMLPropertyTestCase(HTMLPropertyTestClass): + def setUp(self): + super(DateHTMLPropertyTestCase, self).setUp() + + db = self.client.db + db.issue.addprop(deadline=hyperdb.Date()) + + self.test_datestring = "2021-01-01.11:22:10" + + self.client.db.issue.create(title="title", + deadline=date.Date(self.test_datestring)) + self.client.db.getUserTimezone = lambda: "2" + + def tearDown(self): + self.client.db.close() + memorydb.db_nuke('') + + def test_DateHTMLWithDate(self): + """Test methods when DateHTMLProperty._value is a hyperdb.Date() + """ + test_datestring = self.test_datestring + test_Date = self.client.db.issue.get("1", 'deadline') + test_hyperdbDate = self.client.db.issue.getprops("1")['deadline'] + + self.client.classname = "issue" + self.client.template = "item" + + # client, classname, nodeid, prop, name, value, + # anonymous=0, offset=None + d = DateHTMLProperty(self.client, 'issue', '1', test_hyperdbDate, + 'deadline', test_Date) + self.assertIsInstance(d._value, date.Date) + self.assertEqual(d.pretty(), " 1 January 2021") + self.assertEqual(d.pretty(format="%Y-%m"), "2021-01") + self.assertEqual(d.plain(), "2021-01-01.13:22:10") + self.assertEqual(d.local("-4").plain(), "2021-01-01.07:22:10") + input_expected = """<input id="issue1@deadline" name="issue1@deadline" size="30" type="date" value="2021-01-01">""" + self.assertEqual(d.field(), input_expected) + self.assertEqual(d.field_time(type="date"), input_expected) + + input_expected = """<input id="issue1@deadline" name="issue1@deadline" size="30" type="datetime-local" value="2021-01-01T13:22:10">""" + self.assertEqual(d.field(type="datetime-local"), input_expected) + self.assertEqual(d.field_time(), input_expected) + + input_expected = """<input id="issue1@deadline" name="issue1@deadline" size="30" type="text" value="2021-01-01.13:22:10">""" + self.assertEqual(d.field(type="text"), input_expected) + self.assertEqual(d.field_time(type="text"), input_expected) + + # test with format + input_expected = """<input id="issue1@deadline" name="issue1@deadline" size="30" type="text" value="2021-01"><a class="classhelp" data-calurl="issue?@template=calendar&amp;property=deadline&amp;form=itemSynopsis&date=2021-01-01.11:22:10" data-height="200" data-width="300" href="javascript:help_window(\'issue?@template=calendar&property=deadline&form=itemSynopsis&date=2021-01-01.11:22:10\', 300, 200)">(cal)</a>""" + + self._caplog.clear() + with self._caplog.at_level(logging.WARNING, + logger="roundup"): + input = d.field(format="%Y-%m") + self.assertEqual(input_expected, input) + + # name used for logging + log_expected = """Format '%Y-%m' prevents use of modern date input. Remove format from field() call in template issue.item. Using text input.""" + self.assertEqual(self._caplog.record_tuples[0][2], log_expected) + # severity ERROR = 40 + self.assertEqual(self._caplog.record_tuples[0][1], 30, + msg="logging level != 30 (WARNING)") + + # test with format and popcal=None + input_expected = """<input id="issue1@deadline" name="issue1@deadline" size="30" type="text" value="2021-01">""" + + self._caplog.clear() + with self._caplog.at_level(logging.WARNING, + logger="roundup"): + input = d.field(format="%Y-%m", popcal=False) + self.assertEqual(input_expected, input) + + # name used for logging + log_expected = """Format '%Y-%m' prevents use of modern date input. Remove format from field() call in template issue.item. Using text input.""" + self.assertEqual(self._caplog.record_tuples[0][2], log_expected) + # severity ERROR = 40 + self.assertEqual(self._caplog.record_tuples[0][1], 30, + msg="logging level != 30 (WARNING)") + + # test with format, type=text and popcal=None + input_expected = """<input id="issue1@deadline" name="issue1@deadline" size="30" type="text" value="2021-01">""" + + self._caplog.clear() + with self._caplog.at_level(logging.WARNING, + logger="roundup"): + input = d.field(type="text", format="%Y-%m", popcal=False ) + self.assertEqual(input_expected, input) + + self.assertEqual(self._caplog.records, []) + def test_DateHTMLWithText(self): """Test methods when DateHTMLProperty._value is a string rather than a hyperdb.Date() @@ -741,6 +840,9 @@ ( test = MockNull(getprops = lambda : test_date) ) + self.client.classname = "test" + self.client.template = "item" + # client, classname, nodeid, prop, name, value, # anonymous=0, offset=None d = DateHTMLProperty(self.client, 'test', '1', self.client._props, @@ -748,9 +850,62 @@ self.assertIs(type(d._value), str) self.assertEqual(d.pretty(), "2021-01-01 11:22:10") self.assertEqual(d.plain(), "2021-01-01 11:22:10") - input = """<input id="test1@test" name="test1@test" size="30" type="text" value="2021-01-01 11:22:10"><a class="classhelp" data-calurl="test?@template=calendar&amp;property=test&amp;form=itemSynopsis&date=2021-01-01 11:22:10" data-height="200" data-width="300" href="javascript:help_window('test?@template=calendar&property=test&form=itemSynopsis&date=2021-01-01 11:22:10', 300, 200)">(cal)</a>""" + input = """<input id="test1@test" name="test1@test" size="30" type="date" value="2021-01-01 11:22:10">""" self.assertEqual(d.field(), input) + + input_expected = """<input id="test1@test" name="test1@test" size="40" type="date" value="2021-01-01 11:22:10">""" + self.assertEqual(d.field(size=40), input_expected) + + input_expected = """<input id="test1@test" name="test1@test" size="30" type="text" value="2021-01-01 11:22:10"><a class="classhelp" data-calurl="test?@template=calendar&amp;property=test&amp;form=itemSynopsis&date=2021-01-01 11:22:10" data-height="200" data-width="300" href="javascript:help_window(\'test?@template=calendar&property=test&form=itemSynopsis&date=2021-01-01 11:22:10\', 300, 200)">(cal)</a>""" + with self._caplog.at_level(logging.WARNING, + logger="roundup"): + input = d.field(format="%Y-%m") + self.assertEqual(input_expected, input) + + # name used for logging + log_expected = """Format '%Y-%m' prevents use of modern date input. Remove format from field() call in template test.item. Using text input.""" + self.assertEqual(self._caplog.record_tuples[0][2], log_expected) + # severity ERROR = 40 + self.assertEqual(self._caplog.record_tuples[0][1], 30, + msg="logging level != 30 (WARNING)") + + """with self.assertRaises(ValueError) as e: + d.field(format="%Y-%m") + self.assertIn("'%Y-%m'", e.exception.args[0]) + self.assertIn("'date'", e.exception.args[0])""" + + + # format matches rfc format, so this should pass + result = d.field(format="%Y-%m-%d") + input_expected = """<input id="test1@test" name="test1@test" size="30" type="date" value="2021-01-01 11:22:10">""" + self.assertEqual(result, input_expected) + + input_expected = """<input id="test1@test" name="test1@test" size="30" type="text" value="2021-01-01 11:22:10"><a class="classhelp" data-calurl="test?@template=calendar&amp;property=test&amp;form=itemSynopsis&date=2021-01-01 11:22:10" data-height="200" data-width="300" href="javascript:help_window(\'test?@template=calendar&property=test&form=itemSynopsis&date=2021-01-01 11:22:10\', 300, 200)">(cal)</a>""" + with self._caplog.at_level(logging.WARNING, + logger="roundup"): + input = d.field(format="%Y-%m", type="datetime-local") + self.assertEqual(input_expected, input) + + # name used for logging + log_expected = """Format '%Y-%m' prevents use of modern date input. Remove format from field() call in template test.item. Using text input.""" + self.assertEqual(self._caplog.record_tuples[0][2], log_expected) + # severity ERROR = 40 + self.assertEqual(self._caplog.record_tuples[0][1], 30, + msg="logging level != 30 (WARNING)") + + """ + with self.assertRaises(ValueError) as e: + d.field(format="%Y-%m", type="datetime-local") + self.assertIn("'%Y-%m'", e.exception.args[0]) + self.assertIn("'datetime-local'", e.exception.args[0]) + """ + + # format matches rfc, so this should pass + result = d.field(type="datetime-local", format="%Y-%m-%dT%H:%M:%S") + input_expected = """<input id="test1@test" name="test1@test" size="30" type="datetime-local" value="2021-01-01 11:22:10">""" + self.assertEqual(result, input_expected) + # common markdown test cases class MarkdownTests: def mangleMarkdown2(self, s):
