2022-02-01 11:07:34 -08:00
|
|
|
import pytest
|
2023-10-10 16:08:34 +05:30
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
from tests.utils import delete_urns_from_file, ingest_file_via_rest
|
2022-06-30 16:00:50 +05:30
|
|
|
|
2022-02-01 11:07:34 -08:00
|
|
|
|
|
|
|
@pytest.fixture(scope="module", autouse=False)
|
2024-09-27 11:31:25 -05:00
|
|
|
def ingest_cleanup_data(auth_session, graph_client, request):
|
2022-02-01 11:07:34 -08:00
|
|
|
print("ingesting containers test data")
|
2024-09-27 11:31:25 -05:00
|
|
|
ingest_file_via_rest(auth_session, "tests/containers/data.json")
|
2022-02-01 11:07:34 -08:00
|
|
|
yield
|
|
|
|
print("removing containers test data")
|
2024-09-27 11:31:25 -05:00
|
|
|
delete_urns_from_file(graph_client, "tests/containers/data.json")
|
2022-02-01 11:07:34 -08:00
|
|
|
|
2022-06-30 16:00:50 +05:30
|
|
|
|
2022-02-01 11:07:34 -08:00
|
|
|
@pytest.mark.dependency()
|
2024-09-27 11:31:25 -05:00
|
|
|
def test_get_full_container(auth_session, ingest_cleanup_data):
|
2022-02-01 11:07:34 -08:00
|
|
|
container_urn = "urn:li:container:SCHEMA"
|
|
|
|
container_name = "datahub_schema"
|
|
|
|
container_description = "The DataHub schema"
|
|
|
|
editable_container_description = "custom description"
|
|
|
|
|
|
|
|
# Get a full container
|
|
|
|
get_container_json = {
|
|
|
|
"query": """query container($urn: String!) {\n
|
|
|
|
container(urn: $urn) {\n
|
|
|
|
urn\n
|
|
|
|
type\n
|
|
|
|
platform {\n
|
|
|
|
urn\n
|
|
|
|
properties{\n
|
|
|
|
displayName\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
container {\n
|
|
|
|
urn\n
|
|
|
|
properties {\n
|
|
|
|
name\n
|
|
|
|
description\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
properties {\n
|
|
|
|
name\n
|
|
|
|
description\n
|
|
|
|
}\n
|
|
|
|
editableProperties {\n
|
|
|
|
description\n
|
|
|
|
}\n
|
|
|
|
ownership {\n
|
|
|
|
owners {\n
|
|
|
|
owner {\n
|
|
|
|
...on CorpUser {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
institutionalMemory {\n
|
|
|
|
elements {\n
|
|
|
|
url\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
tags {\n
|
|
|
|
tags {\n
|
|
|
|
tag {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
glossaryTerms {\n
|
|
|
|
terms {\n
|
|
|
|
term {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
subTypes {\n
|
|
|
|
typeNames\n
|
|
|
|
}\n
|
|
|
|
entities(input: {}) {\n
|
|
|
|
total\n
|
|
|
|
searchResults {\n
|
|
|
|
entity {\n
|
|
|
|
...on Dataset {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}""",
|
2022-06-30 16:00:50 +05:30
|
|
|
"variables": {"urn": container_urn},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=get_container_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["container"] is not None
|
|
|
|
assert "errors" not in res_data
|
|
|
|
|
|
|
|
container = res_data["data"]["container"]
|
|
|
|
assert container["urn"] == container_urn
|
|
|
|
assert container["type"] == "CONTAINER"
|
|
|
|
assert container["platform"]["urn"] == "urn:li:dataPlatform:mysql"
|
|
|
|
assert container["properties"]["name"] == container_name
|
|
|
|
assert container["properties"]["description"] == container_description
|
|
|
|
assert container["subTypes"]["typeNames"][0] == "Schema"
|
2022-06-30 16:00:50 +05:30
|
|
|
assert (
|
|
|
|
container["editableProperties"]["description"] == editable_container_description
|
|
|
|
)
|
2022-02-01 11:07:34 -08:00
|
|
|
assert container["ownership"] is None
|
|
|
|
assert container["institutionalMemory"] is None
|
|
|
|
assert container["tags"] is None
|
|
|
|
assert container["glossaryTerms"] is None
|
|
|
|
|
2022-06-30 16:00:50 +05:30
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
@pytest.mark.dependency(depends=["test_get_full_container"])
|
|
|
|
def test_get_parent_container(auth_session):
|
2022-02-01 11:07:34 -08:00
|
|
|
dataset_urn = "urn:li:dataset:(urn:li:dataPlatform:hive,SampleHiveDataset,PROD)"
|
|
|
|
|
|
|
|
# Get count of existing secrets
|
|
|
|
get_dataset_json = {
|
|
|
|
"query": """query dataset($urn: String!) {\n
|
|
|
|
dataset(urn: $urn) {\n
|
|
|
|
urn\n
|
|
|
|
container {\n
|
|
|
|
urn\n
|
|
|
|
properties {\n
|
|
|
|
name\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}""",
|
2022-06-30 16:00:50 +05:30
|
|
|
"variables": {"urn": dataset_urn},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=get_dataset_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["dataset"] is not None
|
|
|
|
assert "errors" not in res_data
|
|
|
|
|
|
|
|
dataset = res_data["data"]["dataset"]
|
|
|
|
assert dataset["container"]["properties"]["name"] == "datahub_schema"
|
|
|
|
|
2022-06-30 16:00:50 +05:30
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
@pytest.mark.dependency(depends=["test_get_full_container"])
|
|
|
|
def test_update_container(auth_session):
|
2022-02-01 11:07:34 -08:00
|
|
|
container_urn = "urn:li:container:SCHEMA"
|
|
|
|
|
|
|
|
new_tag = "urn:li:tag:Test"
|
|
|
|
|
|
|
|
add_tag_json = {
|
|
|
|
"query": """mutation addTag($input: TagAssociationInput!) {\n
|
|
|
|
addTag(input: $input)
|
|
|
|
}""",
|
|
|
|
"variables": {
|
|
|
|
"input": {
|
2022-06-30 16:00:50 +05:30
|
|
|
"tagUrn": new_tag,
|
|
|
|
"resourceUrn": container_urn,
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
2022-06-30 16:00:50 +05:30
|
|
|
},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=add_tag_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["addTag"] is True
|
|
|
|
|
|
|
|
new_term = "urn:li:glossaryTerm:Term"
|
|
|
|
|
|
|
|
add_term_json = {
|
|
|
|
"query": """mutation addTerm($input: TermAssociationInput!) {\n
|
|
|
|
addTerm(input: $input)
|
|
|
|
}""",
|
|
|
|
"variables": {
|
|
|
|
"input": {
|
2022-06-30 16:00:50 +05:30
|
|
|
"termUrn": new_term,
|
|
|
|
"resourceUrn": container_urn,
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
2022-06-30 16:00:50 +05:30
|
|
|
},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=add_term_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["addTerm"] is True
|
|
|
|
|
|
|
|
new_owner = "urn:li:corpuser:jdoe"
|
|
|
|
|
|
|
|
add_owner_json = {
|
|
|
|
"query": """mutation addOwner($input: AddOwnerInput!) {\n
|
|
|
|
addOwner(input: $input)
|
|
|
|
}""",
|
|
|
|
"variables": {
|
|
|
|
"input": {
|
2022-06-30 16:00:50 +05:30
|
|
|
"ownerUrn": new_owner,
|
|
|
|
"resourceUrn": container_urn,
|
|
|
|
"ownerEntityType": "CORP_USER",
|
2024-01-31 14:42:40 +05:30
|
|
|
"ownershipTypeUrn": "urn:li:ownershipType:__system__technical_owner",
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
2022-06-30 16:00:50 +05:30
|
|
|
},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=add_owner_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["addOwner"] is True
|
|
|
|
|
|
|
|
new_link = "https://www.test.com"
|
|
|
|
|
|
|
|
add_link_json = {
|
|
|
|
"query": """mutation addLink($input: AddLinkInput!) {\n
|
|
|
|
addLink(input: $input)
|
|
|
|
}""",
|
|
|
|
"variables": {
|
|
|
|
"input": {
|
2022-06-30 16:00:50 +05:30
|
|
|
"linkUrl": new_link,
|
|
|
|
"resourceUrn": container_urn,
|
|
|
|
"label": "Label",
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
2022-06-30 16:00:50 +05:30
|
|
|
},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=add_link_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["addLink"] is True
|
|
|
|
|
|
|
|
new_description = "New description"
|
|
|
|
|
|
|
|
update_description_json = {
|
|
|
|
"query": """mutation updateDescription($input: DescriptionUpdateInput!) {\n
|
|
|
|
updateDescription(input: $input)
|
|
|
|
}""",
|
|
|
|
"variables": {
|
|
|
|
"input": {
|
2022-06-30 16:00:50 +05:30
|
|
|
"description": new_description,
|
|
|
|
"resourceUrn": container_urn,
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
2022-06-30 16:00:50 +05:30
|
|
|
},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=update_description_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["updateDescription"] is True
|
|
|
|
|
|
|
|
# Now fetch the container to ensure it was updated
|
2022-06-30 16:00:50 +05:30
|
|
|
# Get the container
|
2022-02-01 11:07:34 -08:00
|
|
|
get_container_json = {
|
|
|
|
"query": """query container($urn: String!) {\n
|
|
|
|
container(urn: $urn) {\n
|
|
|
|
editableProperties {\n
|
|
|
|
description\n
|
|
|
|
}\n
|
|
|
|
ownership {\n
|
|
|
|
owners {\n
|
|
|
|
owner {\n
|
|
|
|
...on CorpUser {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
institutionalMemory {\n
|
|
|
|
elements {\n
|
|
|
|
url\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
tags {\n
|
|
|
|
tags {\n
|
|
|
|
tag {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
glossaryTerms {\n
|
|
|
|
terms {\n
|
|
|
|
term {\n
|
|
|
|
urn\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}\n
|
|
|
|
}""",
|
2022-06-30 16:00:50 +05:30
|
|
|
"variables": {"urn": container_urn},
|
2022-02-01 11:07:34 -08:00
|
|
|
}
|
|
|
|
|
2024-09-27 11:31:25 -05:00
|
|
|
response = auth_session.post(
|
|
|
|
f"{auth_session.frontend_url()}/api/v2/graphql", json=get_container_json
|
2022-02-01 11:07:34 -08:00
|
|
|
)
|
|
|
|
response.raise_for_status()
|
|
|
|
res_data = response.json()
|
|
|
|
|
|
|
|
assert res_data
|
|
|
|
assert res_data["data"]
|
|
|
|
assert res_data["data"]["container"] is not None
|
|
|
|
assert "errors" not in res_data
|
|
|
|
|
|
|
|
container = res_data["data"]["container"]
|
|
|
|
assert container["editableProperties"]["description"] == new_description
|
|
|
|
assert container["ownership"]["owners"][0]["owner"]["urn"] == new_owner
|
|
|
|
assert container["institutionalMemory"]["elements"][0]["url"] == new_link
|
|
|
|
assert container["tags"]["tags"][0]["tag"]["urn"] == new_tag
|
2022-06-30 16:00:50 +05:30
|
|
|
assert container["glossaryTerms"]["terms"][0]["term"]["urn"] == new_term
|