44package figspec
55
66import (
7+ "errors"
78 "strings"
89 "testing"
910
@@ -492,6 +493,19 @@ func TestBuildSpec_Aliases(t *testing.T) {
492493 t .Fatal ("expected environment subcommand with aliases" )
493494}
494495
496+ func TestGenerateNonPersistentGlobalOptions (t * testing.T ) {
497+ root := & cobra.Command {Use : "azd" , Short : "CLI" }
498+ root .Flags ().Bool ("docs" , false , "Open documentation" )
499+ root .Flags ().Bool ("local-only" , false , "Local flag" )
500+
501+ sb := newTestSpecBuilder (false )
502+ opts := sb .generateNonPersistentGlobalOptions (root )
503+
504+ require .Len (t , opts , 1 )
505+ require .Equal (t , []string {"--docs" }, opts [0 ].Name )
506+ require .True (t , opts [0 ].IsPersistent )
507+ }
508+
495509func TestGenerateOptions_FlagTypes (t * testing.T ) {
496510 t .Run ("bool_flag_no_args" , func (t * testing.T ) {
497511 fs := pflag .NewFlagSet ("test" , pflag .ContinueOnError )
@@ -957,6 +971,15 @@ func TestTryGenerateExtensionSubcommand(t *testing.T) {
957971 require .Nil (t , result )
958972 })
959973
974+ t .Run ("load_error_returns_nil" , func (t * testing.T ) {
975+ sb := newTestSpecBuilder (false )
976+ sb .extensionMetadataProvider = & mockExtensionProvider {hasCapability : true , loadErr : errors .New ("load failed" )}
977+ cmd := & cobra.Command {Use : "ext" , Short : "Extension" }
978+ cmd .Annotations = map [string ]string {"extension.id" : "test-ext" }
979+ result := sb .tryGenerateExtensionSubcommand (cmd , []string {"ext" })
980+ require .Nil (t , result )
981+ })
982+
960983 t .Run ("success_with_metadata" , func (t * testing.T ) {
961984 sb := newTestSpecBuilder (false )
962985 sb .globalFlagNames = map [string ]bool {"help" : true }
@@ -978,6 +1001,32 @@ func TestTryGenerateExtensionSubcommand(t *testing.T) {
9781001 })
9791002}
9801003
1004+ func TestGenerateSubcommands_ExtensionMetadata (t * testing.T ) {
1005+ root := & cobra.Command {Use : "azd" , Short : "CLI" }
1006+ ext := & cobra.Command {Use : "ext" , Short : "Extension" }
1007+ ext .Annotations = map [string ]string {"extension.id" : "test-ext" }
1008+ root .AddCommand (ext )
1009+
1010+ sb := newTestSpecBuilder (false )
1011+ sb .globalFlagNames = map [string ]bool {}
1012+ sb .extensionMetadataProvider = & mockExtensionProvider {
1013+ hasCapability : true ,
1014+ metadata : & extensions.ExtensionCommandMetadata {
1015+ Commands : []extensions.Command {
1016+ {Name : []string {"child" }, Short : "Child cmd" },
1017+ },
1018+ },
1019+ }
1020+
1021+ subs := sb .generateSubcommands (root , & CommandContext {Command : root , CommandPath : "azd" })
1022+
1023+ require .Len (t , subs , 2 )
1024+ require .Equal (t , "ext" , subs [0 ].Name [0 ])
1025+ require .Len (t , subs [0 ].Subcommands , 1 )
1026+ require .Equal (t , "child" , subs [0 ].Subcommands [0 ].Name [0 ])
1027+ require .Equal (t , "help" , subs [1 ].Name [0 ])
1028+ }
1029+
9811030func TestTryGenerateExtensionHelpSubcommand (t * testing.T ) {
9821031 t .Run ("nil_provider_returns_nil" , func (t * testing.T ) {
9831032 sb := newTestSpecBuilder (false )
@@ -996,6 +1045,33 @@ func TestTryGenerateExtensionHelpSubcommand(t *testing.T) {
9961045 require .Nil (t , result )
9971046 })
9981047
1048+ t .Run ("no_capability_returns_nil" , func (t * testing.T ) {
1049+ sb := newTestSpecBuilder (false )
1050+ sb .extensionMetadataProvider = & mockExtensionProvider {hasCapability : false }
1051+ cmd := & cobra.Command {Use : "ext" }
1052+ cmd .Annotations = map [string ]string {"extension.id" : "test-ext" }
1053+ result := sb .tryGenerateExtensionHelpSubcommand (cmd , []string {"ext" })
1054+ require .Nil (t , result )
1055+ })
1056+
1057+ t .Run ("load_error_returns_nil" , func (t * testing.T ) {
1058+ sb := newTestSpecBuilder (false )
1059+ sb .extensionMetadataProvider = & mockExtensionProvider {hasCapability : true , loadErr : errors .New ("load failed" )}
1060+ cmd := & cobra.Command {Use : "ext" }
1061+ cmd .Annotations = map [string ]string {"extension.id" : "test-ext" }
1062+ result := sb .tryGenerateExtensionHelpSubcommand (cmd , []string {"ext" })
1063+ require .Nil (t , result )
1064+ })
1065+
1066+ t .Run ("nil_metadata_returns_nil" , func (t * testing.T ) {
1067+ sb := newTestSpecBuilder (false )
1068+ sb .extensionMetadataProvider = & mockExtensionProvider {hasCapability : true }
1069+ cmd := & cobra.Command {Use : "ext" }
1070+ cmd .Annotations = map [string ]string {"extension.id" : "test-ext" }
1071+ result := sb .tryGenerateExtensionHelpSubcommand (cmd , []string {"ext" })
1072+ require .Nil (t , result )
1073+ })
1074+
9991075 t .Run ("success_with_metadata" , func (t * testing.T ) {
10001076 sb := newTestSpecBuilder (false )
10011077 sb .extensionMetadataProvider = & mockExtensionProvider {
@@ -1056,6 +1132,18 @@ func TestGenerateHelpSubcommands_MirrorsTree(t *testing.T) {
10561132 require .Len (t , helpSubs [0 ].Subcommands , 2 )
10571133}
10581134
1135+ func TestGenerateHelpSubcommands_SkipsHelpCommand (t * testing.T ) {
1136+ root := & cobra.Command {Use : "azd" , Short : "CLI" }
1137+ root .AddCommand (& cobra.Command {Use : "init" , Short : "Init" })
1138+ root .InitDefaultHelpCmd ()
1139+
1140+ sb := newTestSpecBuilder (false )
1141+ helpSubs := sb .generateHelpSubcommands (root )
1142+
1143+ require .Len (t , helpSubs , 1 )
1144+ require .Equal (t , "init" , helpSubs [0 ].Name [0 ])
1145+ }
1146+
10591147func TestGenerateHelpSubcommands_HiddenExcluded (t * testing.T ) {
10601148 root := & cobra.Command {Use : "azd" , Short : "CLI" }
10611149 visible := & cobra.Command {Use : "init" , Short : "Init" }
@@ -1072,6 +1160,30 @@ func TestGenerateHelpSubcommands_HiddenExcluded(t *testing.T) {
10721160 }
10731161}
10741162
1163+ func TestGenerateHelpSubcommands_ExtensionMetadata (t * testing.T ) {
1164+ root := & cobra.Command {Use : "azd" , Short : "CLI" }
1165+ ext := & cobra.Command {Use : "ext" , Short : "Extension" }
1166+ ext .Annotations = map [string ]string {"extension.id" : "test-ext" }
1167+ root .AddCommand (ext )
1168+
1169+ sb := newTestSpecBuilder (false )
1170+ sb .extensionMetadataProvider = & mockExtensionProvider {
1171+ hasCapability : true ,
1172+ metadata : & extensions.ExtensionCommandMetadata {
1173+ Commands : []extensions.Command {
1174+ {Name : []string {"child" }, Short : "Child cmd" },
1175+ },
1176+ },
1177+ }
1178+
1179+ helpSubs := sb .generateHelpSubcommands (root )
1180+
1181+ require .Len (t , helpSubs , 1 )
1182+ require .Equal (t , "ext" , helpSubs [0 ].Name [0 ])
1183+ require .Len (t , helpSubs [0 ].Subcommands , 1 )
1184+ require .Equal (t , "child" , helpSubs [0 ].Subcommands [0 ].Name [0 ])
1185+ }
1186+
10751187// ============================================================================
10761188// spec_builder.go — custom args with generators
10771189// ============================================================================
0 commit comments