1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-09 11:46:49 +00:00
webvirtcloud/accounts/tests/test_account_page.py
catborise 488a77b3c7 feat(templates): the shared form and delete pages in a centred column
The pages many views share were a horizontal form whose Cancel went
back in a primary colour beside a green Save, and a delete question in
a yellow alert squeezed into half the width, which wrapped word by word
on a phone.

Both now sit in a centred column with their heading: the form's fields
with their labels above in a card, Cancel outlined and Save the primary
action; the delete page asks "Delete <name>?" in a card with a red
edge, says what deleting does, and offers Cancel and Delete.

The form for a user's rights on a VM names them as the VM's Users tab
does: Change settings, Delete the VM, and Change console settings,
which only counts together with Change settings.
2026-10-31 18:10:05 +03:00

82 lines
4.4 KiB
Python

"""A superuser's page of a user: the VMs and their permissions, the SSH keys."""
from django.contrib.auth.models import User
from django.test import TestCase
from django.urls import reverse
from accounts.models import UserInstance, UserSSHKey
from computes.models import Compute
from instances.models import Instance
from logs.models import Logs
KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGbXMJlKTOlUOvwzdjDs3ac3ivHQoOxAUZEwi3WsJHfs alice@example"
class AccountPageTests(TestCase):
def setUp(self):
self.admin = User.objects.create_superuser("ap-admin", "ap@example.com", "pw")
self.alice = User.objects.create_user("alice", password="pw")
self.key = UserSSHKey.objects.create(user=self.alice, keyname="laptop", keypublic=KEY)
self.client.force_login(self.admin)
def page(self):
return self.client.get(reverse("accounts:account", args=[self.alice.pk]))
def test_the_permissions_are_marks_not_true_or_false(self):
compute = Compute.objects.create(name="ap-host", hostname="localhost", login="", password="", details="", type=4)
vm = Instance.objects.create(compute=compute, name="ap-vm", uuid="00000000-0000-0000-0000-000000000001")
UserInstance.objects.create(user=self.alice, instance=vm, is_vnc=True, is_change=False, is_delete=False)
response = self.page()
self.assertContains(response, "ap-vm")
self.assertNotContains(response, "<td>True</td>", html=True)
self.assertNotContains(response, "<td>False</td>", html=True)
# what the user may do beyond power and console, in the VM Users tab's words, and the VM's host
self.assertContains(response, "Power and console only")
self.assertNotContains(response, "Change settings")
self.assertContains(response, "Host: ap-host")
# the console settings come with the right to change the VM
UserInstance.objects.filter(user=self.alice).update(is_change=True)
response = self.page()
self.assertContains(response, "Change settings")
self.assertContains(response, "Change console settings")
self.assertNotContains(response, "Power and console only")
def test_a_blocked_user_is_marked(self):
self.assertNotContains(self.page(), "Blocked")
self.alice.is_active = False
self.alice.save()
self.assertContains(self.page(), '<span class="badge text-bg-danger">Blocked</span>', html=True)
def test_a_user_without_vms_or_tokens_is_told_so(self):
response = self.page()
self.assertContains(response, "No VMs.")
self.assertContains(response, "No API tokens.")
# the whole key shows over its fingerprint
self.assertContains(response, f'title="{KEY}"')
def test_a_superuser_deletes_a_users_key(self):
url = reverse("accounts:account_ssh_key_delete", args=[self.alice.pk, self.key.pk])
self.assertContains(self.page(), f'href="{url}"')
self.assertContains(self.client.get(url), "laptop")
response = self.client.post(url)
self.assertRedirects(response, reverse("accounts:account", args=[self.alice.pk]) + "#public-keys",
fetch_redirect_response=False)
self.assertFalse(UserSSHKey.objects.exists())
self.assertTrue(Logs.objects.filter(message="SSH key laptop of alice: delete").exists())
def test_only_a_superuser_and_only_that_users_key(self):
bob = User.objects.create_user("bob", password="pw")
self.assertEqual(self.client.post(reverse("accounts:account_ssh_key_delete", args=[bob.pk, self.key.pk])).status_code, 404)
self.client.force_login(bob)
url = reverse("accounts:account_ssh_key_delete", args=[self.alice.pk, self.key.pk])
self.assertEqual(self.client.post(url).status_code, 403)
self.assertTrue(UserSSHKey.objects.exists())
def test_the_owner_form_names_the_rights_as_the_vm_page_does(self):
compute = Compute.objects.create(name="ap-host2", hostname="localhost", login="", password="", details="", type=4)
vm = Instance.objects.create(compute=compute, name="ap-vm2", uuid="00000000-0000-0000-0000-000000000002")
owner = UserInstance.objects.create(user=self.alice, instance=vm)
response = self.client.get(reverse("accounts:user_instance_update", args=[owner.pk]))
for label in ("Change settings", "Delete the VM", "Change console settings"):
self.assertContains(response, label)
self.assertNotContains(response, "Is vnc")