@@ -336,6 +336,97 @@ def test_append_terms_asset_retrieval_errors(
336
336
)
337
337
338
338
339
+ def test_append_with_valid_guid_and_no_terms_returns_asset ():
340
+ asset_type = Table
341
+ table = Table ()
342
+ table .name = "table-test"
343
+ table .qualified_name = "table_qn"
344
+
345
+ terms = []
346
+
347
+ with patch (
348
+ "pyatlan.model.fluent_search.FluentSearch.execute"
349
+ ) as mock_execute , patch ("pyatlan.client.asset.AssetClient.save" ) as mock_save :
350
+ mock_execute .return_value .current_page = lambda : [table ]
351
+
352
+ mock_save .return_value .assets_updated .return_value = [table ]
353
+
354
+ client = AtlanClient ()
355
+ guid = "123"
356
+
357
+ asset = client .asset .append_terms (guid = guid , asset_type = asset_type , terms = terms )
358
+
359
+ assert asset == table
360
+ assert asset .assigned_terms is None
361
+ mock_execute .assert_called_once ()
362
+ mock_save .assert_called_once ()
363
+
364
+
365
+ def test_append_with_valid_guid_when_no_terms_present_returns_asset_with_given_terms ():
366
+ asset_type = Table
367
+ table = Table ()
368
+ table .name = "table-test"
369
+ table .qualified_name = "table_qn"
370
+
371
+ terms = [AtlasGlossaryTerm (qualified_name = "term1" )]
372
+
373
+ with patch (
374
+ "pyatlan.model.fluent_search.FluentSearch.execute"
375
+ ) as mock_execute , patch ("pyatlan.client.asset.AssetClient.save" ) as mock_save :
376
+ mock_execute .return_value .current_page = lambda : [table ]
377
+
378
+ def mock_save_side_effect (entity ):
379
+ entity .assigned_terms = terms
380
+ return Mock (assets_updated = lambda asset_type : [entity ])
381
+
382
+ mock_save .side_effect = mock_save_side_effect
383
+
384
+ client = AtlanClient ()
385
+ guid = "123"
386
+ asset = client .asset .append_terms (guid = guid , asset_type = asset_type , terms = terms )
387
+
388
+ assert asset .assigned_terms == terms
389
+ mock_execute .assert_called_once ()
390
+ mock_save .assert_called_once ()
391
+
392
+
393
+ def test_append_with_valid_guid_when_terms_present_returns_asset_with_combined_terms ():
394
+ asset_type = Table
395
+ table = Table ()
396
+ table .name = "table-test"
397
+ table .qualified_name = "table_qn"
398
+
399
+ exisiting_term = AtlasGlossaryTerm ()
400
+ table .attributes .meanings = [exisiting_term ]
401
+
402
+ new_term = AtlasGlossaryTerm (qualified_name = "new_term" )
403
+ terms = [new_term ]
404
+
405
+ with patch (
406
+ "pyatlan.model.fluent_search.FluentSearch.execute"
407
+ ) as mock_execute , patch ("pyatlan.client.asset.AssetClient.save" ) as mock_save :
408
+ mock_execute .return_value .current_page = lambda : [table ]
409
+
410
+ def mock_save_side_effect (entity ):
411
+ entity .assigned_terms = table .attributes .meanings + terms
412
+ return Mock (assets_updated = lambda asset_type : [entity ])
413
+
414
+ mock_save .side_effect = mock_save_side_effect
415
+
416
+ client = AtlanClient ()
417
+ guid = "123"
418
+
419
+ asset = client .asset .append_terms (guid = guid , asset_type = asset_type , terms = terms )
420
+
421
+ updated_terms = asset .assigned_terms
422
+ assert updated_terms is not None
423
+ assert len (updated_terms ) == 2
424
+ assert exisiting_term in updated_terms
425
+ assert new_term in updated_terms
426
+ mock_execute .assert_called_once ()
427
+ mock_save .assert_called_once ()
428
+
429
+
339
430
@pytest .mark .parametrize (
340
431
"guid, qualified_name, asset_type, assigned_terms, expected_message, expected_error" ,
341
432
[
@@ -437,6 +528,40 @@ def test_replace_terms_asset_retrieval_errors(
437
528
)
438
529
439
530
531
+ def test_replace_terms ():
532
+ asset_type = Table
533
+ table = Table ()
534
+ table .name = "table-test"
535
+ table .qualified_name = "table_qn"
536
+
537
+ exisiting_term = AtlasGlossaryTerm ()
538
+ table .attributes .meanings = [exisiting_term ]
539
+
540
+ terms = [AtlasGlossaryTerm (qualified_name = "new_term" )]
541
+
542
+ with patch (
543
+ "pyatlan.model.fluent_search.FluentSearch.execute"
544
+ ) as mock_execute , patch ("pyatlan.client.asset.AssetClient.save" ) as mock_save :
545
+ mock_execute .return_value .current_page = lambda : [table ]
546
+
547
+ def mock_save_side_effect (entity ):
548
+ entity .assigned_terms = terms
549
+ return Mock (assets_updated = lambda asset_type : [entity ])
550
+
551
+ mock_save .side_effect = mock_save_side_effect
552
+
553
+ client = AtlanClient ()
554
+ guid = "123"
555
+
556
+ asset = client .asset .replace_terms (
557
+ guid = guid , asset_type = asset_type , terms = terms
558
+ )
559
+
560
+ assert asset .assigned_terms == terms
561
+ mock_execute .assert_called_once ()
562
+ mock_save .assert_called_once ()
563
+
564
+
440
565
@pytest .mark .parametrize (
441
566
"guid, qualified_name, asset_type, assigned_terms, expected_message, expected_error" ,
442
567
[
@@ -538,6 +663,48 @@ def test_remove_terms_asset_retrieval_errors(
538
663
)
539
664
540
665
666
+ def test_remove_with_valid_guid_when_terms_present_returns_asset_with_terms_removed ():
667
+ asset_type = Table
668
+ table = Table ()
669
+ table .name = "table-test"
670
+ table .qualified_name = "table_qn"
671
+
672
+ existing_term = AtlasGlossaryTerm (
673
+ qualified_name = "term_to_remove" , guid = "b4113341-251b-4adc-81fb-2420501c30e6"
674
+ )
675
+ other_term = AtlasGlossaryTerm (
676
+ qualified_name = "other_term" , guid = "b267858d-8316-4c41-a56a-6e9b840cef4a"
677
+ )
678
+ table .attributes .meanings = [existing_term , other_term ]
679
+
680
+ with patch (
681
+ "pyatlan.model.fluent_search.FluentSearch.execute"
682
+ ) as mock_execute , patch ("pyatlan.client.asset.AssetClient.save" ) as mock_save :
683
+ mock_execute .return_value .current_page = lambda : [table ]
684
+
685
+ def mock_save_side_effect (entity ):
686
+ entity .assigned_terms = [
687
+ t for t in table .attributes .meanings if t != existing_term
688
+ ]
689
+ return Mock (assets_updated = lambda asset_type : [entity ])
690
+
691
+ mock_save .side_effect = mock_save_side_effect
692
+
693
+ client = AtlanClient ()
694
+ guid = "123"
695
+
696
+ asset = client .asset .remove_terms (
697
+ guid = guid , asset_type = asset_type , terms = [existing_term ]
698
+ )
699
+
700
+ updated_terms = asset .assigned_terms
701
+ assert updated_terms is not None
702
+ assert len (updated_terms ) == 1
703
+ assert other_term in updated_terms
704
+ mock_execute .assert_called_once ()
705
+ mock_save .assert_called_once ()
706
+
707
+
541
708
def test_register_client_with_bad_parameter_raises_value_error (client ):
542
709
with pytest .raises (
543
710
InvalidRequestError , match = "client must be an instance of AtlanClient"
0 commit comments