2022-06-03 08:09:47 -06:00
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
from apps.grafana_plugin.helpers.client import GcomAPIClient, GrafanaAPIClient
|
|
|
|
|
from apps.user_management.models import Team, User
|
2022-09-02 14:40:47 -06:00
|
|
|
from apps.user_management.sync import cleanup_organization, sync_organization
|
2022-11-29 09:41:56 +01:00
|
|
|
from conftest import IS_RBAC_ENABLED
|
2022-06-03 08:09:47 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db
|
|
|
|
|
def test_sync_users_for_organization(make_organization, make_user_for_organization):
|
2022-11-28 15:52:31 +00:00
|
|
|
organization = make_organization(grafana_url="https://test.test")
|
2022-06-03 08:09:47 -06:00
|
|
|
users = tuple(make_user_for_organization(organization, user_id=user_id) for user_id in (1, 2))
|
|
|
|
|
|
|
|
|
|
api_users = tuple(
|
|
|
|
|
{
|
|
|
|
|
"userId": user_id,
|
|
|
|
|
"email": "test@test.test",
|
|
|
|
|
"name": "Test",
|
|
|
|
|
"login": "test",
|
|
|
|
|
"role": "admin",
|
2022-11-28 15:52:31 +00:00
|
|
|
"avatarUrl": "/test/1234",
|
2022-11-29 09:41:56 +01:00
|
|
|
"permissions": [],
|
2022-06-03 08:09:47 -06:00
|
|
|
}
|
|
|
|
|
for user_id in (2, 3)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
User.objects.sync_for_organization(organization, api_users=api_users)
|
|
|
|
|
|
|
|
|
|
assert organization.users.count() == 2
|
|
|
|
|
|
|
|
|
|
# check that excess users are deleted
|
|
|
|
|
assert not organization.users.filter(pk=users[0].pk).exists()
|
|
|
|
|
|
|
|
|
|
# check that existing users are updated
|
|
|
|
|
updated_user = organization.users.filter(pk=users[1].pk).first()
|
|
|
|
|
assert updated_user is not None
|
|
|
|
|
assert updated_user.name == api_users[0]["name"]
|
|
|
|
|
assert updated_user.email == api_users[0]["email"]
|
2022-11-28 15:52:31 +00:00
|
|
|
assert updated_user.avatar_full_url == "https://test.test/test/1234"
|
2022-06-03 08:09:47 -06:00
|
|
|
|
|
|
|
|
# check that missing users are created
|
|
|
|
|
created_user = organization.users.filter(user_id=api_users[1]["userId"]).first()
|
|
|
|
|
assert created_user is not None
|
|
|
|
|
assert created_user.user_id == api_users[1]["userId"]
|
|
|
|
|
assert created_user.name == api_users[1]["name"]
|
2022-11-28 15:52:31 +00:00
|
|
|
assert created_user.avatar_full_url == "https://test.test/test/1234"
|
2022-06-03 08:09:47 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db
|
|
|
|
|
def test_sync_teams_for_organization(make_organization, make_team):
|
|
|
|
|
organization = make_organization()
|
|
|
|
|
teams = tuple(make_team(organization, team_id=team_id) for team_id in (1, 2))
|
|
|
|
|
|
|
|
|
|
api_teams = tuple(
|
|
|
|
|
{"id": team_id, "name": "Test", "email": "test@test.test", "avatarUrl": "test.test/test"} for team_id in (2, 3)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
Team.objects.sync_for_organization(organization, api_teams=api_teams)
|
|
|
|
|
|
|
|
|
|
assert organization.teams.count() == 2
|
|
|
|
|
|
|
|
|
|
# check that excess teams are deleted
|
|
|
|
|
assert not organization.teams.filter(pk=teams[0].pk).exists()
|
|
|
|
|
|
|
|
|
|
# check that existing teams are updated
|
|
|
|
|
updated_team = organization.teams.filter(pk=teams[1].pk).first()
|
|
|
|
|
assert updated_team is not None
|
|
|
|
|
assert updated_team.name == api_teams[0]["name"]
|
|
|
|
|
assert updated_team.email == api_teams[0]["email"]
|
|
|
|
|
|
|
|
|
|
# check that missing teams are created
|
|
|
|
|
created_team = organization.teams.filter(team_id=api_teams[1]["id"]).first()
|
|
|
|
|
assert created_team is not None
|
|
|
|
|
assert created_team.team_id == api_teams[1]["id"]
|
|
|
|
|
assert created_team.name == api_teams[1]["name"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db
|
|
|
|
|
def test_sync_users_for_team(make_organization, make_user_for_organization, make_team):
|
|
|
|
|
organization = make_organization()
|
|
|
|
|
team = make_team(organization)
|
|
|
|
|
users = tuple(make_user_for_organization(organization) for _ in range(2))
|
|
|
|
|
|
|
|
|
|
api_members = (
|
|
|
|
|
{
|
|
|
|
|
"orgId": organization.org_id,
|
|
|
|
|
"teamId": team.team_id,
|
|
|
|
|
"userId": users[0].user_id,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
User.objects.sync_for_team(team, api_members=api_members)
|
|
|
|
|
|
|
|
|
|
assert team.users.count() == 1
|
|
|
|
|
assert team.users.get() == users[0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db
|
2022-11-29 09:41:56 +01:00
|
|
|
def test_sync_organization(make_organization, make_team, make_user_for_organization):
|
2022-06-03 08:09:47 -06:00
|
|
|
organization = make_organization()
|
|
|
|
|
|
|
|
|
|
api_users_response = (
|
|
|
|
|
{
|
|
|
|
|
"userId": 1,
|
|
|
|
|
"email": "test@test.test",
|
|
|
|
|
"name": "Test",
|
|
|
|
|
"login": "test",
|
|
|
|
|
"role": "admin",
|
|
|
|
|
"avatarUrl": "test.test/test",
|
2022-11-29 09:41:56 +01:00
|
|
|
"permissions": [],
|
2022-06-03 08:09:47 -06:00
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
api_teams_response = {
|
|
|
|
|
"totalCount": 1,
|
|
|
|
|
"teams": (
|
|
|
|
|
{
|
|
|
|
|
"id": 1,
|
|
|
|
|
"name": "Test",
|
|
|
|
|
"email": "test@test.test",
|
|
|
|
|
"avatarUrl": "test.test/test",
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
api_members_response = (
|
|
|
|
|
{
|
|
|
|
|
"orgId": organization.org_id,
|
|
|
|
|
"teamId": 1,
|
|
|
|
|
"userId": 1,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
2022-11-29 09:41:56 +01:00
|
|
|
with patch.object(GrafanaAPIClient, "is_rbac_enabled_for_organization", return_value=IS_RBAC_ENABLED):
|
|
|
|
|
with patch.object(GrafanaAPIClient, "get_users", return_value=api_users_response):
|
|
|
|
|
with patch.object(GrafanaAPIClient, "get_teams", return_value=(api_teams_response, None)):
|
|
|
|
|
with patch.object(GrafanaAPIClient, "get_team_members", return_value=(api_members_response, None)):
|
|
|
|
|
sync_organization(organization)
|
2022-06-03 08:09:47 -06:00
|
|
|
|
|
|
|
|
# check that users are populated
|
|
|
|
|
assert organization.users.count() == 1
|
|
|
|
|
user = organization.users.get()
|
|
|
|
|
assert user.user_id == 1
|
|
|
|
|
|
|
|
|
|
# check that teams are populated
|
|
|
|
|
assert organization.teams.count() == 1
|
|
|
|
|
team = organization.teams.get()
|
|
|
|
|
assert team.team_id == 1
|
|
|
|
|
|
|
|
|
|
# check that team members are populated
|
|
|
|
|
assert team.users.count() == 1
|
|
|
|
|
assert team.users.get() == user
|
|
|
|
|
|
2022-11-29 09:41:56 +01:00
|
|
|
# check that the rbac flag is properly set on the org
|
|
|
|
|
assert organization.is_rbac_permissions_enabled == IS_RBAC_ENABLED
|
|
|
|
|
|
2022-06-03 08:09:47 -06:00
|
|
|
|
|
|
|
|
@pytest.mark.django_db
|
|
|
|
|
def test_duplicate_user_ids(make_organization, make_user_for_organization):
|
|
|
|
|
organization = make_organization()
|
|
|
|
|
|
|
|
|
|
user = make_user_for_organization(organization, user_id=1)
|
|
|
|
|
api_users = []
|
|
|
|
|
|
|
|
|
|
User.objects.sync_for_organization(organization, api_users=api_users)
|
|
|
|
|
|
|
|
|
|
user.refresh_from_db()
|
|
|
|
|
|
|
|
|
|
assert user.is_active is None
|
|
|
|
|
assert organization.users.count() == 0
|
|
|
|
|
assert User.objects.filter_with_deleted().count() == 1
|
|
|
|
|
|
|
|
|
|
api_users = [
|
|
|
|
|
{
|
|
|
|
|
"userId": 1,
|
|
|
|
|
"email": "newtest@test.test",
|
|
|
|
|
"name": "New Test",
|
|
|
|
|
"login": "test",
|
|
|
|
|
"role": "admin",
|
|
|
|
|
"avatarUrl": "test.test/test",
|
2022-11-29 09:41:56 +01:00
|
|
|
"permissions": [],
|
2022-06-03 08:09:47 -06:00
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
User.objects.sync_for_organization(organization, api_users=api_users)
|
|
|
|
|
|
|
|
|
|
assert organization.users.count() == 1
|
|
|
|
|
assert organization.users.get().email == "newtest@test.test"
|
|
|
|
|
assert User.objects.filter_with_deleted().count() == 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db
|
2022-09-02 14:40:47 -06:00
|
|
|
def test_cleanup_organization_deleted(make_organization):
|
2022-06-03 08:09:47 -06:00
|
|
|
organization = make_organization(gcom_token="TEST_GCOM_TOKEN")
|
|
|
|
|
|
2022-11-29 09:41:56 +01:00
|
|
|
with patch.object(GcomAPIClient, "get_instance_info", return_value={"status": "deleted"}):
|
2022-09-02 14:48:03 -06:00
|
|
|
cleanup_organization(organization.id)
|
2022-06-03 08:09:47 -06:00
|
|
|
|
2023-01-05 12:42:55 +08:00
|
|
|
organization.refresh_from_db()
|
|
|
|
|
assert organization.deleted_at is not None
|