FossilRepo

fossilrepo / organization / tests.py
Source Blame History 179 lines
4ce269c… ragelink 1 import pytest
4ce269c… ragelink 2 from django.contrib.auth.models import User
4ce269c… ragelink 3
4ce269c… ragelink 4 from .models import Organization, OrganizationMember, Team
4ce269c… ragelink 5
4ce269c… ragelink 6
4ce269c… ragelink 7 @pytest.mark.django_db
4ce269c… ragelink 8 class TestOrganization:
4ce269c… ragelink 9 def test_create_organization(self):
4ce269c… ragelink 10 org = Organization.objects.create(name="Acme Corp")
4ce269c… ragelink 11 assert org.slug == "acme-corp"
4ce269c… ragelink 12 assert org.guid is not None
4ce269c… ragelink 13
4ce269c… ragelink 14 def test_soft_delete_excludes_from_default_manager(self):
4ce269c… ragelink 15 user = User.objects.create_user(username="test", password="x")
4ce269c… ragelink 16 org = Organization.objects.create(name="DeleteMe")
4ce269c… ragelink 17 org.soft_delete(user=user)
4ce269c… ragelink 18 assert Organization.objects.filter(slug="deleteme").count() == 0
4ce269c… ragelink 19 assert Organization.all_objects.filter(slug="deleteme").count() == 1
4ce269c… ragelink 20
4ce269c… ragelink 21
4ce269c… ragelink 22 @pytest.mark.django_db
4ce269c… ragelink 23 class TestOrganizationMember:
4ce269c… ragelink 24 def test_create_membership(self, admin_user, org):
4ce269c… ragelink 25 assert OrganizationMember.objects.filter(member=admin_user, organization=org).exists()
4ce269c… ragelink 26
4ce269c… ragelink 27 def test_unique_membership(self, admin_user, org):
4ce269c… ragelink 28 from django.db import IntegrityError
4ce269c… ragelink 29
4ce269c… ragelink 30 with pytest.raises(IntegrityError):
4ce269c… ragelink 31 OrganizationMember.objects.create(member=admin_user, organization=org)
4ce269c… ragelink 32
4ce269c… ragelink 33 def test_str_representation(self, admin_user, org):
4ce269c… ragelink 34 member = OrganizationMember.objects.get(member=admin_user, organization=org)
4ce269c… ragelink 35 assert str(member) == f"{org}/{admin_user}"
4ce269c… ragelink 36
4ce269c… ragelink 37
4ce269c… ragelink 38 @pytest.mark.django_db
4ce269c… ragelink 39 class TestOrgSettingsViews:
4ce269c… ragelink 40 def test_settings_page_renders(self, admin_client, org):
4ce269c… ragelink 41 response = admin_client.get("/settings/")
4ce269c… ragelink 42 assert response.status_code == 200
4ce269c… ragelink 43 assert org.name in response.content.decode()
4ce269c… ragelink 44
4ce269c… ragelink 45 def test_settings_denied_without_perm(self, no_perm_client, org):
4ce269c… ragelink 46 response = no_perm_client.get("/settings/")
4ce269c… ragelink 47 assert response.status_code == 403
4ce269c… ragelink 48
4ce269c… ragelink 49 def test_settings_edit_renders(self, admin_client, org):
4ce269c… ragelink 50 response = admin_client.get("/settings/edit/")
4ce269c… ragelink 51 assert response.status_code == 200
4ce269c… ragelink 52
4ce269c… ragelink 53 def test_settings_edit_saves(self, admin_client, org):
4ce269c… ragelink 54 response = admin_client.post("/settings/edit/", {"name": "Updated Org", "description": "New desc", "website": ""})
4ce269c… ragelink 55 assert response.status_code == 302
4ce269c… ragelink 56 org.refresh_from_db()
4ce269c… ragelink 57 assert org.name == "Updated Org"
4ce269c… ragelink 58
4ce269c… ragelink 59 def test_settings_edit_denied(self, no_perm_client, org):
4ce269c… ragelink 60 response = no_perm_client.post("/settings/edit/", {"name": "Hacked"})
4ce269c… ragelink 61 assert response.status_code == 403
4ce269c… ragelink 62
4ce269c… ragelink 63
4ce269c… ragelink 64 @pytest.mark.django_db
4ce269c… ragelink 65 class TestMemberViews:
4ce269c… ragelink 66 def test_member_list_renders(self, admin_client, org):
4ce269c… ragelink 67 response = admin_client.get("/settings/members/")
4ce269c… ragelink 68 assert response.status_code == 200
4ce269c… ragelink 69
4ce269c… ragelink 70 def test_member_list_htmx_returns_partial(self, admin_client, org):
4ce269c… ragelink 71 response = admin_client.get("/settings/members/", HTTP_HX_REQUEST="true")
4ce269c… ragelink 72 assert response.status_code == 200
4ce269c… ragelink 73 assert b"member-table" in response.content
4ce269c… ragelink 74
4ce269c… ragelink 75 def test_member_list_search(self, admin_client, org):
4ce269c… ragelink 76 response = admin_client.get("/settings/members/?search=admin")
4ce269c… ragelink 77 assert response.status_code == 200
4ce269c… ragelink 78
4ce269c… ragelink 79 def test_member_list_denied(self, no_perm_client, org):
4ce269c… ragelink 80 response = no_perm_client.get("/settings/members/")
4ce269c… ragelink 81 assert response.status_code == 403
4ce269c… ragelink 82
4ce269c… ragelink 83 def test_member_add(self, admin_client, org):
4ce269c… ragelink 84 User.objects.create_user(username="newuser", password="x")
4ce269c… ragelink 85 response = admin_client.post("/settings/members/add/", {"user": User.objects.get(username="newuser").id})
4ce269c… ragelink 86 assert response.status_code == 302
4ce269c… ragelink 87 assert OrganizationMember.objects.filter(member__username="newuser", organization=org).exists()
4ce269c… ragelink 88
4ce269c… ragelink 89 def test_member_add_denied(self, no_perm_client, org):
4ce269c… ragelink 90 response = no_perm_client.get("/settings/members/add/")
4ce269c… ragelink 91 assert response.status_code == 403
4ce269c… ragelink 92
4ce269c… ragelink 93 def test_member_remove(self, admin_client, org, admin_user):
4ce269c… ragelink 94 response = admin_client.post(f"/settings/members/{admin_user.username}/remove/")
4ce269c… ragelink 95 assert response.status_code == 302
4ce269c… ragelink 96 membership = OrganizationMember.all_objects.get(member=admin_user, organization=org)
4ce269c… ragelink 97 assert membership.is_deleted
4ce269c… ragelink 98
4ce269c… ragelink 99 def test_member_remove_denied(self, no_perm_client, org, admin_user):
4ce269c… ragelink 100 response = no_perm_client.post(f"/settings/members/{admin_user.username}/remove/")
4ce269c… ragelink 101 assert response.status_code == 403
4ce269c… ragelink 102
4ce269c… ragelink 103
4ce269c… ragelink 104 @pytest.mark.django_db
4ce269c… ragelink 105 class TestTeamModel:
4ce269c… ragelink 106 def test_create_team(self, org, admin_user):
4ce269c… ragelink 107 team = Team.objects.create(name="Backend", organization=org, created_by=admin_user)
4ce269c… ragelink 108 assert team.slug == "backend"
4ce269c… ragelink 109 assert team.guid is not None
4ce269c… ragelink 110
4ce269c… ragelink 111 def test_soft_delete_team(self, sample_team, admin_user):
4ce269c… ragelink 112 sample_team.soft_delete(user=admin_user)
4ce269c… ragelink 113 assert Team.objects.filter(slug=sample_team.slug).count() == 0
4ce269c… ragelink 114 assert Team.all_objects.filter(slug=sample_team.slug).count() == 1
4ce269c… ragelink 115
4ce269c… ragelink 116
4ce269c… ragelink 117 @pytest.mark.django_db
4ce269c… ragelink 118 class TestTeamViews:
4ce269c… ragelink 119 def test_team_list_renders(self, admin_client, org, sample_team):
4ce269c… ragelink 120 response = admin_client.get("/settings/teams/")
4ce269c… ragelink 121 assert response.status_code == 200
4ce269c… ragelink 122 assert sample_team.name in response.content.decode()
4ce269c… ragelink 123
4ce269c… ragelink 124 def test_team_list_htmx(self, admin_client, org, sample_team):
4ce269c… ragelink 125 response = admin_client.get("/settings/teams/", HTTP_HX_REQUEST="true")
4ce269c… ragelink 126 assert response.status_code == 200
4ce269c… ragelink 127 assert b"team-table" in response.content
4ce269c… ragelink 128
4ce269c… ragelink 129 def test_team_list_search(self, admin_client, org, sample_team):
4ce269c… ragelink 130 response = admin_client.get("/settings/teams/?search=Core")
4ce269c… ragelink 131 assert response.status_code == 200
4ce269c… ragelink 132
4ce269c… ragelink 133 def test_team_list_denied(self, no_perm_client, org):
4ce269c… ragelink 134 response = no_perm_client.get("/settings/teams/")
4ce269c… ragelink 135 assert response.status_code == 403
4ce269c… ragelink 136
4ce269c… ragelink 137 def test_team_create(self, admin_client, org):
4ce269c… ragelink 138 response = admin_client.post("/settings/teams/create/", {"name": "New Team", "description": "A new team"})
4ce269c… ragelink 139 assert response.status_code == 302
4ce269c… ragelink 140 assert Team.objects.filter(slug="new-team").exists()
4ce269c… ragelink 141
4ce269c… ragelink 142 def test_team_create_denied(self, no_perm_client, org):
4ce269c… ragelink 143 response = no_perm_client.post("/settings/teams/create/", {"name": "Hack Team"})
4ce269c… ragelink 144 assert response.status_code == 403
4ce269c… ragelink 145
4ce269c… ragelink 146 def test_team_detail_renders(self, admin_client, sample_team):
4ce269c… ragelink 147 response = admin_client.get(f"/settings/teams/{sample_team.slug}/")
4ce269c… ragelink 148 assert response.status_code == 200
4ce269c… ragelink 149 assert sample_team.name in response.content.decode()
4ce269c… ragelink 150
4ce269c… ragelink 151 def test_team_update(self, admin_client, sample_team):
4ce269c… ragelink 152 response = admin_client.post(f"/settings/teams/{sample_team.slug}/edit/", {"name": "Updated Team", "description": ""})
4ce269c… ragelink 153 assert response.status_code == 302
4ce269c… ragelink 154 sample_team.refresh_from_db()
4ce269c… ragelink 155 assert sample_team.name == "Updated Team"
4ce269c… ragelink 156
4ce269c… ragelink 157 def test_team_update_denied(self, no_perm_client, sample_team):
4ce269c… ragelink 158 response = no_perm_client.post(f"/settings/teams/{sample_team.slug}/edit/", {"name": "Hacked"})
4ce269c… ragelink 159 assert response.status_code == 403
4ce269c… ragelink 160
4ce269c… ragelink 161 def test_team_delete(self, admin_client, sample_team):
4ce269c… ragelink 162 response = admin_client.post(f"/settings/teams/{sample_team.slug}/delete/")
4ce269c… ragelink 163 assert response.status_code == 302
4ce269c… ragelink 164 assert Team.objects.filter(slug=sample_team.slug).count() == 0
4ce269c… ragelink 165
4ce269c… ragelink 166 def test_team_delete_denied(self, no_perm_client, sample_team):
4ce269c… ragelink 167 response = no_perm_client.post(f"/settings/teams/{sample_team.slug}/delete/")
4ce269c… ragelink 168 assert response.status_code == 403
4ce269c… ragelink 169
4ce269c… ragelink 170 def test_team_member_add(self, admin_client, sample_team):
4ce269c… ragelink 171 new_user = User.objects.create_user(username="teamuser", password="x")
4ce269c… ragelink 172 response = admin_client.post(f"/settings/teams/{sample_team.slug}/members/add/", {"user": new_user.id})
4ce269c… ragelink 173 assert response.status_code == 302
4ce269c… ragelink 174 assert sample_team.members.filter(username="teamuser").exists()
4ce269c… ragelink 175
4ce269c… ragelink 176 def test_team_member_remove(self, admin_client, sample_team, admin_user):
4ce269c… ragelink 177 response = admin_client.post(f"/settings/teams/{sample_team.slug}/members/{admin_user.username}/remove/")
4ce269c… ragelink 178 assert response.status_code == 302
4ce269c… ragelink 179 assert not sample_team.members.filter(username=admin_user.username).exists()

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button