From c57f969a009f524200daa0306152855c05cc0ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Thu, 5 Jan 2023 11:52:50 +0100 Subject: [PATCH] Add tests for common.util.time --- .drone.yml | 7 +++- CHANGELOG.md | 1 + poetry.lock | 100 ++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 6 +++ tests/test_time.py | 29 +++++++++++++ 5 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 tests/test_time.py diff --git a/.drone.yml b/.drone.yml index 59bc230..9b42cc7 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,9 +1,14 @@ --- kind: pipeline type: docker -name: build image +name: default steps: +- name: test + image: python:3.10 + commands: + - "poetry install" + - "pytest" - name: build container image: plugins/docker settings: diff --git a/CHANGELOG.md b/CHANGELOG.md index 9834b4e..0b116fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ## Unreleased +* Add tests for common.util.time * Display total hours played on homepage * Add format_duration to common.util.time * Allow deleting sessions diff --git a/poetry.lock b/poetry.lock index b2fa465..d099a78 100644 --- a/poetry.lock +++ b/poetry.lock @@ -15,6 +15,25 @@ files = [ [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + [[package]] name = "black" version = "22.12.0" @@ -98,6 +117,33 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""} argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] +[[package]] +name = "exceptiongroup" +version = "1.1.0" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, + {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] + [[package]] name = "mypy" version = "0.991" @@ -161,6 +207,18 @@ files = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] +[[package]] +name = "packaging" +version = "22.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, + {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, +] + [[package]] name = "pathspec" version = "0.10.3" @@ -189,6 +247,46 @@ files = [ docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pytest" +version = "7.2.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + [[package]] name = "pyyaml" version = "6.0" @@ -290,4 +388,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "0c8d59942dd82c7e89746cfdce544794bf1ce317cac4cdb7b2b5a9137001131d" +content-hash = "d9f6798d18f06cc27933d646af91280f9548e0b28c6118c0d783e1608a5bee52" diff --git a/pyproject.toml b/pyproject.toml index 08dfcac..0cd21cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,13 @@ django = "^4.1.4" black = "^22.12.0" mypy = "^0.991" pyyaml = "^6.0" +pytest = "^7.2.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.pytest.ini_options] +pythonpath = [ + "src" +] diff --git a/tests/test_time.py b/tests/test_time.py new file mode 100644 index 0000000..eae04c2 --- /dev/null +++ b/tests/test_time.py @@ -0,0 +1,29 @@ +import unittest +from web.common.util.time import format_duration +from datetime import timedelta + + +class FormatDurationTest(unittest.TestCase): + def setUp(self) -> None: + + return super().setUp() + + def test_only_hours(self): + delta = timedelta(hours=1) + result = format_duration(delta, "%H hours") + self.assertEqual(result, "1 hours") + + def test_only_minutes(self): + delta = timedelta(minutes=34) + result = format_duration(delta, "%m minutes") + self.assertEqual(result, "34 minutes") + + def test_only_overflow_seconds(self): + delta = timedelta(seconds=61) + 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")