1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-08 11:16:47 +00:00
webvirtcloud/admin/tests/test_audit_rows.py
catborise 6523fd0955 style(admin): the user form asks who, what role, what quota, then what more
The create and edit pages of a user had one form for both, ordered for
editing: permissions first, the name and password folded below them and
the quota folded and closed at the end; a new user's name came last.

Both pages now go Account (name, password, may sign in), Role, Quota,
then Groups and permissions, each section with what it is for beside its
fields. Template editor and Superuser become one Role choice with User:
choosing Superuser hides the quota and permissions, which a superuser
does not need (no quota check applies, every permission is theirs); it
keeps the is_staff it had. The quota is always open: each limit takes a
number from 0, or No limit, which is kept as -1 as before; memory is
entered in GiB and kept in MiB, shown exactly so saving a user again
changes nothing. The button says Create user or Save changes.
2026-11-04 22:33:07 +03:00

115 lines
5.5 KiB
Python

"""Changes to users and groups write rows on the Logs page."""
from django.contrib.auth.models import Group, Permission, User
from django.test import TestCase
from django.urls import reverse
from logs.models import Logs
ATTRIBUTES = {"role": "user", "max_instances": 2, "max_cpus": 2, "max_memory": 2, "max_disk_size": 20}
def rows():
return list(Logs.objects.order_by("id").values_list("message", "success"))
class UserRowTests(TestCase):
def setUp(self):
self.admin = User.objects.create_superuser("audit-admin", "audit@example.com", "pw")
self.client.force_login(self.admin)
Logs.objects.all().delete() # the login's row
def create(self, username="carol", **extra):
return self.client.post(reverse("admin:user_create"),
{"username": username, "password": "Carol-pass-2026", "is_active": "on", **ATTRIBUTES, **extra})
def edit(self, user, **changes):
data = {"username": user.username, "email": user.email, "is_active": "on", **ATTRIBUTES,
"user_permissions": [p.pk for p in user.user_permissions.all()],
"groups": [g.pk for g in user.groups.all()], **changes}
return self.client.post(reverse("admin:user_update", args=[user.pk]), data)
def test_user_add_change_delete(self):
self.create()
carol = User.objects.get(username="carol")
self.edit(carol, email="carol@example.com")
self.edit(User.objects.get(pk=carol.pk)) # nothing changed
self.client.post(reverse("admin:user_delete", args=[carol.pk]))
self.assertEqual(rows(), [
("User carol: add", True),
("User carol: change email", True),
("User carol: delete", True),
])
def test_attributes_and_groups_are_named(self):
self.create()
carol = User.objects.get(username="carol")
permission = Permission.objects.get(content_type__app_label="accounts", codename="change_password")
carol.user_permissions.remove(permission)
Logs.objects.all().delete()
self.edit(carol, max_instances=5)
group = Group.objects.create(name="ops")
self.edit(carol, max_instances=5, groups=[group.pk], user_permissions=[permission.pk])
self.edit(carol, max_instances=5, groups=[group.pk], user_permissions=[permission.pk], username="carla")
self.edit(User.objects.get(pk=carol.pk), username="") # invalid: no row
self.assertEqual([m for m, _ in rows()], [
"User carol: change max_instances",
"User carol: change groups, user_permissions",
"User carol: change username",
])
self.assertTrue(User.objects.get(pk=carol.pk).user_permissions.filter(pk=permission.pk).exists())
def test_block_unblock_and_password(self):
self.create()
carol = User.objects.get(username="carol")
Logs.objects.all().delete()
self.client.post(reverse("admin:user_block", args=[carol.pk]))
self.client.post(reverse("admin:user_block", args=[carol.pk])) # already blocked: nothing changes
self.client.post(reverse("admin:user_unblock", args=[carol.pk]))
self.client.post(reverse("admin:user_unblock", args=[carol.pk]))
self.client.post(reverse("admin:user_update_password", args=[carol.pk]),
{"password1": "New-carol-pass-1", "password2": "New-carol-pass-1"})
self.assertEqual(rows(), [
("User carol: block", True),
("User carol: unblock", True),
("User carol: set password", True),
])
self.assertFalse(Logs.objects.filter(message__contains="New-carol-pass-1").exists())
def test_the_row_has_actor_and_ip(self):
self.client.post(
reverse("admin:user_create"), {"username": "carol", "password": "Carol-pass-2026", **ATTRIBUTES},
REMOTE_ADDR="192.0.2.9")
row = Logs.objects.get()
self.assertEqual((row.user, row.host, row.instance, row.ip), ("audit-admin", "-", "", "192.0.2.9"))
class GroupAndRemovedVMRowTests(TestCase):
def setUp(self):
self.client.force_login(User.objects.create_superuser("audit-admin", "audit@example.com", "pw"))
Logs.objects.all().delete() # the login's row
def test_group_add_change_delete(self):
member = User.objects.create_user("dave")
permission = Permission.objects.get(content_type__app_label="accounts", codename="change_password")
self.client.post(reverse("admin:group_create"), {"name": "ops"})
group = Group.objects.get(name="ops")
url = reverse("admin:group_update", args=[group.pk])
self.client.post(url, {"name": "ops", "users": [member.pk]})
self.client.post(url, {"name": "ops", "users": [member.pk], "permissions": [permission.pk]})
self.client.post(url, {"name": "ops", "users": [member.pk], "permissions": [permission.pk]}) # no change
self.client.post(reverse("admin:group_delete", args=[group.pk]))
self.assertEqual(rows(), [
("Group ops: add", True),
("Group ops: change users", True),
("Group ops: change permissions", True),
("Group ops: delete", True),
])
def test_a_removed_vm_record_delete(self):
from instances.models import InstanceTombstone
uuid = "55555555-5555-5555-5555-555555555555"
tombstone = InstanceTombstone.objects.create(uuid=uuid, name="vm", owners=[])
self.client.post(reverse("admin:tombstone_delete", args=[tombstone.pk]))
self.assertEqual(rows(), [(f"Removed VM vm ({uuid}): delete", True)])