Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy_test.api.test_groups
from typing import (
List,
Optional,
)
from galaxy_test.base.populators import DatasetPopulator
from ._framework import ApiTestCase
[docs]class TestGroupsApi(ApiTestCase):
dataset_populator: DatasetPopulator
[docs] def setUp(self):
super().setUp()
self.dataset_populator = DatasetPopulator(self.galaxy_interactor)
[docs] def test_create_valid(self, group_name: Optional[str] = None):
payload = self._build_valid_group_payload(group_name)
response = self._post("groups", payload, admin=True, json=True)
self._assert_status_code_is(response, 200)
group = response.json()[0] # POST /api/groups returns a list
self._assert_valid_group(group)
return group
[docs] def test_create_only_admin(self):
response = self._post("groups", json=True)
self._assert_status_code_is(response, 403)
[docs] def test_create_invalid_params_raises_400(self):
payload = self._build_valid_group_payload()
payload["name"] = None
response = self._post("groups", payload, admin=True, json=True)
self._assert_status_code_is(response, 400)
[docs] def test_create_duplicated_name_raises_409(self):
payload = self._build_valid_group_payload()
response = self._post("groups", payload, admin=True, json=True)
self._assert_status_code_is(response, 200)
response = self._post("groups", payload, admin=True, json=True)
self._assert_status_code_is(response, 409)
[docs] def test_index(self):
self.test_create_valid()
response = self._get("groups", admin=True)
self._assert_status_code_is(response, 200)
groups = response.json()
assert isinstance(groups, list)
assert len(groups) > 0
for group in groups:
self._assert_valid_group(group)
[docs] def test_index_only_admin(self):
response = self._get("groups")
self._assert_status_code_is(response, 403)
[docs] def test_show(self):
group = self.test_create_valid()
group_id = group["id"]
response = self._get(f"groups/{group_id}", admin=True)
self._assert_status_code_is(response, 200)
response_group = response.json()
self._assert_valid_group(response_group)
self._assert_has_keys(response_group, "users_url", "roles_url")
[docs] def test_show_only_admin(self):
group = self.test_create_valid()
group_id = group["id"]
response = self._get(f"groups/{group_id}")
self._assert_status_code_is(response, 403)
[docs] def test_show_unknown_raises_400(self):
group_id = "invalid-group-id"
response = self._get(f"groups/{group_id}", admin=True)
self._assert_status_code_is(response, 400)
[docs] def test_update(self):
user_id = self.dataset_populator.user_id()
user_private_role_id = self.dataset_populator.user_private_role_id()
original_name = f"group-test-{self.dataset_populator.get_random_name()}"
group = self.test_create_valid(group_name=original_name)
self._assert_group_has_expected_values(
group["id"],
name=original_name,
user_ids=[user_id],
role_ids=[user_private_role_id],
)
group_id = group["id"]
updated_name = f"group-test-updated-{self.dataset_populator.get_random_name()}"
update_response = self._put(f"groups/{group_id}", data={"name": updated_name}, admin=True, json=True)
self._assert_status_code_is_ok(update_response)
# Only the name should be updated
self._assert_group_has_expected_values(
group_id,
name=updated_name,
user_ids=[user_id],
role_ids=[user_private_role_id],
)
# Add another user to the group
another_user_email = f"user-{self.dataset_populator.get_random_name()}@example.com"
another_user_id = None
with self._different_user(another_user_email):
another_user_id = self.dataset_populator.user_id()
another_role_id = self.dataset_populator.user_private_role_id()
assert another_user_id is not None
update_response = self._put(f"groups/{group_id}", data={"user_ids": [another_user_id]}, admin=True, json=True)
self._assert_status_code_is_ok(update_response)
# Check if the user was added
self._assert_group_has_expected_values(
group_id,
name=updated_name,
user_ids=[user_id, another_user_id],
role_ids=[user_private_role_id],
)
# Add another role to the group
update_response = self._put(f"groups/{group_id}", data={"role_ids": [another_role_id]}, admin=True, json=True)
self._assert_status_code_is_ok(update_response)
# Check if the role was added
self._assert_group_has_expected_values(
group_id,
name=updated_name,
user_ids=[user_id, another_user_id],
role_ids=[user_private_role_id, another_role_id],
)
# TODO: Test removing users and roles
# Currently not possible because the API can only add users and roles
[docs] def test_update_only_admin(self):
group = self.test_create_valid()
group_id = group["id"]
response = self._put(f"groups/{group_id}")
self._assert_status_code_is(response, 403)
[docs] def test_update_duplicating_name_raises_409(self):
group_a = self.test_create_valid()
group_b = self.test_create_valid()
# Update group_b with the same name as group_a
group_b_id = group_b["id"]
updated_name = group_a["name"]
update_payload = {
"name": updated_name,
}
update_response = self._put(f"groups/{group_b_id}", data=update_payload, admin=True, json=True)
self._assert_status_code_is(update_response, 409)
[docs] def test_delete(self):
group = self.test_create_valid()
group_id = group["id"]
delete_response = self._delete(f"groups/{group_id}", admin=True)
self._assert_status_code_is_ok(delete_response)
[docs] def test_delete_duplicating_name_raises_409(self):
group = self.test_create_valid()
group_id = group["id"]
group_name = group["name"]
delete_response = self._delete(f"groups/{group_id}", admin=True)
self._assert_status_code_is_ok(delete_response)
# Create a new group with the same name as the deleted one is not allowed
payload = self._build_valid_group_payload(group_name)
response = self._post("groups", payload, admin=True, json=True)
self._assert_status_code_is(response, 409)
[docs] def test_purge(self):
group = self.test_create_valid()
group_id = group["id"]
# Delete and purge the group
delete_response = self._delete(f"groups/{group_id}", admin=True)
self._assert_status_code_is_ok(delete_response)
purge_response = self._post(f"groups/{group_id}/purge", admin=True)
self._assert_status_code_is_ok(purge_response)
# The group is deleted and purged, so it cannot be found
response = self._get(f"groups/{group_id}", admin=True)
self._assert_status_code_is(response, 404)
[docs] def test_purge_can_reuse_name(self):
group = self.test_create_valid()
group_id = group["id"]
group_name = group["name"]
# Delete and purge the group
delete_response = self._delete(f"groups/{group_id}", admin=True)
self._assert_status_code_is_ok(delete_response)
purge_response = self._post(f"groups/{group_id}/purge", admin=True)
self._assert_status_code_is_ok(purge_response)
# Create a new group with the same name as the deleted one is allowed
payload = self._build_valid_group_payload(group_name)
response = self._post("groups", payload, admin=True, json=True)
self._assert_status_code_is(response, 200)
def _assert_valid_group(self, group, assert_id=None):
self._assert_has_keys(group, "id", "name", "model_class", "url")
if assert_id is not None:
assert group["id"] == assert_id
def _assert_group_has_expected_values(self, group_id: str, name: str, user_ids: List[str], role_ids: List[str]):
group = self._get(f"groups/{group_id}", admin=True).json()
assert group["name"] == name
users = self._get(f"groups/{group_id}/users", admin=True).json()
assert len(users) == len(user_ids)
for user in users:
assert user["id"] in user_ids
roles = self._get(f"groups/{group_id}/roles", admin=True).json()
assert len(roles) == len(role_ids)
for role in roles:
assert role["id"] in role_ids
def _build_valid_group_payload(self, name: Optional[str] = None):
name = name or self.dataset_populator.get_random_name()
user_id = self.dataset_populator.user_id()
role_id = self.dataset_populator.user_private_role_id()
payload = {
"name": name,
"user_ids": [user_id],
"role_ids": [role_id],
}
return payload