Make tests more robust, use django-pytest

This commit is contained in:
2026-05-12 11:56:28 +02:00
parent 0866eb25e9
commit 37e3c69abc
10 changed files with 57 additions and 107 deletions
+1 -1
View File
@@ -67,7 +67,7 @@ uv.lock: pyproject.toml
uv sync uv sync
test: uv.lock test: uv.lock
uv run pytest uv run --with pytest-django pytest
date: date:
uv run python -c 'import datetime; from zoneinfo import ZoneInfo; print(datetime.datetime.isoformat(datetime.datetime.now(ZoneInfo("Europe/Prague")), timespec="minutes", sep=" "))' uv run python -c 'import datetime; from zoneinfo import ZoneInfo; print(datetime.datetime.isoformat(datetime.datetime.now(ZoneInfo("Europe/Prague")), timespec="minutes", sep=" "))'
+3 -3
View File
@@ -229,7 +229,7 @@ def Icon(
def LinkedPurchase(purchase: Purchase) -> SafeText: def LinkedPurchase(purchase: Purchase) -> SafeText:
link = reverse("view_purchase", args=[int(purchase.id)]) link = reverse("games:view_purchase", args=[int(purchase.id)])
link_content = "" link_content = ""
popover_content = "" popover_content = ""
game_count = purchase.games.count() game_count = purchase.games.count()
@@ -321,12 +321,12 @@ def _resolve_name_with_icon(
final_emulated = session.emulated final_emulated = session.emulated
if linkify: if linkify:
create_link = True create_link = True
link = reverse("view_game", args=[int(game.pk)]) link = reverse("games:view_game", args=[int(game.pk)])
elif game is not None: elif game is not None:
platform = game.platform platform = game.platform
if linkify: if linkify:
create_link = True create_link = True
link = reverse("view_game", args=[int(game.pk)]) link = reverse("games:view_game", args=[int(game.pk)])
_name = name or (game.name if game else "") _name = name or (game.name if game else "")
+7 -2
View File
@@ -42,7 +42,8 @@ dev = [
"isort>=5.13.2,<6", "isort>=5.13.2,<6",
"pre-commit>=3.7.1,<4", "pre-commit>=3.7.1,<4",
"django-debug-toolbar>=4.4.2,<5", "django-debug-toolbar>=4.4.2,<5",
"ruff" "ruff",
"pytest-django>=4.12.0",
] ]
[tool.uv] [tool.uv]
@@ -55,4 +56,8 @@ module-root = ""
requires = ["uv_build>=0.9.26,<0.10.0"] requires = ["uv_build>=0.9.26,<0.10.0"]
build-backend = "uv_build" build-backend = "uv_build"
[tool.isort] [tool.isort]
profile = "black" profile = "black"
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "timetracker.settings"
python_files = ["test_*.py"]
-19
View File
@@ -4,11 +4,6 @@ from unittest.mock import MagicMock, patch
import django import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "timetracker.settings")
django.setup()
from django.template import TemplateDoesNotExist from django.template import TemplateDoesNotExist
from django.utils.safestring import SafeText from django.utils.safestring import SafeText
@@ -638,14 +633,6 @@ class ModelDependentComponentsTest(django.test.TestCase):
purchase.games.set(games) purchase.games.set(games)
return purchase return purchase
@classmethod
def tearDownClass(cls):
super().tearDownClass()
Game.objects.all().delete()
Purchase.objects.all().delete()
Session.objects.all().delete()
Platform.objects.all().delete()
def test_name_with_icon_linkify_with_game(self): def test_name_with_icon_linkify_with_game(self):
platform = self._create_platform(name="Steam", icon="steam") platform = self._create_platform(name="Steam", icon="steam")
game = self._create_game(platform) game = self._create_game(platform)
@@ -784,12 +771,6 @@ class NameWithIconPlatformTest(django.test.TestCase):
cls.platform = Platform.objects.create(name="Nintendo", icon="nintendo") cls.platform = Platform.objects.create(name="Nintendo", icon="nintendo")
cls.game = Game.objects.create(name="Zelda", platform=cls.platform) cls.game = Game.objects.create(name="Zelda", platform=cls.platform)
@classmethod
def tearDownClass(cls):
super().tearDownClass()
Game.objects.all().delete()
Platform.objects.all().delete()
def test_name_with_icon_shows_platform_icon(self): def test_name_with_icon_shows_platform_icon(self):
result = components.NameWithIcon( result = components.NameWithIcon(
name="Zelda", game=self.game, linkify=True name="Zelda", game=self.game, linkify=True
-5
View File
@@ -1,15 +1,10 @@
import json import json
import os
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import django
from django.conf import settings from django.conf import settings
from django.test import TestCase, Client from django.test import TestCase, Client
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "timetracker.settings")
django.setup()
from games.models import Device, Game, Platform, Purchase, Session from games.models import Device, Game, Platform, Purchase, Session
from django.contrib.auth.models import User from django.contrib.auth.models import User
+30 -59
View File
@@ -1,15 +1,9 @@
import os
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import django from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "timetracker.settings")
django.setup()
from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from games.models import Game, Platform, Purchase, Session from games.models import Game, Platform, Purchase, Session
@@ -23,69 +17,46 @@ class PathWorksTest(TestCase):
username="testuser", email="test@example.com", password="testpass" username="testuser", email="test@example.com", password="testpass"
) )
self.client.force_login(self.user) self.client.force_login(self.user)
pl = Platform(name="Test Platform") self.platform = Platform.objects.create(name="Test Platform", icon="test")
pl.save() self.game = Game.objects.create(name="Test Game", platform=self.platform)
g = Game(name="The Test Game") self.purchase = Purchase.objects.create(
g.save()
p = Purchase(
platform=pl,
date_purchased=datetime(2022, 9, 26, 14, 58, tzinfo=ZONEINFO), date_purchased=datetime(2022, 9, 26, 14, 58, tzinfo=ZONEINFO),
platform=self.platform,
) )
p.save() self.purchase.games.add(self.game)
p.games.add(g)
p.save()
s = Session(
game=g,
timestamp_start=datetime(2022, 9, 26, 14, 58, tzinfo=ZONEINFO),
timestamp_end=datetime(2022, 9, 26, 17, 38, tzinfo=ZONEINFO),
)
s.save()
self.testSession = s
self.testGame = g
return super().setUp()
def test_add_device_returns_200(self): def test_index_redirects_to_tracker(self):
url = reverse("add_device") response = self.client.get("/")
response = self.client.get(url) self.assertEqual(response.status_code, 302)
def test_tracker_page_returns_200(self):
response = self.client.get("/tracker/", follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_add_platform_returns_200(self): def test_game_list_returns_200(self):
url = reverse("add_platform") response = self.client.get(reverse("games:list_games"), follow=True)
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_add_game_returns_200(self):
url = reverse("add_game")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_add_purchase_returns_200(self):
url = reverse("add_purchase")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_add_session_returns_200(self):
url = reverse("add_session")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_edit_session_returns_200(self):
id = self.testSession.id
url = reverse("edit_session", args=[id])
response = self.client.get(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_view_game_returns_200(self): def test_view_game_returns_200(self):
url = reverse("view_game", args=[self.testGame.id]) response = self.client.get(reverse("games:view_game", args=[self.game.id]))
response = self.client.get(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_edit_game_returns_200(self): def test_add_game_returns_200(self):
url = reverse("edit_game", args=[self.testGame.id]) response = self.client.get(reverse("games:add_game"))
response = self.client.get(url) self.assertEqual(response.status_code, 200)
def test_stats_returns_200(self):
response = self.client.get(reverse("games:stats_alltime"))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_list_sessions_returns_200(self): def test_list_sessions_returns_200(self):
url = reverse("list_sessions") response = self.client.get(reverse("games:list_sessions"))
response = self.client.get(url) self.assertEqual(response.status_code, 200)
def test_list_playevents_returns_200(self):
response = self.client.get(reverse("games:list_playevents"))
self.assertEqual(response.status_code, 200)
def test_list_purchases_returns_200(self):
response = self.client.get(reverse("games:list_purchases"))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
+1 -6
View File
@@ -1,13 +1,8 @@
import os
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import django
from django.test import TestCase
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "timetracker.settings")
django.setup()
from django.conf import settings from django.conf import settings
from django.test import TestCase
from games.models import Game, Purchase, Session from games.models import Game, Purchase, Session
+1 -6
View File
@@ -1,13 +1,8 @@
import os
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import django
from django.test import TestCase
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "timetracker.settings")
django.setup()
from django.conf import settings from django.conf import settings
from django.test import TestCase
from games.models import Game, Session from games.models import Game, Session
-6
View File
@@ -1,10 +1,4 @@
import json import json
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "timetracker.settings")
django.setup()
from django.contrib.messages import constants as message_constants from django.contrib.messages import constants as message_constants
from django.contrib.messages.storage.fallback import FallbackStorage from django.contrib.messages.storage.fallback import FallbackStorage
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
Generated
+14
View File
@@ -620,6 +620,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
] ]
[[package]]
name = "pytest-django"
version = "4.12.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytest" },
]
sdist = { url = "https://files.pythonhosted.org/packages/13/2b/db9a193df89e5660137f5428063bcc2ced7ad790003b26974adf5c5ceb3b/pytest_django-4.12.0.tar.gz", hash = "sha256:df94ec819a83c8979c8f6de13d9cdfbe76e8c21d39473cfe2b40c9fc9be3c758", size = 91156, upload-time = "2026-02-14T18:40:49.235Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/83/a5/41d091f697c09609e7ef1d5d61925494e0454ebf51de7de05f0f0a728f1d/pytest_django-4.12.0-py3-none-any.whl", hash = "sha256:3ff300c49f8350ba2953b90297d23bf5f589db69545f56f1ec5f8cff5da83e85", size = 26123, upload-time = "2026-02-14T18:40:47.381Z" },
]
[[package]] [[package]]
name = "python-dateutil" name = "python-dateutil"
version = "2.9.0.post0" version = "2.9.0.post0"
@@ -837,6 +849,7 @@ dev = [
{ name = "mypy" }, { name = "mypy" },
{ name = "pre-commit" }, { name = "pre-commit" },
{ name = "pytest" }, { name = "pytest" },
{ name = "pytest-django" },
{ name = "pyyaml" }, { name = "pyyaml" },
{ name = "ruff" }, { name = "ruff" },
] ]
@@ -867,6 +880,7 @@ dev = [
{ name = "mypy", specifier = ">=1.10.1,<2" }, { name = "mypy", specifier = ">=1.10.1,<2" },
{ name = "pre-commit", specifier = ">=3.7.1,<4" }, { name = "pre-commit", specifier = ">=3.7.1,<4" },
{ name = "pytest", specifier = ">=8.2.2,<9" }, { name = "pytest", specifier = ">=8.2.2,<9" },
{ name = "pytest-django", specifier = ">=4.12.0" },
{ name = "pyyaml", specifier = ">=6.0.1,<7" }, { name = "pyyaml", specifier = ">=6.0.1,<7" },
{ name = "ruff" }, { name = "ruff" },
] ]