feat: frontend using django-vite + blabla
This commit is contained in:
+44
-142
@@ -248,117 +248,55 @@ class NoteApiTests(TrackerTestCase):
|
||||
self.assertEqual(GlobalNote.objects.count(), 1)
|
||||
|
||||
|
||||
class TodayPageTests(TrackerTestCase):
|
||||
def test_the_page_requires_login(self):
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertIn("/admin/login/", response["Location"])
|
||||
class AppShellTests(TrackerTestCase):
|
||||
"""The pages are one Vue SPA; Django only serves the shell and its config."""
|
||||
|
||||
def test_the_page_lists_the_doses(self):
|
||||
def test_the_pages_require_login(self):
|
||||
for name in ("tracker:today", "tracker:recap"):
|
||||
response = self.client.get(reverse(name))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertIn("/admin/login/", response["Location"])
|
||||
|
||||
def test_both_routes_serve_the_spa_shell(self):
|
||||
self.client.force_login(self.user)
|
||||
for name in ("tracker:today", "tracker:recap"):
|
||||
response = self.client.get(reverse(name))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, 'id="app"')
|
||||
self.assertContains(response, "osiris-config")
|
||||
|
||||
def test_the_shell_sets_the_csrf_cookie_for_the_api(self):
|
||||
self.client.force_login(self.user)
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, "Vetmedin")
|
||||
self.assertContains(response, "Fortekor")
|
||||
self.assertContains(response, "Morning")
|
||||
self.assertContains(response, "Evening")
|
||||
# Nothing ticked yet, so every dose reads as unrecorded rather than missed.
|
||||
self.assertContains(response, "not recorded", count=3)
|
||||
self.assertNotContains(response, "checked")
|
||||
self.assertIn("csrftoken", response.cookies)
|
||||
self.assertContains(response, "csrfToken")
|
||||
|
||||
def test_saving_ticks_doses_and_records_the_pulse(self):
|
||||
self.client.force_login(self.user)
|
||||
today = timezone.localdate()
|
||||
|
||||
response = self.client.post(
|
||||
reverse("tracker:today"),
|
||||
{
|
||||
"date": today.isoformat(),
|
||||
f"dose-{self.morning.id}": "on",
|
||||
f"dose-{self.morning_only.id}": "on",
|
||||
# The evening checkbox is absent: not given.
|
||||
"bpm": "188",
|
||||
},
|
||||
@override_settings(VAPID_PUBLIC_KEY="BMn-test-public-key")
|
||||
def test_the_config_carries_the_reminder_diagnostics(self):
|
||||
self.morning.reminder_time = "08:00"
|
||||
self.morning.save()
|
||||
PushSubscription.objects.create(
|
||||
user=self.user, endpoint="https://push.example/a", p256dh="k", auth="s"
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.assertTrue(DoseLog.objects.get(scheduled_dose=self.morning).taken)
|
||||
self.assertTrue(DoseLog.objects.get(scheduled_dose=self.morning_only).taken)
|
||||
self.assertFalse(DoseLog.objects.get(scheduled_dose=self.evening).taken)
|
||||
self.assertEqual(PulseReading.objects.get(date=today).bpm, 188)
|
||||
|
||||
def test_clearing_the_pulse_field_removes_the_reading(self):
|
||||
self.client.force_login(self.user)
|
||||
today = timezone.localdate()
|
||||
PulseReading.objects.create(date=today, bpm=200)
|
||||
|
||||
self.client.post(
|
||||
reverse("tracker:today"), {"date": today.isoformat(), "bpm": ""}
|
||||
)
|
||||
|
||||
self.assertFalse(PulseReading.objects.filter(date=today).exists())
|
||||
|
||||
def test_saving_records_the_daily_note(self):
|
||||
self.client.force_login(self.user)
|
||||
today = timezone.localdate()
|
||||
|
||||
self.client.post(
|
||||
reverse("tracker:today"),
|
||||
{"date": today.isoformat(), "note": "Ate well."},
|
||||
)
|
||||
|
||||
self.assertEqual(DailyNote.objects.get(date=today).body, "Ate well.")
|
||||
|
||||
def test_clearing_the_note_field_removes_the_note(self):
|
||||
self.client.force_login(self.user)
|
||||
today = timezone.localdate()
|
||||
DailyNote.objects.create(date=today, body="Old news.")
|
||||
|
||||
self.client.post(reverse("tracker:today"), {"date": today.isoformat()})
|
||||
|
||||
self.assertFalse(DailyNote.objects.filter(date=today).exists())
|
||||
|
||||
def test_the_shared_note_form_saves_without_touching_the_day(self):
|
||||
self.client.force_login(self.user)
|
||||
today = timezone.localdate()
|
||||
|
||||
response = self.client.post(
|
||||
reverse("tracker:today"),
|
||||
{"date": today.isoformat(), "global_note": "Vet on Friday."},
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.assertEqual(GlobalNote.load().body, "Vet on Friday.")
|
||||
# Its own form carries no dose or pulse fields; the day must stay untouched.
|
||||
self.assertFalse(DoseLog.objects.exists())
|
||||
self.assertFalse(PulseReading.objects.exists())
|
||||
self.assertFalse(DailyNote.objects.exists())
|
||||
|
||||
def test_the_page_shows_both_notes(self):
|
||||
self.client.force_login(self.user)
|
||||
DailyNote.objects.create(body="More playful than yesterday.")
|
||||
note = GlobalNote.load()
|
||||
note.body = "Vet on Friday."
|
||||
note.save()
|
||||
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
|
||||
self.assertContains(response, "More playful than yesterday.")
|
||||
self.assertContains(response, "Vet on Friday.")
|
||||
self.assertContains(response, "BMn-test-public-key")
|
||||
self.assertContains(response, '"activeDoses": 3')
|
||||
self.assertContains(response, '"dosesWithReminders": 1')
|
||||
self.assertContains(response, '"subscribedDevices": 1')
|
||||
|
||||
def test_the_page_links_to_the_recap(self):
|
||||
@override_settings(VAPID_PUBLIC_KEY="", VAPID_PRIVATE_KEY="")
|
||||
def test_missing_vapid_keys_reach_the_frontend_as_an_empty_string(self):
|
||||
# The frontend's diagnostics card explains the situation to the user.
|
||||
self.client.force_login(self.user)
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
self.assertContains(response, reverse("tracker:recap"))
|
||||
self.assertContains(response, '"vapidPublicKey": ""')
|
||||
|
||||
|
||||
class RecapTests(TrackerTestCase):
|
||||
def test_the_page_requires_login(self):
|
||||
response = self.client.get(reverse("tracker:recap"))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertIn("/admin/login/", response["Location"])
|
||||
|
||||
def test_a_fully_ticked_day_reads_as_complete(self):
|
||||
today = timezone.localdate()
|
||||
for dose in (self.morning, self.morning_only, self.evening):
|
||||
@@ -393,27 +331,19 @@ class RecapTests(TrackerTestCase):
|
||||
self.assertEqual(recap[1]["note"], "Ate well.")
|
||||
self.assertIsNone(recap[0]["bpm"])
|
||||
|
||||
def test_the_page_shows_the_table_graph_and_notes(self):
|
||||
self.client.force_login(self.user)
|
||||
today = timezone.localdate()
|
||||
PulseReading.objects.create(date=today - timedelta(days=1), bpm=170)
|
||||
PulseReading.objects.create(date=today, bpm=190)
|
||||
DailyNote.objects.create(date=today, body="More playful than yesterday.")
|
||||
for dose in (self.morning, self.morning_only, self.evening):
|
||||
DoseLog.objects.create(scheduled_dose=dose, date=today, taken=True)
|
||||
def test_the_recap_lists_every_daily_note(self):
|
||||
DailyNote.objects.create(body="Today's entry.")
|
||||
DailyNote.objects.create(
|
||||
date=timezone.localdate() - timedelta(days=30), body="A month ago."
|
||||
)
|
||||
|
||||
response = self.client.get(reverse("tracker:recap"))
|
||||
response = self.client.get(
|
||||
"/api/tracker/notes/daily", **self.auth_header()
|
||||
).json()
|
||||
|
||||
self.assertContains(response, "✅")
|
||||
self.assertContains(response, "0/3") # every earlier day is incomplete
|
||||
self.assertContains(response, "<polyline")
|
||||
self.assertContains(response, "180.0 bpm") # average
|
||||
self.assertContains(response, "More playful than yesterday.")
|
||||
|
||||
def test_the_graph_explains_itself_without_readings(self):
|
||||
self.client.force_login(self.user)
|
||||
response = self.client.get(reverse("tracker:recap"))
|
||||
self.assertContains(response, "at least two days")
|
||||
self.assertEqual(
|
||||
[n["body"] for n in response], ["Today's entry.", "A month ago."]
|
||||
)
|
||||
|
||||
|
||||
class PwaTests(TrackerTestCase):
|
||||
@@ -431,34 +361,6 @@ class PwaTests(TrackerTestCase):
|
||||
self.assertContains(response, 'rel="manifest"')
|
||||
self.assertContains(response, "serviceWorker.register")
|
||||
|
||||
@override_settings(VAPID_PUBLIC_KEY="", VAPID_PRIVATE_KEY="")
|
||||
def test_the_reminder_card_explains_itself_when_keys_are_missing(self):
|
||||
# It used to hide entirely, which is indistinguishable from a broken page.
|
||||
self.client.force_login(self.user)
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
|
||||
self.assertContains(response, "Reminders")
|
||||
self.assertContains(response, "Diagnostics")
|
||||
self.assertContains(response, "generate_vapid_keys")
|
||||
|
||||
@override_settings(VAPID_PUBLIC_KEY="BMn-test-public-key")
|
||||
def test_the_diagnostics_report_reminder_times_and_devices(self):
|
||||
self.client.force_login(self.user)
|
||||
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
self.assertContains(response, "Doses with a reminder time: 0 of 3")
|
||||
self.assertContains(response, "Devices subscribed (this account): 0")
|
||||
|
||||
self.morning.reminder_time = "08:00"
|
||||
self.morning.save()
|
||||
PushSubscription.objects.create(
|
||||
user=self.user, endpoint="https://push.example/a", p256dh="k", auth="s"
|
||||
)
|
||||
|
||||
response = self.client.get(reverse("tracker:today"))
|
||||
self.assertContains(response, "Doses with a reminder time: 1 of 3")
|
||||
self.assertContains(response, "Devices subscribed (this account): 1")
|
||||
|
||||
def test_the_manifest_is_valid_json_pointing_at_real_icons(self):
|
||||
response = self.client.get(reverse("manifest"))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user