mirror of
https://github.com/datahub-project/datahub.git
synced 2025-07-25 02:19:58 +00:00
174 lines
5.4 KiB
Python
174 lines
5.4 KiB
Python
import os
|
|
import time
|
|
|
|
import pytest
|
|
from requests.exceptions import HTTPError
|
|
|
|
from datahub.emitter.mcp import MetadataChangeProposalWrapper
|
|
from datahub.metadata.schema_classes import AuditStampClass, CorpUserStatusClass
|
|
from tests.utils import (
|
|
get_admin_credentials,
|
|
get_frontend_url,
|
|
login_as,
|
|
wait_for_writes_to_sync,
|
|
)
|
|
|
|
from .token_utils import getUserId, listUsers, removeUser
|
|
|
|
pytestmark = pytest.mark.no_cypress_suite1
|
|
|
|
# Disable telemetry
|
|
os.environ["DATAHUB_TELEMETRY_ENABLED"] = "false"
|
|
|
|
(admin_user, admin_pass) = get_admin_credentials()
|
|
user_urn = "urn:li:corpuser:sessionUser"
|
|
|
|
|
|
@pytest.fixture(scope="class")
|
|
def custom_user_session():
|
|
"""Fixture to execute setup before and tear down after all tests are run"""
|
|
admin_session = login_as(admin_user, admin_pass)
|
|
|
|
res_data = removeUser(admin_session, user_urn)
|
|
assert res_data
|
|
assert "error" not in res_data
|
|
|
|
# Test getting the invite token
|
|
get_invite_token_json = {
|
|
"query": """query getInviteToken($input: GetInviteTokenInput!) {
|
|
getInviteToken(input: $input){
|
|
inviteToken
|
|
}
|
|
}""",
|
|
"variables": {"input": {}},
|
|
}
|
|
|
|
get_invite_token_response = admin_session.post(
|
|
f"{get_frontend_url()}/api/v2/graphql", json=get_invite_token_json
|
|
)
|
|
get_invite_token_response.raise_for_status()
|
|
get_invite_token_res_data = get_invite_token_response.json()
|
|
|
|
assert get_invite_token_res_data
|
|
assert get_invite_token_res_data["data"]
|
|
invite_token = get_invite_token_res_data["data"]["getInviteToken"]["inviteToken"]
|
|
assert invite_token is not None
|
|
assert "error" not in invite_token
|
|
|
|
# Pass the invite token when creating the user
|
|
sign_up_json = {
|
|
"fullName": "Test Session User",
|
|
"email": "sessionUser",
|
|
"password": "sessionUser",
|
|
"title": "Date Engineer",
|
|
"inviteToken": invite_token,
|
|
}
|
|
|
|
sign_up_response = admin_session.post(
|
|
f"{get_frontend_url()}/signUp", json=sign_up_json
|
|
)
|
|
sign_up_response.raise_for_status()
|
|
assert sign_up_response
|
|
assert "error" not in sign_up_response
|
|
# Sleep for eventual consistency
|
|
wait_for_writes_to_sync()
|
|
|
|
# signUp will override the session cookie to the new user to be signed up.
|
|
admin_session.cookies.clear()
|
|
admin_session = login_as(admin_user, admin_pass)
|
|
|
|
# Make user created user is there.
|
|
res_data = listUsers(admin_session)
|
|
assert res_data["data"]
|
|
assert res_data["data"]["listUsers"]
|
|
assert {"username": "sessionUser"} in res_data["data"]["listUsers"]["users"]
|
|
|
|
yield login_as(sign_up_json["email"], sign_up_json["password"])
|
|
|
|
# Delete created user
|
|
res_data = removeUser(admin_session, user_urn)
|
|
assert res_data
|
|
assert res_data["data"]
|
|
assert res_data["data"]["removeUser"] is True
|
|
# Sleep for eventual consistency
|
|
wait_for_writes_to_sync()
|
|
|
|
# Make user created user is not there.
|
|
res_data = listUsers(admin_session)
|
|
assert res_data["data"]
|
|
assert res_data["data"]["listUsers"]
|
|
assert {"username": "sessionUser"} not in res_data["data"]["listUsers"]["users"]
|
|
|
|
|
|
@pytest.mark.dependency()
|
|
def test_soft_delete(graph_client, custom_user_session):
|
|
# assert initial access
|
|
assert getUserId(custom_user_session) == {"urn": user_urn}
|
|
|
|
graph_client.soft_delete_entity(urn=user_urn)
|
|
wait_for_writes_to_sync()
|
|
|
|
with pytest.raises(HTTPError) as req_info:
|
|
getUserId(custom_user_session)
|
|
assert "403 Client Error: Forbidden" in str(req_info.value)
|
|
|
|
# undo soft delete
|
|
graph_client.set_soft_delete_status(urn=user_urn, delete=False)
|
|
wait_for_writes_to_sync()
|
|
|
|
|
|
@pytest.mark.dependency(depends=["test_soft_delete"])
|
|
def test_suspend(graph_client, custom_user_session):
|
|
# assert initial access
|
|
assert getUserId(custom_user_session) == {"urn": user_urn}
|
|
|
|
graph_client.emit(
|
|
MetadataChangeProposalWrapper(
|
|
entityType="corpuser",
|
|
entityUrn=user_urn,
|
|
changeType="UPSERT",
|
|
aspectName="corpUserStatus",
|
|
aspect=CorpUserStatusClass(
|
|
status="SUSPENDED",
|
|
lastModified=AuditStampClass(
|
|
time=int(time.time() * 1000.0), actor="urn:li:corpuser:unknown"
|
|
),
|
|
),
|
|
)
|
|
)
|
|
wait_for_writes_to_sync()
|
|
|
|
with pytest.raises(HTTPError) as req_info:
|
|
getUserId(custom_user_session)
|
|
assert "403 Client Error: Forbidden" in str(req_info.value)
|
|
|
|
# undo suspend
|
|
graph_client.emit(
|
|
MetadataChangeProposalWrapper(
|
|
entityType="corpuser",
|
|
entityUrn=user_urn,
|
|
changeType="UPSERT",
|
|
aspectName="corpUserStatus",
|
|
aspect=CorpUserStatusClass(
|
|
status="ACTIVE",
|
|
lastModified=AuditStampClass(
|
|
time=int(time.time() * 1000.0), actor="urn:li:corpuser:unknown"
|
|
),
|
|
),
|
|
)
|
|
)
|
|
wait_for_writes_to_sync()
|
|
|
|
|
|
@pytest.mark.dependency(depends=["test_suspend"])
|
|
def test_hard_delete(graph_client, custom_user_session):
|
|
# assert initial access
|
|
assert getUserId(custom_user_session) == {"urn": user_urn}
|
|
|
|
graph_client.hard_delete_entity(urn=user_urn)
|
|
wait_for_writes_to_sync()
|
|
|
|
with pytest.raises(HTTPError) as req_info:
|
|
getUserId(custom_user_session)
|
|
assert "403 Client Error: Forbidden" in str(req_info.value)
|