@@ -49,8 +49,14 @@ func sampleCommand(t *testing.T) *serpent.Command {
4949 Use : "root [subcommand]" ,
5050 Options : serpent.OptionSet {
5151 serpent.Option {
52- Name : "verbose" ,
53- Flag : "verbose" ,
52+ Name : "verbose" ,
53+ Flag : "verbose" ,
54+ Default : "false" ,
55+ Value : serpent .BoolOf (& verbose ),
56+ },
57+ serpent.Option {
58+ Name : "verbose-old" ,
59+ Flag : "verbode-old" ,
5460 Value : serpent .BoolOf (& verbose ),
5561 },
5662 serpent.Option {
@@ -742,6 +748,12 @@ func TestCommand_DefaultsOverride(t *testing.T) {
742748 Value : serpent .StringOf (& got ),
743749 YAML : "url" ,
744750 },
751+ {
752+ Name : "url-deprecated" ,
753+ Flag : "url-deprecated" ,
754+ Env : "URL_DEPRECATED" ,
755+ Value : serpent .StringOf (& got ),
756+ },
745757 {
746758 Name : "config" ,
747759 Flag : "config" ,
@@ -790,6 +802,17 @@ func TestCommand_DefaultsOverride(t *testing.T) {
790802 inv .Args = []string {"--config" , fi .Name (), "--url" , "good.com" }
791803 })
792804
805+ test ("EnvOverYAML" , "good.com" , func (t * testing.T , inv * serpent.Invocation ) {
806+ fi , err := os .CreateTemp (t .TempDir (), "config.yaml" )
807+ require .NoError (t , err )
808+ defer fi .Close ()
809+
810+ _ , err = fi .WriteString ("url: bad.com" )
811+ require .NoError (t , err )
812+
813+ inv .Environ .Set ("URL" , "good.com" )
814+ })
815+
793816 test ("YAMLOverDefault" , "good.com" , func (t * testing.T , inv * serpent.Invocation ) {
794817 fi , err := os .CreateTemp (t .TempDir (), "config.yaml" )
795818 require .NoError (t , err )
@@ -800,4 +823,83 @@ func TestCommand_DefaultsOverride(t *testing.T) {
800823
801824 inv .Args = []string {"--config" , fi .Name ()}
802825 })
826+
827+ test ("AltFlagOverDefault" , "good.com" , func (t * testing.T , inv * serpent.Invocation ) {
828+ inv .Args = []string {"--url-deprecated" , "good.com" }
829+ })
830+ }
831+
832+ func TestCommand_OptionsWithSharedValue (t * testing.T ) {
833+ t .Parallel ()
834+
835+ var got string
836+ makeCmd := func (def , altDef string ) * serpent.Command {
837+ got = ""
838+ return & serpent.Command {
839+ Options : serpent.OptionSet {
840+ {
841+ Name : "url" ,
842+ Flag : "url" ,
843+ Env : "URL" ,
844+ Default : def ,
845+ Value : serpent .StringOf (& got ),
846+ },
847+ {
848+ Name : "alt-url" ,
849+ Flag : "alt-url" ,
850+ Env : "ALT_URL" ,
851+ Default : altDef ,
852+ Value : serpent .StringOf (& got ),
853+ },
854+ },
855+ Handler : (func (i * serpent.Invocation ) error {
856+ return nil
857+ }),
858+ }
859+ }
860+
861+ // Check proper value propagation.
862+ err := makeCmd ("def.com" , "def.com" ).Invoke ().Run ()
863+ require .NoError (t , err , "default values are same" )
864+ require .Equal (t , "def.com" , got )
865+
866+ err = makeCmd ("def.com" , "" ).Invoke ().Run ()
867+ require .NoError (t , err , "other default value is empty" )
868+ require .Equal (t , "def.com" , got )
869+
870+ err = makeCmd ("def.com" , "" ).Invoke ("--url" , "sup" ).Run ()
871+ require .NoError (t , err )
872+ require .Equal (t , "sup" , got )
873+
874+ err = makeCmd ("def.com" , "" ).Invoke ("--alt-url" , "hup" ).Run ()
875+ require .NoError (t , err )
876+ require .Equal (t , "hup" , got )
877+
878+ // Both flags are given, last wins.
879+ err = makeCmd ("def.com" , "" ).Invoke ("--url" , "sup" , "--alt-url" , "hup" ).Run ()
880+ require .NoError (t , err )
881+ require .Equal (t , "hup" , got )
882+
883+ // Both flags are given, last wins #2.
884+ err = makeCmd ("" , "def.com" ).Invoke ("--alt-url" , "hup" , "--url" , "sup" ).Run ()
885+ require .NoError (t , err )
886+ require .Equal (t , "sup" , got )
887+
888+ // Both flags are given, option type priority wins.
889+ inv := makeCmd ("def.com" , "" ).Invoke ("--alt-url" , "hup" )
890+ inv .Environ .Set ("URL" , "sup" )
891+ err = inv .Run ()
892+ require .NoError (t , err )
893+ require .Equal (t , "hup" , got )
894+
895+ // Both flags are given, option type priority wins #2.
896+ inv = makeCmd ("" , "def.com" ).Invoke ("--url" , "sup" )
897+ inv .Environ .Set ("ALT_URL" , "hup" )
898+ err = inv .Run ()
899+ require .NoError (t , err )
900+ require .Equal (t , "sup" , got )
901+
902+ // Catch invalid configuration.
903+ err = makeCmd ("def.com" , "alt-def.com" ).Invoke ().Run ()
904+ require .Error (t , err , "default values are different" )
803905}
0 commit comments