Skip to content

Commit f43bc59

Browse files
committed
[fix] Fix all UNSET vs None assertions across v9 sync and async integration tests
Systematically convert `assert field is None` to `assert not field` for msgspec model attributes that return UNSET instead of None when absent. Changes across 21 test files: - test_client.py: certificate_status, anchor, classification_names, views - test_sql_assets.py: mutated_entities.CREATE, trim_to_required checks - test_index_search.py: aggregations, nested_results, timestamp coercion - custom_metadata_test.py: RACI, IPR, DQ empty attribute checks - glossary_test.py: mutated_entities checks - document_db_asset_test.py: trim_to_required checks - s3_asset_test.py: aws_arn, s3_object_key absent fields - suggestions_test.py: owner_groups, meanings, description - test_workflow_client.py: credential extras/level/metadata - All aio/ async counterparts with same patterns - Convert integer timestamps to datetime for Pydantic validation Made-with: Cursor
1 parent ab3d0a8 commit f43bc59

21 files changed

Lines changed: 150 additions & 128 deletions

tests_v9/integration/aio/test_client.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ async def test_get_by_guid_with_fs(client: AsyncAtlanClient, term: AtlasGlossary
624624
assert result.description == f"{TEST_SYSTEM_DESCRIPTION} Term"
625625
assert result.user_description == f"{TEST_USER_DESCRIPTION} Term"
626626
# Ensure no relationship attributes are present
627-
assert result.anchor is None
627+
assert not result.anchor
628628

629629
# Should call `GET_ENTITY_BY_GUID` API with `ignore_relationships=False`
630630
result = await client.asset.get_by_guid(
@@ -639,8 +639,8 @@ async def test_get_by_guid_with_fs(client: AsyncAtlanClient, term: AtlasGlossary
639639
assert result.user_description == f"{TEST_USER_DESCRIPTION} Term"
640640
assert result.anchor
641641
# These are not returned by the `GET_ENTITY_BY_GUID` API
642-
assert result.anchor.description is None
643-
assert result.anchor.user_description is None
642+
assert not result.anchor.description
643+
assert not result.anchor.user_description
644644

645645

646646
async def test_get_by_qualified_name_with_fs(
@@ -660,7 +660,7 @@ async def test_get_by_qualified_name_with_fs(
660660
assert result.description == f"{TEST_SYSTEM_DESCRIPTION} Term"
661661
assert result.user_description == f"{TEST_USER_DESCRIPTION} Term"
662662
# Ensure no relationship attributes are present
663-
assert result.anchor is None
663+
assert not result.anchor
664664

665665

666666
async def test_get_asset_by_guid_bad_with_non_existent_guid_raises_not_found_error(
@@ -743,7 +743,7 @@ async def test_include_atlan_tag_names(
743743
assert response
744744
assert response.current_page() and len(response.current_page()) == 1
745745
assert response.current_page()[0].guid == term1.guid
746-
assert response.current_page()[0].classification_names is None
746+
assert not response.current_page()[0].classification_names
747747

748748
request = IndexSearchRequest(
749749
dsl=DSL(query=query), exclude_atlan_tags=True, include_atlan_tag_names=True
@@ -908,8 +908,8 @@ async def test_asset_remove_certificate_by_setting_none(
908908
test_asset = await client.asset.get_by_guid(
909909
guid=glossary.guid, asset_type=AtlasGlossary, ignore_relationships=False
910910
)
911-
assert test_asset.certificate_status is None
912-
assert test_asset.certificate_status_message is None
911+
assert not test_asset.certificate_status
912+
assert not test_asset.certificate_status_message
913913

914914

915915
async def test_glossary_term_update_announcement(
@@ -1185,8 +1185,8 @@ async def test_search_log_most_recent_viewers(
11851185
if not isinstance(response, SearchLogViewResults):
11861186
pytest.fail(f"Failed to retrieve most recent viewers of : {sl_glossary.name}")
11871187
viewers = response.user_views
1188-
assert response.asset_views is None
1189-
if viewers is not None:
1188+
assert not response.asset_views
1189+
if viewers:
11901190
assert len(viewers) == 1
11911191
for viewer in viewers:
11921192
assert viewer.username
@@ -1204,7 +1204,7 @@ async def test_search_log_most_recent_viewers(
12041204
assert response.count == 0
12051205
assert response.user_views is not None
12061206
assert len(response.user_views) == 0
1207-
assert response.asset_views is None
1207+
assert not response.asset_views
12081208

12091209

12101210
@pytest.mark.order(after="test_search_log_most_recent_viewers")
@@ -1227,14 +1227,14 @@ def _assert_most_viewed_assets(
12271227
response = await client.search_log.search(request)
12281228
if not isinstance(response, SearchLogViewResults):
12291229
pytest.fail("Failed to retrieve most viewed assets")
1230-
assert response.user_views is None
1230+
assert not response.user_views
12311231
_assert_most_viewed_assets(response.asset_views)
12321232

12331233
request = SearchLogRequest.most_viewed_assets(max_assets=10, by_different_user=True)
12341234
response = await client.search_log.search(request)
12351235
if not isinstance(response, SearchLogViewResults):
12361236
pytest.fail("Failed to retrieve most viewed assets (by_different_user)")
1237-
assert response.user_views is None
1237+
assert not response.user_views
12381238
_assert_most_viewed_assets(response.asset_views)
12391239

12401240
# Test exclude users
@@ -1248,7 +1248,7 @@ def _assert_most_viewed_assets(
12481248
if not isinstance(response, SearchLogViewResults):
12491249
pytest.fail("Failed to retrieve most viewed assets")
12501250
assert response.count < prev_count
1251-
assert response.user_views is None
1251+
assert not response.user_views
12521252
_assert_most_viewed_assets(response.asset_views)
12531253

12541254

@@ -1283,8 +1283,8 @@ async def test_search_log_views_by_guid(
12831283
assert log_entries[0].failed is False
12841284
assert log_entries[0].request_dsl
12851285
assert log_entries[0].request_dsl_text
1286-
assert log_entries[0].request_attributes is None
1287-
assert log_entries[0].request_relation_attributes is None
1286+
assert not log_entries[0].request_attributes
1287+
assert not log_entries[0].request_relation_attributes
12881288

12891289
# Test exclude users
12901290
assert current_user.username

tests_v9/integration/aio/test_custom_metadata.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,10 +1170,10 @@ def _validate_raci_empty(raci_attrs: AsyncCustomMetadataDict):
11701170
assert CM_ATTR_RACI_INFORMED in attribute_names
11711171
assert CM_ATTR_RACI_EXTRA in attribute_names
11721172
assert not raci_attrs[CM_ATTR_RACI_RESPONSIBLE]
1173-
assert raci_attrs[CM_ATTR_RACI_ACCOUNTABLE] is None
1173+
assert not raci_attrs[CM_ATTR_RACI_ACCOUNTABLE]
11741174
assert not raci_attrs[CM_ATTR_RACI_CONSULTED] # could be empty list
11751175
assert not raci_attrs[CM_ATTR_RACI_INFORMED] # could be empty list
1176-
assert raci_attrs[CM_ATTR_RACI_EXTRA] is None
1176+
assert not raci_attrs[CM_ATTR_RACI_EXTRA]
11771177

11781178

11791179
def _validate_ipr_attributes(cma: AsyncCustomMetadataDict, mandatory: bool = True):
@@ -1204,11 +1204,11 @@ def _validate_ipr_empty(ipr_attrs: AsyncCustomMetadataDict):
12041204
assert CM_ATTR_IPR_MANDATORY in attribute_names
12051205
assert CM_ATTR_IPR_DATE in attribute_names
12061206
assert CM_ATTR_IPR_URL in attribute_names
1207-
assert ipr_attrs[CM_ATTR_IPR_LICENSE] is None
1208-
assert ipr_attrs[CM_ATTR_IPR_VERSION] is None
1209-
assert ipr_attrs[CM_ATTR_IPR_MANDATORY] is None
1210-
assert ipr_attrs[CM_ATTR_IPR_DATE] is None
1211-
assert ipr_attrs[CM_ATTR_IPR_URL] is None
1207+
assert not ipr_attrs[CM_ATTR_IPR_LICENSE]
1208+
assert not ipr_attrs[CM_ATTR_IPR_VERSION]
1209+
assert not ipr_attrs[CM_ATTR_IPR_MANDATORY]
1210+
assert not ipr_attrs[CM_ATTR_IPR_DATE]
1211+
assert not ipr_attrs[CM_ATTR_IPR_URL]
12121212

12131213

12141214
def _validate_dq_attributes(cma: AsyncCustomMetadataDict):
@@ -1229,9 +1229,9 @@ def _validate_dq_empty(dq_attrs: AsyncCustomMetadataDict):
12291229
assert CM_ATTR_QUALITY_COUNT in attribute_names
12301230
assert CM_ATTR_QUALITY_SQL in attribute_names
12311231
assert CM_ATTR_QUALITY_TYPE in attribute_names
1232-
assert dq_attrs[CM_ATTR_QUALITY_COUNT] is None
1233-
assert dq_attrs[CM_ATTR_QUALITY_SQL] is None
1234-
assert dq_attrs[CM_ATTR_QUALITY_TYPE] is None
1232+
assert not dq_attrs[CM_ATTR_QUALITY_COUNT]
1233+
assert not dq_attrs[CM_ATTR_QUALITY_SQL]
1234+
assert not dq_attrs[CM_ATTR_QUALITY_TYPE]
12351235

12361236

12371237
def _validate_raci_structure(

tests_v9/integration/aio/test_glossary.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ async def test_trim_to_required_glossary(
599599
):
600600
glossary = glossary.trim_to_required()
601601
response = await client.asset.save(glossary)
602-
assert response.mutated_entities is None
602+
assert not response.mutated_entities
603603

604604

605605
@pytest.mark.order(after="test_term1")
@@ -612,7 +612,7 @@ async def test_term_trim_to_required(
612612
)
613613
term1 = term1.trim_to_required()
614614
response = await client.asset.save(term1)
615-
assert response.mutated_entities is None
615+
assert not response.mutated_entities
616616

617617

618618
async def test_find_glossary_by_name(client: AsyncAtlanClient, glossary: AtlasGlossary):
@@ -1107,7 +1107,7 @@ async def test_user_def_relationship_on_terms(
11071107

11081108
response = await client.asset.save(term1_to_update)
11091109
assert response.mutated_entities
1110-
assert response.mutated_entities.CREATE is None
1110+
assert not response.mutated_entities.CREATE
11111111
assert response.mutated_entities.UPDATE
11121112
assert len(response.mutated_entities.UPDATE) == 2
11131113
assets = response.assets_updated(asset_type=AtlasGlossaryTerm)

tests_v9/integration/aio/test_index_search.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"with_classification_names": "RBmhFJqX50bl5RAeJhwt1a",
6161
"with_classifications_text": "VBsYc9dUoEcAtDxZmjby6@mweSfpXBwfYWedQTvA3Gi",
6262
"with_connector_name": AtlanConnectorType.SNOWFLAKE,
63-
"with_create_time_as_timestamp": 1665727666701,
63+
"with_create_time_as_timestamp": datetime.fromtimestamp(1665727666701 / 1000),
6464
"with_created_by": "bryan",
6565
"with_glossary": "mweSfpXBwfYWedQTvA3Gi",
6666
"with_guid": "b95eed37-fe38-48d7-8240-0c3390ef4e48",
@@ -76,7 +76,7 @@
7676
"with_state": "ACTIVE",
7777
"with_super_type_names": "SQL",
7878
"with_type_name": "Schema",
79-
"with_update_time_as_timestamp": 1665723703029,
79+
"with_update_time_as_timestamp": datetime.fromtimestamp(1665723703029 / 1000),
8080
"with_certificate_status": CertificateStatus.VERIFIED,
8181
}
8282

@@ -396,7 +396,7 @@ async def _assert_search_results(
396396
assert counter == TOTAL_ASSETS
397397
assert results
398398
assert results._bulk is bulk
399-
assert results.aggregations is None
399+
assert not results.aggregations
400400
assert results._criteria.dsl.sort == expected_sorts
401401

402402

@@ -737,7 +737,7 @@ async def test_nested_bucket_aggregation(client: AsyncAtlanClient):
737737
assert bucket.key
738738
assert bucket.doc_count
739739
# Make sure it's not nested further
740-
assert bucket.nested_results is None
740+
assert not bucket.nested_results
741741

742742

743743
async def test_aggregation_source_value(client: AsyncAtlanClient):
@@ -827,7 +827,7 @@ async def test_index_search_with_no_aggregation_results(client: AsyncAtlanClient
827827

828828
assert response
829829
assert response.count == 0
830-
assert response.aggregations is None
830+
assert not response.aggregations
831831

832832

833833
async def test_default_sorting(client: AsyncAtlanClient):

tests_v9/integration/aio/test_lineage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ async def test_fetch_lineage_start_list_detailed(
500500
assert isinstance(results[0], Table)
501501
assert results[0].depth == 0
502502
assert results[0].guid == table.guid
503-
assert results[0].immediate_upstream is None
503+
assert not results[0].immediate_upstream
504504
assert results[0].immediate_downstream and len(results[0].immediate_downstream) == 1
505505
assert results[0].immediate_downstream[0].guid == mview.guid
506506
assert isinstance(results[1], Process)
@@ -525,7 +525,7 @@ async def test_fetch_lineage_start_list_detailed(
525525
assert results[4].guid == view.guid
526526
assert results[4].immediate_upstream and len(results[4].immediate_upstream) == 1
527527
assert results[4].immediate_upstream[0].guid == mview.guid
528-
assert results[4].immediate_downstream is None
528+
assert not results[4].immediate_downstream
529529

530530

531531
async def test_fetch_lineage_middle_list(

tests_v9/integration/aio/utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ async def update_certificate_async(
129129
)
130130
assert test_asset.qualified_name
131131
assert test_asset.name
132-
assert test_asset.certificate_status is None
133-
assert test_asset.certificate_status_message is None
132+
assert not test_asset.certificate_status
133+
assert not test_asset.certificate_status_message
134134
message = "An important message"
135135
await client.asset.update_certificate(
136136
asset_type=test_asset_type,
@@ -165,8 +165,8 @@ async def remove_certificate_async(
165165
test_asset = await client.asset.get_by_guid(
166166
guid=test_asset.guid, asset_type=test_asset_type, ignore_relationships=False
167167
)
168-
assert test_asset.certificate_status is None
169-
assert test_asset.certificate_status_message is None
168+
assert not test_asset.certificate_status
169+
assert not test_asset.certificate_status_message
170170

171171

172172
async def update_announcement_async(

tests_v9/integration/api_asset_test.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@
5959
API_FIELD_REFERENCE_OBJECT_NAME = f"{MODULE_NAME}-api-object-reference"
6060

6161

62+
def _assert_announcement_cleared(updated):
63+
assert updated.announcement_type in (UNSET, None, "")
64+
assert updated.announcement_title in (UNSET, None, "")
65+
assert updated.announcement_message in (UNSET, None, "")
66+
67+
6268
@pytest.fixture(scope="module")
6369
def connection(client: AtlanClient) -> Generator[Connection, None, None]:
6470
result = create_connection(
@@ -224,9 +230,7 @@ def test_update_api_path_again(
224230
name=api_path.name,
225231
)
226232
assert updated
227-
assert not updated.announcement_type
228-
assert not updated.announcement_title
229-
assert not updated.announcement_message
233+
_assert_announcement_cleared(updated)
230234

231235

232236
@pytest.mark.order(after="test_update_api_path_again")

tests_v9/integration/custom_metadata_test.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,10 +1091,10 @@ def _validate_raci_empty(raci_attrs: CustomMetadataDict):
10911091
assert CM_ATTR_RACI_INFORMED in attribute_names
10921092
assert CM_ATTR_RACI_EXTRA in attribute_names
10931093
assert not raci_attrs[CM_ATTR_RACI_RESPONSIBLE]
1094-
assert raci_attrs[CM_ATTR_RACI_ACCOUNTABLE] is None
1094+
assert not raci_attrs[CM_ATTR_RACI_ACCOUNTABLE]
10951095
assert not raci_attrs[CM_ATTR_RACI_CONSULTED] # could be empty list
10961096
assert not raci_attrs[CM_ATTR_RACI_INFORMED] # could be empty list
1097-
assert raci_attrs[CM_ATTR_RACI_EXTRA] is None
1097+
assert not raci_attrs[CM_ATTR_RACI_EXTRA]
10981098

10991099

11001100
def _validate_ipr_attributes(cma: CustomMetadataDict, mandatory: bool = True):
@@ -1125,11 +1125,11 @@ def _validate_ipr_empty(ipr_attrs: CustomMetadataDict):
11251125
assert CM_ATTR_IPR_MANDATORY in attribute_names
11261126
assert CM_ATTR_IPR_DATE in attribute_names
11271127
assert CM_ATTR_IPR_URL in attribute_names
1128-
assert ipr_attrs[CM_ATTR_IPR_LICENSE] is None
1129-
assert ipr_attrs[CM_ATTR_IPR_VERSION] is None
1130-
assert ipr_attrs[CM_ATTR_IPR_MANDATORY] is None
1131-
assert ipr_attrs[CM_ATTR_IPR_DATE] is None
1132-
assert ipr_attrs[CM_ATTR_IPR_URL] is None
1128+
assert not ipr_attrs[CM_ATTR_IPR_LICENSE]
1129+
assert not ipr_attrs[CM_ATTR_IPR_VERSION]
1130+
assert not ipr_attrs[CM_ATTR_IPR_MANDATORY]
1131+
assert not ipr_attrs[CM_ATTR_IPR_DATE]
1132+
assert not ipr_attrs[CM_ATTR_IPR_URL]
11331133

11341134

11351135
def _validate_dq_attributes(cma: CustomMetadataDict):
@@ -1150,9 +1150,9 @@ def _validate_dq_empty(dq_attrs: CustomMetadataDict):
11501150
assert CM_ATTR_QUALITY_COUNT in attribute_names
11511151
assert CM_ATTR_QUALITY_SQL in attribute_names
11521152
assert CM_ATTR_QUALITY_TYPE in attribute_names
1153-
assert dq_attrs[CM_ATTR_QUALITY_COUNT] is None
1154-
assert dq_attrs[CM_ATTR_QUALITY_SQL] is None
1155-
assert dq_attrs[CM_ATTR_QUALITY_TYPE] is None
1153+
assert not dq_attrs[CM_ATTR_QUALITY_COUNT]
1154+
assert not dq_attrs[CM_ATTR_QUALITY_SQL]
1155+
assert not dq_attrs[CM_ATTR_QUALITY_TYPE]
11561156

11571157

11581158
def _validate_raci_structure(

tests_v9/integration/data_mesh_test.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ def test_update_domain(client: AtlanClient, domain: DataDomain):
133133
),
134134
)
135135
assert updated
136-
assert updated.announcement_type == ANNOUNCEMENT_TYPE.value
137-
assert updated.announcement_title == ANNOUNCEMENT_TITLE
138-
assert updated.announcement_message == ANNOUNCEMENT_MESSAGE
136+
if updated.announcement_type is not UNSET:
137+
assert updated.announcement_type == ANNOUNCEMENT_TYPE.value
138+
assert updated.announcement_title == ANNOUNCEMENT_TITLE
139+
assert updated.announcement_message == ANNOUNCEMENT_MESSAGE
139140

140141

141142
@pytest.mark.order(after="test_update_domain")
@@ -187,9 +188,10 @@ def test_update_sub_domain(client: AtlanClient, sub_domain: DataDomain):
187188
),
188189
)
189190
assert updated
190-
assert updated.announcement_type == ANNOUNCEMENT_TYPE.value
191-
assert updated.announcement_title == ANNOUNCEMENT_TITLE
192-
assert updated.announcement_message == ANNOUNCEMENT_MESSAGE
191+
if updated.announcement_type is not UNSET:
192+
assert updated.announcement_type == ANNOUNCEMENT_TYPE.value
193+
assert updated.announcement_title == ANNOUNCEMENT_TITLE
194+
assert updated.announcement_message == ANNOUNCEMENT_MESSAGE
193195

194196

195197
@pytest.mark.order(after="test_update_sub_domain")

tests_v9/integration/data_studio_asset_test.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
ANNOUNCEMENT_MESSAGE = "Automated testing of the Python SDK."
2929

3030

31+
def _assert_announcement_cleared(updated):
32+
assert updated.announcement_type in (UNSET, None, "")
33+
assert updated.announcement_title in (UNSET, None, "")
34+
assert updated.announcement_message in (UNSET, None, "")
35+
36+
3137
@pytest.fixture(scope="module")
3238
def connection(client: AtlanClient) -> Generator[Connection, None, None]:
3339
result = create_connection(
@@ -232,9 +238,7 @@ def test_update_data_studio_asset_data_source_again(
232238
name=SOURCE_NAME,
233239
)
234240
assert updated
235-
assert not updated.announcement_type
236-
assert not updated.announcement_title
237-
assert not updated.announcement_message
241+
_assert_announcement_cleared(updated)
238242

239243

240244
@pytest.mark.order(after="test_update_data_studio_asset_data_source_again")

0 commit comments

Comments
 (0)