+
diff --git a/src/pobsync_backend/tests/test_views.py b/src/pobsync_backend/tests/test_views.py
index 1f63df6..e221eeb 100644
--- a/src/pobsync_backend/tests/test_views.py
+++ b/src/pobsync_backend/tests/test_views.py
@@ -233,6 +233,9 @@ class ViewTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Runs")
self.assertContains(response, "Review queued, running, completed")
+ self.assertContains(response, "Apply filters")
+ self.assertContains(response, reverse("runs_list"))
+ self.assertContains(response, "Clear")
self.assertContains(response, f"Run {failed.id}")
self.assertContains(response, "web-01")
self.assertContains(response, "needed")
@@ -275,6 +278,9 @@ class ViewTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Snapshots")
self.assertContains(response, "Browse discovered scheduled, manual, and incomplete snapshots")
+ self.assertContains(response, "Apply filters")
+ self.assertContains(response, reverse("snapshots_list"))
+ self.assertContains(response, "Clear")
self.assertContains(response, manual.dirname)
self.assertContains(response, "web-01")
self.assertNotContains(response, scheduled.dirname)
@@ -291,6 +297,9 @@ class ViewTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Schedules")
self.assertContains(response, "Review configured backup schedules")
+ self.assertContains(response, "Apply filters")
+ self.assertContains(response, reverse("schedules_list"))
+ self.assertContains(response, "Clear")
self.assertContains(response, "web-01")
self.assertContains(response, "15 2 * * *")
self.assertContains(response, "success")
@@ -428,6 +437,9 @@ class ViewTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Logs")
self.assertContains(response, "Filter pobsync service logs")
+ self.assertContains(response, "Filter logs")
+ self.assertContains(response, reverse("logs"))
+ self.assertContains(response, "Clear")
self.assertContains(response, "web-01 failed backup run 12")
self.assertNotContains(response, "web-02 failed backup run 12")
self.assertNotContains(response, "started")
@@ -458,6 +470,9 @@ class ViewTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Purged Snapshots")
self.assertContains(response, "Audit trail for snapshots removed")
+ self.assertContains(response, "Apply filters")
+ self.assertContains(response, reverse("purged_snapshots"))
+ self.assertContains(response, "Clear")
self.assertContains(response, "20260518-021500Z__OLDSNAP")
self.assertContains(response, "outside retention policy")
self.assertContains(response, "Scheduled")
@@ -542,6 +557,21 @@ class ViewTests(TestCase):
self.assertEqual(credential.private_key, "UPLOADED PRIVATE KEY\n")
self.assertEqual(credential.public_key, "DERIVED PUBLIC KEY")
+ def test_ssh_credential_forms_render_cancel_actions(self) -> None:
+ self.client.force_login(self.staff_user)
+ credential = SshCredential.objects.create(name="backup-key")
+
+ create_response = self.client.get(reverse("create_ssh_credential"))
+ edit_response = self.client.get(reverse("edit_ssh_credential", args=[credential.id]))
+ generate_response = self.client.get(reverse("generate_ssh_credential"))
+
+ for response in (create_response, edit_response, generate_response):
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "Cancel")
+ self.assertContains(response, reverse("ssh_credentials"))
+ self.assertContains(edit_response, "Delete SSH key")
+ self.assertContains(edit_response, 'class="danger"', html=False)
+
def test_ssh_credentials_view_generates_filesystem_key(self) -> None:
self.client.force_login(self.staff_user)
with TemporaryDirectory() as tmp, override_settings(POBSYNC_HOME=str(Path(tmp) / "home")):
@@ -746,6 +776,8 @@ class ViewTests(TestCase):
self.assertContains(response, f'value="{credential.id}" selected')
self.assertContains(response, "--archive")
self.assertContains(response, "/proc/***")
+ self.assertContains(response, "Cancel")
+ self.assertContains(response, reverse("dashboard"))
def test_global_config_form_renders_static_container_backup_root_on_edit(self) -> None:
self.client.force_login(self.staff_user)
@@ -1635,8 +1667,11 @@ class ViewTests(TestCase):
response = self.client.get(reverse("run_detail", args=[run.id]))
self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "Run Control")
+ self.assertContains(response, "Cancelling a queued run stops it immediately")
self.assertContains(response, "Cancel run")
self.assertContains(response, reverse("cancel_run", args=[run.id]))
+ self.assertContains(response, 'class="danger"', html=False)
def test_run_detail_renders_worker_execution_metadata(self) -> None:
self.client.force_login(self.staff_user)
@@ -1820,6 +1855,9 @@ class ViewTests(TestCase):
self.assertNotContains(response, "
Source
", html=True)
self.assertContains(response, "Confirm delete count")
self.assertContains(response, "Type 1 to confirm the current number of planned deletions.")
+ self.assertContains(response, "This permanently deletes the snapshot directories listed in Would Delete.")
+ self.assertContains(response, 'class="danger"', html=False)
+ self.assertContains(response, "Cancel")
def test_retention_plan_warns_when_scheduled_prune_limit_is_exceeded(self) -> None:
self.client.force_login(self.staff_user)
@@ -1895,6 +1933,8 @@ class ViewTests(TestCase):
self.assertContains(response, "excluded from retention cleanup")
self.assertContains(response, "Delete incomplete snapshots")
self.assertContains(response, "Type 1 to confirm the current number of incomplete snapshots.")
+ self.assertContains(response, "This deletes only incomplete snapshot directories")
+ self.assertContains(response, 'class="danger"', html=False)
def test_incomplete_cleanup_deletes_incomplete_snapshot_after_confirmation(self) -> None:
self.client.force_login(self.staff_user)
@@ -2142,6 +2182,8 @@ class ViewTests(TestCase):
self.assertContains(response, "evaluated by the pobsync scheduler service")
self.assertContains(response, "15 2 * * *")
self.assertContains(response, "Save schedule")
+ self.assertContains(response, "Cancel")
+ self.assertContains(response, reverse("host_detail", args=[host.host]))
def test_schedule_form_creates_schedule(self) -> None:
self.client.force_login(self.staff_user)
@@ -2243,6 +2285,8 @@ class ViewTests(TestCase):
self.assertContains(response, "/srv")
self.assertContains(response, "*.tmp")
self.assertContains(response, "--numeric-ids")
+ self.assertContains(response, "Cancel")
+ self.assertContains(response, reverse("host_detail", args=[host.host]))
def test_host_config_form_renders_effective_config_check(self) -> None:
self.client.force_login(self.staff_user)