fix(pricemon): load i18n in _alerts partial and pass alerts to include

AlertsPartialView (htmx-polled every 30s from the dashboard) returned
500 because _alerts.html used {% trans %} without {% load i18n %}.
Added the load tag so the partial renders correctly.

The dashboard's inline {% include 'pricemon/_alerts.html' %} also
relied on an undefined 'alerts' context var (DashboardView sets
'active_alerts'), so the alerts panel rendered empty even when alerts
existed. Pass alerts=active_alerts explicitly via the include.

Add regression tests covering both the dashboard render with an alert
and the alerts partial endpoint.
This commit is contained in:
2026-07-16 09:34:15 +10:00
parent d62a6cb714
commit 4a5f0f63ee
3 changed files with 33 additions and 2 deletions
+1
View File
@@ -1,3 +1,4 @@
{% load i18n %}
{% if alerts %}
<div class="mb-6">
<h2 class="text-sm font-semibold text-gray-700 mb-2 flex items-center gap-1">
+1 -1
View File
@@ -45,7 +45,7 @@
hx-get="{% url 'pricemon-alerts-partial' %}"
hx-trigger="every 30s"
hx-swap="innerHTML">
{% include 'pricemon/_alerts.html' %}
{% include 'pricemon/_alerts.html' with alerts=active_alerts %}
</div>
{% endif %}
+31 -1
View File
@@ -3,7 +3,7 @@ from unittest.mock import patch
import pytest
from django.urls import reverse
from pricemon.models import PriceWatcher
from pricemon.models import PriceAlert, PriceWatcher
@pytest.fixture
@@ -16,6 +16,16 @@ def watcher():
)
@pytest.fixture
def alert(watcher):
return PriceAlert.objects.create(
watcher=watcher,
old_price='100.00',
new_price='80.00',
drop_pct='20.00',
)
@pytest.mark.django_db
class TestPriceMonitorToggle:
def test_dashboard_shows_disable_action_for_enabled_watcher(self, client, watcher):
@@ -53,3 +63,23 @@ class TestPriceMonitorToggle:
response = client.get(reverse('pricemon-toggle-enabled', args=[watcher.pk]))
assert response.status_code == 405
@pytest.mark.django_db
class TestPriceMonitorAlertsPartial:
def test_dashboard_renders_with_active_alert(self, client, watcher, alert):
response = client.get(reverse('pricemon-dashboard'))
assert response.status_code == 200
body = response.content.decode()
assert 'alert-{}'.format(alert.pk) in body
assert 'Price Drop Alerts' in body
def test_alerts_partial_renders_i18n_tags(self, client, watcher, alert):
response = client.get(reverse('pricemon-alerts-partial'))
assert response.status_code == 200
body = response.content.decode()
assert 'alert-{}'.format(alert.pk) in body
assert 'View' in body and 'Dismiss' in body
assert reverse('pricemon-dismiss-alert', args=[alert.pk]) in body