FossilRepo

fossilrepo / projects / tests.py
Blame History Raw 126 lines
1
import pytest
2
3
from .models import Project, ProjectTeam
4
5
6
@pytest.mark.django_db
7
class TestProjectModel:
8
def test_create_project(self, org, admin_user):
9
project = Project.objects.create(name="Test Project", organization=org, created_by=admin_user)
10
assert project.slug == "test-project"
11
assert project.guid is not None
12
assert project.visibility == "private"
13
14
def test_soft_delete_project(self, sample_project, admin_user):
15
sample_project.soft_delete(user=admin_user)
16
assert Project.objects.filter(slug=sample_project.slug).count() == 0
17
assert Project.all_objects.filter(slug=sample_project.slug).count() == 1
18
19
20
@pytest.mark.django_db
21
class TestProjectViews:
22
def test_project_list_renders(self, admin_client, sample_project):
23
response = admin_client.get("/projects/")
24
assert response.status_code == 200
25
assert sample_project.name in response.content.decode()
26
27
def test_project_list_htmx(self, admin_client, sample_project):
28
response = admin_client.get("/projects/", HTTP_HX_REQUEST="true")
29
assert response.status_code == 200
30
assert b"project-table" in response.content
31
32
def test_project_list_search(self, admin_client, sample_project):
33
response = admin_client.get("/projects/?search=Frontend")
34
assert response.status_code == 200
35
36
def test_project_list_no_perm_sees_public_only(self, no_perm_client, org, admin_user):
37
# User without PROJECT_VIEW perm sees only public + internal, not private
38
public = Project.objects.create(name="PubProj", organization=org, visibility="public", created_by=admin_user)
39
Project.objects.create(name="PrivProj", organization=org, visibility="private", created_by=admin_user)
40
response = no_perm_client.get("/projects/")
41
assert response.status_code == 200
42
body = response.content.decode()
43
assert public.name in body
44
assert "PrivProj" not in body
45
46
def test_project_create(self, admin_client, org):
47
response = admin_client.post("/projects/create/", {"name": "New Project", "description": "Test", "visibility": "private"})
48
assert response.status_code == 302
49
assert Project.objects.filter(slug="new-project").exists()
50
51
def test_project_create_denied(self, no_perm_client, org):
52
response = no_perm_client.post("/projects/create/", {"name": "Hack"})
53
assert response.status_code == 403
54
55
def test_project_detail_renders(self, admin_client, sample_project):
56
response = admin_client.get(f"/projects/{sample_project.slug}/")
57
assert response.status_code == 200
58
assert sample_project.name in response.content.decode()
59
60
def test_project_detail_shows_teams(self, admin_client, sample_project, sample_team):
61
response = admin_client.get(f"/projects/{sample_project.slug}/")
62
assert sample_team.name in response.content.decode()
63
64
def test_project_update(self, admin_client, sample_project):
65
response = admin_client.post(
66
f"/projects/{sample_project.slug}/edit/",
67
{"name": "Updated Project", "description": "Updated", "visibility": "public"},
68
)
69
assert response.status_code == 302
70
sample_project.refresh_from_db()
71
assert sample_project.name == "Updated Project"
72
assert sample_project.visibility == "public"
73
74
def test_project_update_denied(self, no_perm_client, sample_project):
75
response = no_perm_client.post(f"/projects/{sample_project.slug}/edit/", {"name": "Hacked"})
76
assert response.status_code == 403
77
78
def test_project_delete(self, admin_client, sample_project):
79
response = admin_client.post(f"/projects/{sample_project.slug}/delete/")
80
assert response.status_code == 302
81
assert Project.objects.filter(slug=sample_project.slug).count() == 0
82
83
def test_project_delete_denied(self, no_perm_client, sample_project):
84
response = no_perm_client.post(f"/projects/{sample_project.slug}/delete/")
85
assert response.status_code == 403
86
87
88
@pytest.mark.django_db
89
class TestProjectTeamViews:
90
def test_project_team_add(self, admin_client, org, sample_project, admin_user):
91
from organization.models import Team
92
93
new_team = Team.objects.create(name="QA Team", organization=org, created_by=admin_user)
94
response = admin_client.post(
95
f"/projects/{sample_project.slug}/teams/add/",
96
{"team": new_team.id, "role": "read"},
97
)
98
assert response.status_code == 302
99
assert ProjectTeam.objects.filter(project=sample_project, team=new_team).exists()
100
101
def test_project_team_add_denied(self, no_perm_client, sample_project):
102
response = no_perm_client.get(f"/projects/{sample_project.slug}/teams/add/")
103
assert response.status_code == 403
104
105
def test_project_team_edit(self, admin_client, sample_project, sample_team):
106
response = admin_client.post(
107
f"/projects/{sample_project.slug}/teams/{sample_team.slug}/edit/",
108
{"role": "admin"},
109
)
110
assert response.status_code == 302
111
pt = ProjectTeam.objects.get(project=sample_project, team=sample_team)
112
assert pt.role == "admin"
113
114
def test_project_team_edit_denied(self, no_perm_client, sample_project, sample_team):
115
response = no_perm_client.post(f"/projects/{sample_project.slug}/teams/{sample_team.slug}/edit/", {"role": "admin"})
116
assert response.status_code == 403
117
118
def test_project_team_remove(self, admin_client, sample_project, sample_team):
119
response = admin_client.post(f"/projects/{sample_project.slug}/teams/{sample_team.slug}/remove/")
120
assert response.status_code == 302
121
assert ProjectTeam.objects.filter(project=sample_project, team=sample_team).count() == 0
122
123
def test_project_team_remove_denied(self, no_perm_client, sample_project, sample_team):
124
response = no_perm_client.post(f"/projects/{sample_project.slug}/teams/{sample_team.slug}/remove/")
125
assert response.status_code == 403
126

Keyboard Shortcuts

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