zhongrj
2025-11-24 276323dce9613867abb3f58a4cc2abbfb2fd0dea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import logging
from django.contrib.auth.models import User
from rest_framework import status
from rest_framework.test import APIClient
from app.models import Project
from .classes import BootTestCase
from guardian.shortcuts import get_perms
 
from webodm import settings
logger = logging.getLogger('app.logger')
 
 
class TestApiProjects(BootTestCase):
    def setUp(self):
        super().setUp()
 
    def tearDown(self):
        super().tearDown()
 
    def test_project(self):
        client = APIClient()
 
        user = User.objects.get(username="testuser")
        project = Project.objects.create(
            owner=user,
            name="test project"
        )
 
        # Cannot edit project (anonymous)
        res = client.post("/api/projects/{}/edit/".format(project.id), {
            'name': 'edited'
        })
        self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
 
        client.login(username="testuser", password="test1234")
 
         # Can edit project
        res = client.post("/api/projects/{}/edit/".format(project.id), {
            'name': 'edited'
        })
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        project.refresh_from_db()
 
        self.assertEqual(project.name, 'edited')
        self.assertEqual(project.description, '')
 
        other_user = User.objects.get(username="testuser2")
 
        other_client = APIClient()
        other_client.login(username="testuser2", password="test1234")
 
        # Other user cannot edit project
        res = other_client.post("/api/projects/{}/edit/".format(project.id), {
            'name': 'edited2'
        })
        self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND)
 
        # Other user cannot see project
        res = other_client.get("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND)
 
        # Change permissions via API
        res = client.post("/api/projects/{}/edit/".format(project.id), {
            'permissions': [{'username': 'testuser2', 'permissions': ['view']}]
        }, format="json")
        self.assertEqual(res.status_code, status.HTTP_200_OK)
 
        # Other user can see project
        res = other_client.get("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        
        # Other user does not own the project
        self.assertFalse(res.data['owned'])
 
        # Other user still cannot edit project
        res = other_client.post("/api/projects/{}/edit/".format(project.id), {
            'name': 'edited2'
        })
        self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND)
 
        # Change permissions again
        res = client.post("/api/projects/{}/edit/".format(project.id), {
            'permissions': [{'username': 'testuser2', 'permissions': ['view', 'add', 'change', 'delete']}]
        }, format="json")
        self.assertEqual(res.status_code, status.HTTP_200_OK)
 
        # Other user can now edit
        res = other_client.post("/api/projects/{}/edit/".format(project.id), {
            'name': 'edited3'
        })
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        project.refresh_from_db()
        self.assertEqual(project.name, 'edited3')
 
        # Can remove permissions
        res = client.post("/api/projects/{}/edit/".format(project.id), {
            'permissions': []
        }, format="json")
        self.assertEqual(res.status_code, status.HTTP_200_OK)
 
        # Other user cannot see project
        res = other_client.get("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND)
 
        # Current user (owner) still has permissions
        res = client.get("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_200_OK)
 
        # Current user owns the project
        self.assertTrue(res.data['owned'])
 
        perms = get_perms(user, project)
        self.assertEqual(len(perms), 4)
 
        # Re-add permissions for other user
        res = client.post("/api/projects/{}/edit/".format(project.id), {
            'permissions': [{'username': 'testuser2', 'permissions': ['view', 'add', 'change', 'delete']}]
        }, format="json")
        self.assertEqual(res.status_code, status.HTTP_200_OK)
 
        # Other user deletes project
        res = other_client.delete("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_204_NO_CONTENT)
        project.refresh_from_db()
 
        # Other user can no longer see the project (permissions have been revoked)
        res = other_client.get("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND)
        perms = get_perms(other_user, project)
        self.assertEqual(len(perms), 0)
        
        # Project is still there
        res = client.get("/api/projects/{}/".format(project.id))
        self.assertEqual(res.status_code, status.HTTP_200_OK)