|
6 | 6 |
|
7 | 7 | from collections.abc import AsyncIterator |
8 | 8 | from contextlib import AsyncExitStack |
| 9 | +from typing import AsyncIterable |
9 | 10 |
|
10 | 11 | import pytest |
11 | 12 | from aiohttp.test_utils import TestClient |
12 | 13 | from faker import Faker |
13 | 14 | from models_library.api_schemas_webserver.groups import GroupGet, GroupUserGet |
14 | 15 | from models_library.groups import AccessRightsDict, Group, StandardGroupCreate |
| 16 | +from pydantic import TypeAdapter |
15 | 17 | from pytest_simcore.helpers.assert_checks import assert_status |
16 | 18 | from pytest_simcore.helpers.webserver_login import LoggedUser, NewUser, UserInfoDict |
17 | 19 | from pytest_simcore.helpers.webserver_parametrizations import ( |
18 | 20 | ExpectedResponse, |
19 | 21 | standard_role_response, |
20 | 22 | ) |
21 | 23 | from servicelib.aiohttp import status |
| 24 | +from servicelib.status_codes_utils import is_2xx_success |
22 | 25 | from simcore_postgres_database.models.users import UserRole |
23 | 26 | from simcore_service_webserver._meta import API_VTAG |
24 | 27 | from simcore_service_webserver.groups._groups_api import ( |
@@ -514,3 +517,96 @@ async def test_adding_user_to_group_with_upper_case_email( |
514 | 517 |
|
515 | 518 | assert not data |
516 | 519 | assert not error |
| 520 | + |
| 521 | + |
| 522 | +@pytest.fixture |
| 523 | +async def other_user( |
| 524 | + client: TestClient, logged_user: UserInfoDict, is_private_user: bool |
| 525 | +) -> AsyncIterable[UserInfoDict]: |
| 526 | + # new user different from logged_user |
| 527 | + async with NewUser( |
| 528 | + { |
| 529 | + "name": f"other_than_{logged_user['name']}", |
| 530 | + "role": "USER", |
| 531 | + "privacy_hide_email": is_private_user, |
| 532 | + }, |
| 533 | + client.app, |
| 534 | + ) as user: |
| 535 | + yield user |
| 536 | + |
| 537 | + |
| 538 | +@pytest.mark.acceptance_test( |
| 539 | + "https://github.com/ITISFoundation/osparc-simcore/pull/6917" |
| 540 | +) |
| 541 | +@pytest.mark.parametrize("user_role", [UserRole.USER]) |
| 542 | +@pytest.mark.parametrize("is_private_user", [True, False]) |
| 543 | +@pytest.mark.parametrize("add_user_by", ["user_email", "user_id", "user_name"]) |
| 544 | +async def test_create_organization_and_add_users( |
| 545 | + client: TestClient, |
| 546 | + user_role: UserRole, |
| 547 | + logged_user: UserInfoDict, |
| 548 | + other_user: UserInfoDict, |
| 549 | + is_private_user: bool, |
| 550 | + add_user_by: str, |
| 551 | +): |
| 552 | + assert client.app |
| 553 | + assert logged_user["id"] != 0 |
| 554 | + assert logged_user["role"] == user_role.value |
| 555 | + |
| 556 | + # CREATE GROUP |
| 557 | + url = client.app.router["create_group"].url_for() |
| 558 | + resp = await client.post( |
| 559 | + f"{url}", |
| 560 | + json={ |
| 561 | + "label": "Amies sans-frontiers", |
| 562 | + "description": "A desperate attempt to make some friends", |
| 563 | + }, |
| 564 | + ) |
| 565 | + data, error = await assert_status(resp, status.HTTP_201_CREATED) |
| 566 | + |
| 567 | + assert not error |
| 568 | + group = GroupGet.model_validate(data) |
| 569 | + |
| 570 | + # i have another user |
| 571 | + user_id = other_user["id"] |
| 572 | + user_name = other_user["name"] |
| 573 | + user_email = other_user["email"] |
| 574 | + |
| 575 | + assert user_id != logged_user["id"] |
| 576 | + assert user_name != logged_user["name"] |
| 577 | + assert user_email != logged_user["email"] |
| 578 | + |
| 579 | + # ADD new user to GROUP |
| 580 | + url = client.app.router["add_group_user"].url_for(gid=f"{group.gid}") |
| 581 | + |
| 582 | + expected_status = status.HTTP_204_NO_CONTENT |
| 583 | + match add_user_by: |
| 584 | + case "user_email": |
| 585 | + param = {"email": user_email} |
| 586 | + if is_private_user: |
| 587 | + expected_status = status.HTTP_404_NOT_FOUND |
| 588 | + case "user_id": |
| 589 | + param = {"uid": user_id} |
| 590 | + case "user_name": |
| 591 | + param = {"userName": user_name} |
| 592 | + case _: |
| 593 | + pytest.fail(reason=f"parameter {add_user_by} was not accounted for") |
| 594 | + |
| 595 | + response = await client.post(f"{url}", json=param) |
| 596 | + await assert_status(response, expected_status) |
| 597 | + |
| 598 | + # LIST USERS in GROUP |
| 599 | + url = client.app.router["get_all_group_users"].url_for(gid=f"{group.gid}") |
| 600 | + response = await client.get(f"{url}") |
| 601 | + data, _ = await assert_status(response, status.HTTP_200_OK) |
| 602 | + |
| 603 | + group_members = TypeAdapter(list[GroupUserGet]).validate_python(data) |
| 604 | + if is_2xx_success(expected_status): |
| 605 | + assert user_id in [ |
| 606 | + u.id for u in group_members |
| 607 | + ], "failed to add other-user to the group!" |
| 608 | + |
| 609 | + # DELETE GROUP |
| 610 | + url = client.app.router["delete_group"].url_for(gid=f"{group.gid}") |
| 611 | + resp = await client.delete(f"{url}") |
| 612 | + await assert_status(resp, status.HTTP_204_NO_CONTENT) |
0 commit comments