diff --git a/tests/app/v1/routers/test_groups.py b/tests/app/v1/routers/test_groups.py
index c0d969495e8ee7d442fe29d3753ed41da2240eff..e444152d2e450e27bd0df8ad94132cb7775f5bf3 100644
--- a/tests/app/v1/routers/test_groups.py
+++ b/tests/app/v1/routers/test_groups.py
@@ -38,7 +38,7 @@ def test_get_groups(
     assert_response(response, expected_status_code)
 
     groups = UserGroups.parse_raw(response.content)
-    for group, ex_group in zip(groups.data, user_groups_module):
+    for group, ex_group in zip(groups.data, user_groups_module.values()):
         ex_group = UserGroup.from_orm(ex_group)
         assert group == ex_group
 
diff --git a/tests/app/v1/routers/uploads/common.py b/tests/app/v1/routers/uploads/common.py
index c915b2189293a2bee34e0a7abb9b61f085abeb58..a3432721be44576bc738c3855ff0b581aea8040c 100644
--- a/tests/app/v1/routers/uploads/common.py
+++ b/tests/app/v1/routers/uploads/common.py
@@ -18,4 +18,4 @@ def assert_upload(response_json, **kwargs):
 
     for key, value in kwargs.items():
         assert data.get(key, None) == value
-    return data
\ No newline at end of file
+    return data
diff --git a/tests/app/v1/routers/uploads/test_group_uploads.py b/tests/app/v1/routers/uploads/test_group_uploads.py
index 74b35b8e14caf8bfd7fd5a2110108f169b9aad28..b1de5eba451bdaad280010c3df5355d1341d1758 100644
--- a/tests/app/v1/routers/uploads/test_group_uploads.py
+++ b/tests/app/v1/routers/uploads/test_group_uploads.py
@@ -1,7 +1,10 @@
 import pytest
-from ..common import assert_response, perform_get
+
+from nomad.processing.data import Upload
+from ..common import assert_response, perform_get, perform_post
 from .common import assert_upload
 
+
 @pytest.mark.parametrize(
     'kwargs',
     [
@@ -124,3 +127,65 @@ def test_get_group_upload(
     assert_response(response, expected_status_code)
     if expected_status_code == 200:
         assert_upload(response.json())
+
+
+@pytest.mark.parametrize(
+    'user, expected_status_code, group_quantity, new_groups',
+    [
+        pytest.param(
+            'test_user',
+            200,
+            'coauthor_groups',
+            ['other_owner_group'],
+            id='coauthor-other-group',
+        ),
+        pytest.param(
+            'test_user',
+            200,
+            'coauthor_groups',
+            ['user_owner_group', 'other_owner_group', 'mixed_group'],
+            id='coauthor-multiple-groups',
+        ),
+        pytest.param(
+            'test_user',
+            200,
+            'reviewer_groups',
+            ['other_owner_group'],
+            id='reviewer-other-group',
+        ),
+        pytest.param(
+            'other_test_user',
+            422,
+            'reviewer_groups',
+            ['other_owner_group'],
+            id='other-user-reviewer-other-group',
+        ),
+    ],
+)
+def test_add_groups_to_upload(
+    client,
+    user_groups_module,
+    proc_infra,
+    upload_no_group,
+    test_auth_dict,
+    user,
+    expected_status_code,
+    group_quantity,
+    new_groups,
+):
+    user_auth, __token = test_auth_dict[user]
+    upload_id = list(upload_no_group.uploads)[0]
+    new_group_ids = [user_groups_module[label].group_id for label in new_groups]
+
+    url = f'uploads/{upload_id}/edit'
+    metadata = {group_quantity: new_group_ids}
+    edit_request = dict(metadata=metadata)
+    response = perform_post(client, url, user_auth, json=edit_request)
+
+    assert_response(response, expected_status_code)
+    if expected_status_code != 200:
+        return
+
+    upload = Upload.get(upload_id)
+    upload.block_until_complete()
+    assert getattr(upload, group_quantity) == new_group_ids
diff --git a/tests/conftest.py b/tests/conftest.py
index 66975740b499843388816d44b9d941b79ee7bc57..845dcc3b7e1bde12db5b3c515a54d71f966f4934 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -531,10 +531,10 @@ def mixed_group():
 
 
 def _user_groups():
-    user_groups = []
-    for group in test_user_groups.values():
+    user_groups = {}
+    for label, group in test_user_groups.items():
         user_group = create_user_group(**group)
-        user_groups.append(user_group)
+        user_groups[label] = user_group
 
     return user_groups
 
@@ -1332,6 +1332,17 @@ def example_data_groups(
     data.save(with_files=False)
 
 
+@pytest.fixture(scope='function')
+def upload_no_group(mongo_function, test_user):
+    data = ExampleData(main_author=test_user)
+    data.create_upload(upload_id='id_no_group')
+    data.save()
+
+    yield data
+
+    data.delete()
+
+
 @pytest.fixture(scope='function')
 def example_datasets(mongo_function, test_user, other_test_user):
     dataset_specs = (