Set up tests, add tests for common.util.time, add %d
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Lukáš Kucharczyk 2023-01-05 15:18:57 +01:00
parent 67f5090bf8
commit 34ce1e9b05
Signed by: lukas
SSH Key Fingerprint: SHA256:vMuSwvwAvcT6htVAioMP7rzzwMQNi3roESyhv+nAxeg
6 changed files with 60 additions and 33 deletions

7
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"python.testing.pytestArgs": [
"tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
}

View File

@ -1,5 +1,6 @@
## Unreleased
* Add tests for common.util.time
* Add %d for days to common.util.time.format_duration
* Set up tests, add tests for common.util.time
* Display total hours played on homepage
* Add format_duration to common.util.time
* Allow deleting sessions

View File

@ -39,7 +39,7 @@ createsuperuser:
shell:
python src/web/manage.py shell
poetry.lock:
poetry.lock: pyproject.toml
poetry install
test: poetry.lock

6
poetry.lock generated
View File

@ -98,14 +98,14 @@ files = [
[[package]]
name = "django"
version = "4.1.4"
version = "4.1.5"
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "Django-4.1.4-py3-none-any.whl", hash = "sha256:0b223bfa55511f950ff741983d408d78d772351284c75e9f77d2b830b6b4d148"},
{file = "Django-4.1.4.tar.gz", hash = "sha256:d38a4e108d2386cb9637da66a82dc8d0733caede4c83c4afdbda78af4214211b"},
{file = "Django-4.1.5-py3-none-any.whl", hash = "sha256:4b214a05fe4c99476e99e2445c8b978c8369c18d4dea8e22ec412862715ad763"},
{file = "Django-4.1.5.tar.gz", hash = "sha256:ff56ebd7ead0fd5dbe06fe157b0024a7aaea2e0593bb3785fb594cf94dad58ef"},
]
[package.dependencies]

View File

@ -13,32 +13,27 @@ def format_duration(
) -> str:
"""
Format timedelta into the specified format_string.
If duration is less than 60 seconds, skips formatting, returns "less than a minute".
If duration is 0, skips formatting, returns 0.
Valid format variables:
- %H hours
- %m minutes
- %s seconds
- %r total seconds
"""
seconds_in_hours = 3600
seconds_in_minute = 60
hours: int
minutes: int
seconds: int
seconds_total: int
remainder: int
seconds_total = duration.total_seconds()
if seconds_total == 0:
return 0
else:
hours = int(seconds_total // seconds_in_hours)
remainder = int(seconds_total % seconds_in_hours)
minutes = int(remainder // seconds_in_minute)
if hours == 0 and minutes == 0:
return "less than a minute"
seconds = int(minutes % seconds_in_minute)
literals = {"%H": str(hours), "%m": str(minutes), "%s": str(seconds)}
formatted_string = format_string
for pattern, replacement in literals.items():
formatted_string = re.sub(pattern, replacement, formatted_string)
return formatted_string
minute_seconds = 60
hour_seconds = 60 * minute_seconds
day_seconds = 24 * hour_seconds
seconds_total = int(duration.total_seconds())
days, remainder = divmod(seconds_total, day_seconds)
hours, remainder = divmod(remainder, hour_seconds)
minutes, seconds = divmod(remainder, minute_seconds)
literals = {
"%d": str(days),
"%H": str(hours),
"%m": str(minutes),
"%s": str(seconds),
"%r": str(seconds_total),
}
formatted_string = format_string
for pattern, replacement in literals.items():
formatted_string = re.sub(pattern, replacement, formatted_string)
return formatted_string

View File

@ -8,6 +8,11 @@ class FormatDurationTest(unittest.TestCase):
return super().setUp()
def test_only_days(self):
delta = timedelta(days=3)
result = format_duration(delta, "%d days")
self.assertEqual(result, "3 days")
def test_only_hours(self):
delta = timedelta(hours=1)
result = format_duration(delta, "%H hours")
@ -23,7 +28,26 @@ class FormatDurationTest(unittest.TestCase):
result = format_duration(delta, "%s seconds")
self.assertEqual(result, "1 seconds")
def test_only_less_than_minute_seconds(self):
delta = timedelta(seconds=59)
result = format_duration(delta)
self.assertEqual(result, "less than a minute")
def test_only_rawseconds(self):
delta = timedelta(seconds=5690)
result = format_duration(delta, "%r total seconds")
self.assertEqual(result, "5690 total seconds")
def test_empty(self):
delta = timedelta()
result = format_duration(delta, "")
self.assertEqual(result, "")
def test_zero(self):
delta = timedelta()
result = format_duration(delta, "%r seconds")
self.assertEqual(result, "0 seconds")
def test_all_at_once(self):
delta = timedelta(days=50, hours=10, minutes=34, seconds=24)
result = format_duration(
delta, "%d days, %H hours, %m minutes, %s seconds, %r total seconds"
)
self.assertEqual(
result, "50 days, 10 hours, 34 minutes, 24 seconds, 4358064 total seconds"
)