You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
5.2 KiB
Python

# Copyright (C) 2021-2022 Intel Corporation
# Copyright (C) 2022 CVAT.ai Corporation
#
# SPDX-License-Identifier: MIT
from copy import deepcopy
from http import HTTPStatus
import pytest
from deepdiff import DeepDiff
from shared.utils.config import delete_method, get_method, options_method, patch_method
class TestMetadataOrganizations:
_ORG = 2
@pytest.mark.parametrize(
"privilege, role, is_member",
[
("admin", None, None),
("user", None, False),
("business", None, False),
("worker", None, False),
(None, "owner", True),
(None, "maintainer", True),
(None, "worker", True),
(None, "supervisor", True),
],
)
def test_can_send_options_request(self, privilege, role, is_member, find_users, organizations):
exclude_org = None if is_member else self._ORG
org = self._ORG if is_member else None
user = find_users(privilege=privilege, role=role, org=org, exclude_org=exclude_org)[0][
"username"
]
response = options_method(user, f"organizations")
assert response.status_code == HTTPStatus.OK
response = options_method(user, f"organizations/{self._ORG}")
assert response.status_code == HTTPStatus.OK
@pytest.mark.usefixtures("dontchangedb")
class TestGetOrganizations:
_ORG = 2
@pytest.mark.parametrize(
"privilege, role, is_member, is_allow",
[
("admin", None, None, True),
("user", None, False, False),
("business", None, False, False),
("worker", None, False, False),
(None, "owner", True, True),
(None, "maintainer", True, True),
(None, "worker", True, True),
(None, "supervisor", True, True),
],
)
def test_can_see_specific_organization(
self, privilege, role, is_member, is_allow, find_users, organizations
):
exclude_org = None if is_member else self._ORG
org = self._ORG if is_member else None
user = find_users(privilege=privilege, role=role, org=org, exclude_org=exclude_org)[0][
"username"
]
response = get_method(user, f"organizations/{self._ORG}")
if is_allow:
assert response.status_code == HTTPStatus.OK
assert DeepDiff(organizations[self._ORG], response.json()) == {}
else:
assert response.status_code == HTTPStatus.NOT_FOUND
@pytest.mark.usefixtures("changedb")
class TestPatchOrganizations:
_ORG = 2
@pytest.fixture(scope="class")
def request_data(self):
return {
"slug": "new",
"name": "new",
"description": "new",
"contact": {"email": "new@cvat.org"},
}
@pytest.fixture(scope="class")
def expected_data(self, organizations, request_data):
data = deepcopy(organizations[self._ORG])
data.update(request_data)
return data
@pytest.mark.parametrize(
"privilege, role, is_member, is_allow",
[
("admin", None, None, True),
("user", None, False, False),
("business", None, False, False),
("worker", None, False, False),
(None, "owner", True, True),
(None, "maintainer", True, True),
(None, "worker", True, False),
(None, "supervisor", True, False),
],
)
def test_can_update_specific_organization(
self, privilege, role, is_member, is_allow, find_users, request_data, expected_data
):
exclude_org = None if is_member else self._ORG
org = self._ORG if is_member else None
user = find_users(privilege=privilege, role=role, org=org, exclude_org=exclude_org)[0][
"username"
]
response = patch_method(user, f"organizations/{self._ORG}", request_data)
if is_allow:
assert response.status_code == HTTPStatus.OK
assert (
DeepDiff(expected_data, response.json(), exclude_paths="root['updated_date']") == {}
)
else:
assert response.status_code != HTTPStatus.OK
@pytest.mark.usefixtures("changedb")
class TestDeleteOrganizations:
_ORG = 2
@pytest.mark.parametrize(
"privilege, role, is_member, is_allow",
[
("admin", None, None, True),
(None, "owner", True, True),
(None, "maintainer", True, False),
(None, "worker", True, False),
(None, "supervisor", True, False),
("user", None, False, False),
("business", None, False, False),
("worker", None, False, False),
],
)
def test_can_delete(self, privilege, role, is_member, is_allow, find_users):
exclude_org = None if is_member else self._ORG
org = self._ORG if is_member else None
user = find_users(privilege=privilege, role=role, org=org, exclude_org=exclude_org)[0][
"username"
]
response = delete_method(user, f"organizations/{self._ORG}")
if is_allow:
assert response.status_code == HTTPStatus.NO_CONTENT
else:
assert response.status_code != HTTPStatus.OK