@@ -505,3 +505,96 @@ def test_get_node(self, client):
505505 assert cube_two .name == "default.cube_two"
506506 assert cube_two .metrics == ["default.num_repair_orders" ]
507507 assert cube_two .dimensions == ["default.municipality_dim.local_region" ]
508+
509+ #
510+ # Namespace Diff
511+ #
512+ def test_namespace_diff_between_namespaces (self , client ):
513+ """
514+ Test namespace_diff returns correct structure when comparing namespaces.
515+
516+ The 'default' and 'foo.bar' namespaces have some differences in the fixture,
517+ so we verify the diff structure is correct.
518+ """
519+ diff = client .namespace_diff (
520+ compare_namespace = "foo.bar" ,
521+ base_namespace = "default" ,
522+ )
523+ # The namespaces should be set correctly
524+ assert diff .base_namespace == "default"
525+ assert diff .compare_namespace == "foo.bar"
526+ # Verify the diff structure has the expected attributes
527+ assert isinstance (diff .added , list )
528+ assert isinstance (diff .removed , list )
529+ assert isinstance (diff .direct_changes , list )
530+ assert isinstance (diff .propagated_changes , list )
531+ assert isinstance (diff .added_count , int )
532+ assert isinstance (diff .removed_count , int )
533+ assert isinstance (diff .direct_change_count , int )
534+ assert isinstance (diff .propagated_change_count , int )
535+ assert isinstance (diff .unchanged_count , int )
536+
537+ def test_namespace_diff_has_changes (self , client ):
538+ """
539+ Test has_changes() method on namespace diff result.
540+ """
541+ diff = client .namespace_diff (
542+ compare_namespace = "foo.bar" ,
543+ base_namespace = "default" ,
544+ )
545+ # The diff should have some type of output (may have direct_changes
546+ # due to dimension_links with different namespace prefixes)
547+ # or unchanged_count should be > 0 if truly identical
548+ total = (
549+ diff .added_count
550+ + diff .removed_count
551+ + diff .direct_change_count
552+ + diff .propagated_change_count
553+ + diff .unchanged_count
554+ )
555+ assert total > 0
556+
557+ def test_namespace_diff_summary (self , client ):
558+ """
559+ Test summary() method on namespace diff result.
560+ """
561+ diff = client .namespace_diff (
562+ compare_namespace = "foo.bar" ,
563+ base_namespace = "default" ,
564+ )
565+ summary = diff .summary ()
566+ # Summary should be a string
567+ assert isinstance (summary , str )
568+ # It should either say "No changes" or include change counts
569+ assert (
570+ "changes" in summary .lower ()
571+ or "added" in summary .lower ()
572+ or "No changes" in summary
573+ )
574+
575+ def test_namespace_diff_to_markdown (self , client ):
576+ """
577+ Test to_markdown() method on namespace diff result.
578+ """
579+ diff = client .namespace_diff (
580+ compare_namespace = "foo.bar" ,
581+ base_namespace = "default" ,
582+ )
583+ md = diff .to_markdown ()
584+ # Should contain header with namespace names
585+ assert "## Namespace Diff:" in md
586+ assert "foo.bar" in md
587+ assert "default" in md
588+ # Should contain summary section
589+ assert "### Summary" in md
590+
591+ def test_namespace_diff_nonexistent_namespace (self , client ):
592+ """
593+ Test namespace_diff raises exception for non-existent namespace.
594+ """
595+ with pytest .raises (DJClientException ) as exc_info :
596+ client .namespace_diff (
597+ compare_namespace = "nonexistent.namespace" ,
598+ base_namespace = "default" ,
599+ )
600+ assert "Failed to get namespace diff" in str (exc_info .value )
0 commit comments