@@ -49,8 +49,14 @@ func sampleCommand(t *testing.T) *serpent.Command {
49
49
Use : "root [subcommand]" ,
50
50
Options : serpent.OptionSet {
51
51
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" ,
54
60
Value : serpent .BoolOf (& verbose ),
55
61
},
56
62
serpent.Option {
@@ -742,6 +748,12 @@ func TestCommand_DefaultsOverride(t *testing.T) {
742
748
Value : serpent .StringOf (& got ),
743
749
YAML : "url" ,
744
750
},
751
+ {
752
+ Name : "url-deprecated" ,
753
+ Flag : "url-deprecated" ,
754
+ Env : "URL_DEPRECATED" ,
755
+ Value : serpent .StringOf (& got ),
756
+ },
745
757
{
746
758
Name : "config" ,
747
759
Flag : "config" ,
@@ -790,6 +802,17 @@ func TestCommand_DefaultsOverride(t *testing.T) {
790
802
inv .Args = []string {"--config" , fi .Name (), "--url" , "good.com" }
791
803
})
792
804
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
+
793
816
test ("YAMLOverDefault" , "good.com" , func (t * testing.T , inv * serpent.Invocation ) {
794
817
fi , err := os .CreateTemp (t .TempDir (), "config.yaml" )
795
818
require .NoError (t , err )
@@ -800,4 +823,83 @@ func TestCommand_DefaultsOverride(t *testing.T) {
800
823
801
824
inv .Args = []string {"--config" , fi .Name ()}
802
825
})
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" )
803
905
}
0 commit comments