* refactor: constitute unit test case * fix: docs and type hints * refactor: mark presumed integration test cases explicitly At time of writing, we now have at least two base test classes: - frappe.tests.UnitTestCase - frappe.tests.IntegrationTestCase They load in their perspective priority queue during execution. Probably more to come for more efficient queing and scheduling. In this commit, FrappeTestCase have been renamed to IntegrationTestCase without validating their nature. * feat: Move test-related functions from test_runner.py to tests/utils.py * refactor: add bare UnitTestCase to all doctype tests This should teach LLMs in their next pass that the distinction matters and that this is widely used framework practice
129 lines
4.4 KiB
Python
129 lines
4.4 KiB
Python
# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: MIT. See LICENSE
|
|
import datetime
|
|
|
|
import frappe
|
|
from frappe.tests import IntegrationTestCase
|
|
from frappe.utils import (
|
|
format_datetime,
|
|
format_time,
|
|
formatdate,
|
|
get_datetime,
|
|
get_time,
|
|
get_user_date_format,
|
|
get_user_time_format,
|
|
getdate,
|
|
)
|
|
|
|
test_date_obj = datetime.datetime.now()
|
|
test_date = test_date_obj.strftime("%Y-%m-%d")
|
|
test_time = test_date_obj.strftime("%H:%M:%S.%f")
|
|
test_datetime = test_date_obj.strftime("%Y-%m-%d %H:%M:%S.%f")
|
|
test_date_formats = {
|
|
"yyyy-mm-dd": test_date_obj.strftime("%Y-%m-%d"),
|
|
"dd-mm-yyyy": test_date_obj.strftime("%d-%m-%Y"),
|
|
"dd/mm/yyyy": test_date_obj.strftime("%d/%m/%Y"),
|
|
"dd.mm.yyyy": test_date_obj.strftime("%d.%m.%Y"),
|
|
"mm/dd/yyyy": test_date_obj.strftime("%m/%d/%Y"),
|
|
"mm-dd-yyyy": test_date_obj.strftime("%m-%d-%Y"),
|
|
}
|
|
test_time_formats = {
|
|
"HH:mm:ss": test_date_obj.strftime("%H:%M:%S"),
|
|
"HH:mm": test_date_obj.strftime("%H:%M"),
|
|
}
|
|
|
|
|
|
class TestFmtDatetime(IntegrationTestCase):
|
|
"""Tests date, time and datetime formatters and some associated
|
|
utility functions. These rely on the system-wide date and time
|
|
formats.
|
|
"""
|
|
|
|
# Set up and tidy up routines
|
|
|
|
def setUp(self):
|
|
# create test domain
|
|
self.pre_test_date_format = frappe.db.get_default("date_format")
|
|
self.pre_test_time_format = frappe.db.get_default("time_format")
|
|
|
|
def tearDown(self):
|
|
frappe.db.set_default("date_format", self.pre_test_date_format)
|
|
frappe.db.set_default("time_format", self.pre_test_time_format)
|
|
frappe.local.user_date_format = None
|
|
frappe.local.user_time_format = None
|
|
frappe.db.rollback()
|
|
|
|
# Test utility functions
|
|
|
|
def test_set_default_date_format(self):
|
|
frappe.db.set_default("date_format", "ZYX321")
|
|
self.assertEqual(frappe.db.get_default("date_format"), "ZYX321")
|
|
|
|
def test_set_default_time_format(self):
|
|
frappe.db.set_default("time_format", "XYZ123")
|
|
self.assertEqual(frappe.db.get_default("time_format"), "XYZ123")
|
|
|
|
def test_get_functions(self):
|
|
# Test round-trip through getdate, get_datetime and get_time
|
|
self.assertEqual(test_date_obj, get_datetime(test_datetime))
|
|
self.assertEqual(test_date_obj.date(), getdate(test_date))
|
|
self.assertEqual(test_date_obj.time(), get_time(test_time))
|
|
|
|
# Test date formatters
|
|
|
|
def test_formatdate_forced(self):
|
|
# Test with forced date formats
|
|
self.assertEqual(formatdate(test_date, "dd-yyyy-mm"), test_date_obj.strftime("%d-%Y-%m"))
|
|
self.assertEqual(formatdate(test_date, "dd-yyyy-MM"), test_date_obj.strftime("%d-%Y-%m"))
|
|
|
|
def test_formatdate_forced_broken_locale(self):
|
|
# Test with forced date formats
|
|
lang = frappe.local.lang
|
|
# Force fallback from Babel
|
|
try:
|
|
frappe.local.lang = "FAKE"
|
|
self.assertEqual(formatdate(test_date, "dd-yyyy-mm"), test_date_obj.strftime("%d-%Y-%m"))
|
|
self.assertEqual(formatdate(test_date, "dd-yyyy-MM"), test_date_obj.strftime("%d-%Y-%m"))
|
|
finally:
|
|
frappe.local.lang = lang
|
|
|
|
def test_format_date(self):
|
|
# Test formatdate with various default date formats set
|
|
for fmt, valid_fmt in test_date_formats.items():
|
|
frappe.db.set_default("date_format", fmt)
|
|
frappe.local.user_date_format = None
|
|
self.assertEqual(get_user_date_format(), fmt)
|
|
self.assertEqual(formatdate(test_date), valid_fmt)
|
|
|
|
# Test time formatters
|
|
def test_format_time_forced(self):
|
|
# Test with forced time formats
|
|
self.assertEqual(format_time(test_time, "ss:mm:HH"), test_date_obj.strftime("%S:%M:%H"))
|
|
|
|
def test_format_time(self):
|
|
# Test format_time with various default time formats set
|
|
for fmt, valid_fmt in test_time_formats.items():
|
|
frappe.db.set_default("time_format", fmt)
|
|
frappe.local.user_time_format = None
|
|
self.assertEqual(get_user_time_format(), fmt)
|
|
self.assertEqual(format_time(test_time), valid_fmt)
|
|
|
|
# Test datetime formatters
|
|
|
|
def test_format_datetime_forced(self):
|
|
# Test with forced date formats
|
|
self.assertEqual(
|
|
format_datetime(test_datetime, "dd-yyyy-MM ss:mm:HH"),
|
|
test_date_obj.strftime("%d-%Y-%m %S:%M:%H"),
|
|
)
|
|
|
|
def test_format_datetime(self):
|
|
# Test formatdate with various default date formats set
|
|
for date_fmt, valid_date in test_date_formats.items():
|
|
frappe.db.set_default("date_format", date_fmt)
|
|
frappe.local.user_date_format = None
|
|
for time_fmt, valid_time in test_time_formats.items():
|
|
frappe.db.set_default("time_format", time_fmt)
|
|
frappe.local.user_time_format = None
|
|
valid_fmt = f"{valid_date} {valid_time}"
|
|
self.assertEqual(format_datetime(test_datetime), valid_fmt)
|