@@ -450,6 +450,25 @@ def test_get_returns_deep_copy(self, temp_dir):
450450 assert fresh ["version" ] == "1.0.0"
451451 assert fresh ["nested" ]["key" ] == "original"
452452
453+ def test_get_returns_none_for_corrupted_entry (self , temp_dir ):
454+ """Test that get() returns None for corrupted (non-dict) entries."""
455+ packs_dir = temp_dir / "packs"
456+ packs_dir .mkdir ()
457+ registry = PresetRegistry (packs_dir )
458+
459+ # Directly corrupt the registry with non-dict entries
460+ registry .data ["presets" ]["corrupted-string" ] = "not a dict"
461+ registry .data ["presets" ]["corrupted-list" ] = ["not" , "a" , "dict" ]
462+ registry .data ["presets" ]["corrupted-int" ] = 42
463+ registry ._save ()
464+
465+ # All corrupted entries should return None
466+ assert registry .get ("corrupted-string" ) is None
467+ assert registry .get ("corrupted-list" ) is None
468+ assert registry .get ("corrupted-int" ) is None
469+ # Non-existent should also return None
470+ assert registry .get ("nonexistent" ) is None
471+
453472 def test_list_returns_deep_copy (self , temp_dir ):
454473 """Test that list() returns deep copies to prevent mutation."""
455474 packs_dir = temp_dir / "packs"
@@ -840,6 +859,44 @@ def test_resolve_extension_provided_templates(self, project_dir):
840859 assert result is not None
841860 assert "Extension Custom Template" in result .read_text ()
842861
862+ def test_resolve_disabled_extension_templates_skipped (self , project_dir ):
863+ """Test that disabled extension templates are not resolved."""
864+ # Create extension with templates
865+ ext_dir = project_dir / ".specify" / "extensions" / "disabled-ext"
866+ ext_templates_dir = ext_dir / "templates"
867+ ext_templates_dir .mkdir (parents = True )
868+ ext_template = ext_templates_dir / "disabled-template.md"
869+ ext_template .write_text ("# Disabled Extension Template\n " )
870+
871+ # Register extension as disabled
872+ extensions_dir = project_dir / ".specify" / "extensions"
873+ ext_registry = ExtensionRegistry (extensions_dir )
874+ ext_registry .add ("disabled-ext" , {"version" : "1.0.0" , "priority" : 1 , "enabled" : False })
875+
876+ # Template should NOT be resolved because extension is disabled
877+ resolver = PresetResolver (project_dir )
878+ result = resolver .resolve ("disabled-template" )
879+ assert result is None , "Disabled extension template should not be resolved"
880+
881+ def test_resolve_disabled_extension_not_picked_up_as_unregistered (self , project_dir ):
882+ """Test that disabled extensions are not picked up via unregistered dir scan."""
883+ # Create extension directory with templates
884+ ext_dir = project_dir / ".specify" / "extensions" / "test-disabled-ext"
885+ ext_templates_dir = ext_dir / "templates"
886+ ext_templates_dir .mkdir (parents = True )
887+ ext_template = ext_templates_dir / "unique-disabled-template.md"
888+ ext_template .write_text ("# Should Not Resolve\n " )
889+
890+ # Register the extension but disable it
891+ extensions_dir = project_dir / ".specify" / "extensions"
892+ ext_registry = ExtensionRegistry (extensions_dir )
893+ ext_registry .add ("test-disabled-ext" , {"version" : "1.0.0" , "enabled" : False })
894+
895+ # Verify the template is NOT resolved (even though the directory exists)
896+ resolver = PresetResolver (project_dir )
897+ result = resolver .resolve ("unique-disabled-template" )
898+ assert result is None , "Disabled extension should not be picked up as unregistered"
899+
843900 def test_resolve_pack_over_extension (self , project_dir , pack_dir , temp_dir , valid_pack_data ):
844901 """Test that pack templates take priority over extension templates."""
845902 # Create extension with templates
0 commit comments