Skip to content

Commit

Permalink
test(templatetags): fix assertions and duration rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
zyv committed Nov 4, 2023
1 parent f207d96 commit 4de2684
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 13 deletions.
18 changes: 15 additions & 3 deletions logbook/templatetags/logbook_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,31 @@ class DurationTemplate(Template):

@register.filter
def duration(value: datetime.timedelta, format_specification: str = "%H:%M:%S"):
hours, remainder = divmod(value.total_seconds(), 60 * 60)
duration_template = DurationTemplate(format_specification)

days, remainder = divmod(value.total_seconds(), 24 * 60 * 60)
hours, remainder = divmod(remainder, 60 * 60)
minutes, seconds = divmod(remainder, 60)

if "d" not in map(str.lower, duration_template.get_identifiers()):
hours += days * 24

if "h" not in map(str.lower, duration_template.get_identifiers()):
minutes += hours * 60

if "m" not in map(str.lower, duration_template.get_identifiers()):
seconds += minutes * 60

def pad(number: float) -> str:
return f"{number:02.0f}"

def ceil(number: float) -> str:
return f"{number:.0f}"

ds = {"d": value.days, "h": hours, "m": minutes, "s": seconds}
ds = {"d": days, "h": hours, "m": minutes, "s": seconds}
substitutions = {k.upper(): pad(v) for k, v in ds.items()} | {k.lower(): ceil(v) for k, v in ds.items()}

return DurationTemplate(format_specification).substitute(**substitutions)
return duration_template.substitute(**substitutions)


@register.filter
Expand Down
26 changes: 16 additions & 10 deletions tests/test_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from logbook.models import SpeedUnit
from logbook.statistics.experience import ExperienceRecord, TotalsRecord
from logbook.templatetags.logbook_utils import replace, represent, subtract, to_kt
from logbook.templatetags.logbook_utils import duration, replace, represent, subtract, to_kt


class TestRepresent(TestCase):
Expand All @@ -17,21 +17,21 @@ def test_result(self):
experience2 = ExperienceRecord(required=TotalsRecord(time=timedelta(hours=100), landings=0), accrued=totals1)
experience3 = ExperienceRecord(required=TotalsRecord(time=timedelta(0), landings=1), accrued=totals1)

self.assertEqual(represent(totals1, experience1), "50h 30m, 1 landing")
self.assertEqual(represent(totals2, experience1), "50h 30m, 2 landings")
self.assertEqual(represent(totals1, experience2), "50h 30m")
self.assertEqual(represent(totals1, experience3), "1 landing")
self.assertEqual("50h 30m, 1 landing", represent(totals1, experience1))
self.assertEqual("50h 30m, 2 landings", represent(totals2, experience1))
self.assertEqual("50h 30m", represent(totals1, experience2))
self.assertEqual("1 landing", represent(totals1, experience3))


class TestSubtract(TestCase):
def test_result(self):
self.assertEqual(subtract(5, 2), 3)
self.assertEqual(3, subtract(5, 2))


class TestReplace(TestCase):
def test_result(self):
result = replace("Hello, world!", "world", "morning")
self.assertEqual(result, "Hello, morning!")
self.assertEqual("Hello, morning!", result)
self.assertIsInstance(result, SafeString)

def test_non_str_value(self):
Expand All @@ -45,7 +45,13 @@ def test_non_str_args(self):

class TestToKT(TestCase):
def test_to_kt(self):
self.assertEqual(to_kt(100, SpeedUnit.KMH), 54)
self.assertEqual(to_kt(100, SpeedUnit.MPH), 87)
self.assertEqual(to_kt(100, SpeedUnit.KT), 100)
self.assertEqual(54, to_kt(100, SpeedUnit.KMH))
self.assertEqual(87, to_kt(100, SpeedUnit.MPH))
self.assertEqual(100, to_kt(100, SpeedUnit.KT))
self.assertRaises(TemplateSyntaxError, to_kt, 100, "foo")


class TestDuration(TestCase):
def test_duration(self):
self.assertEqual("26:03", duration(timedelta(days=1, hours=2, minutes=3, seconds=4), "%H:%M"))
self.assertEqual("1:2:184", duration(timedelta(days=1, hours=2, minutes=3, seconds=4), "%d:%h:%s"))

0 comments on commit 4de2684

Please sign in to comment.