github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/common/flags_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 11 "github.com/juju/cmd/cmdtesting" 12 "github.com/juju/errors" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/testing" 17 ) 18 19 type FlagsSuite struct { 20 testing.FakeJujuXDGDataHomeSuite 21 } 22 23 var _ = gc.Suite(&FlagsSuite{}) 24 25 func (*FlagsSuite) TestConfigFlagSet(c *gc.C) { 26 var f ConfigFlag 27 c.Assert(f.Set("a.yaml"), jc.ErrorIsNil) 28 assertConfigFlag(c, f, []string{"a.yaml"}, nil) 29 c.Assert(f.Set("b.yaml"), jc.ErrorIsNil) 30 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, nil) 31 c.Assert(f.Set("k1=v1"), jc.ErrorIsNil) 32 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": "v1"}) 33 c.Assert(f.Set("k1="), jc.ErrorIsNil) 34 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": ""}) 35 c.Assert(f.Set("k1=v1"), jc.ErrorIsNil) 36 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": "v1"}) 37 c.Assert(f.Set(`k1=""`), jc.ErrorIsNil) 38 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": ""}) 39 c.Assert(f.Set("k1==v2"), jc.ErrorIsNil) 40 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": "=v2"}) 41 c.Assert(f.Set("k2=3"), jc.ErrorIsNil) 42 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": "=v2", "k2": 3}) 43 c.Assert(f.Set("k3="), jc.ErrorIsNil) 44 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": "=v2", "k2": 3, "k3": ""}) 45 f.SetPreserveStringValue(true) 46 c.Assert(f.Set("k4=4.0"), jc.ErrorIsNil) 47 assertConfigFlag(c, f, []string{"a.yaml", "b.yaml"}, map[string]interface{}{"k1": "=v2", "k2": 3, "k3": "", "k4": "4.0"}) 48 } 49 50 func (*FlagsSuite) TestConfigFlagSetErrors(c *gc.C) { 51 var f ConfigFlag 52 c.Assert(f.Set(""), gc.ErrorMatches, "empty string not valid") 53 c.Assert(f.Set("x=%"), gc.ErrorMatches, "yaml: could not find expected directive name") 54 } 55 56 func (*FlagsSuite) TestConfigFlagString(c *gc.C) { 57 var f ConfigFlag 58 c.Assert(f.String(), gc.Equals, "") 59 f.files = append(f.files, "a.yaml") 60 c.Assert(f.String(), gc.Equals, "a.yaml") 61 f.files = append(f.files, "b.yaml") 62 c.Assert(f.String(), gc.Equals, "a.yaml b.yaml") 63 f.files = append(f.files, "x=y") 64 c.Assert(f.String(), gc.Equals, "a.yaml b.yaml x=y") 65 f.files = append(f.files, "zz=y") 66 c.Assert(f.String(), gc.Equals, "a.yaml b.yaml x=y zz=y") 67 } 68 69 func (*FlagsSuite) TestConfigFlagReadAttrs(c *gc.C) { 70 tmpdir := c.MkDir() 71 configFile1 := filepath.Join(tmpdir, "config-1.yaml") 72 configFile2 := filepath.Join(tmpdir, "config-2.yaml") 73 err := ioutil.WriteFile(configFile1, []byte(`over: "'n'out"`+"\n"), 0644) 74 c.Assert(err, jc.ErrorIsNil) 75 err = ioutil.WriteFile(configFile2, []byte(`over: "'n'under"`+"\n"), 0644) 76 c.Assert(err, jc.ErrorIsNil) 77 78 var f ConfigFlag 79 assertConfigFlagReadAttrs(c, f, map[string]interface{}{}) 80 f.files = append(f.files, configFile1) 81 assertConfigFlagReadAttrs(c, f, map[string]interface{}{"over": "'n'out"}) 82 f.files = append(f.files, configFile2) 83 assertConfigFlagReadAttrs(c, f, map[string]interface{}{"over": "'n'under"}) 84 f.attrs = map[string]interface{}{"over": "ridden"} 85 assertConfigFlagReadAttrs(c, f, map[string]interface{}{"over": "ridden"}) 86 } 87 88 func (*FlagsSuite) TestConfigFlagReadConfigPairs(c *gc.C) { 89 ctx := cmdtesting.Context(c) 90 configFile1 := filepath.Join(ctx.Dir, "config-1.yaml") 91 err := ioutil.WriteFile(configFile1, []byte(`over: "'n'out"`+"\n"), 0644) 92 c.Assert(err, jc.ErrorIsNil) 93 94 var f ConfigFlag 95 f.files = append(f.files, configFile1) 96 f.attrs = map[string]interface{}{"key": "value"} 97 attrs, err := f.ReadConfigPairs(ctx) 98 c.Assert(err, jc.ErrorIsNil) 99 c.Assert(attrs, jc.DeepEquals, map[string]interface{}{"key": "value"}) 100 } 101 102 func (*FlagsSuite) TestConfigFlagReadAttrsErrors(c *gc.C) { 103 tmpdir := c.MkDir() 104 configFile := filepath.Join(tmpdir, "config.yaml") 105 106 var f ConfigFlag 107 f.files = append(f.files, configFile) 108 ctx := cmdtesting.Context(c) 109 attrs, err := f.ReadAttrs(ctx) 110 c.Assert(errors.Cause(err), jc.Satisfies, os.IsNotExist) 111 c.Assert(attrs, gc.IsNil) 112 } 113 114 func (*FlagsSuite) TestAbsoluteFilenames(c *gc.C) { 115 tmpdir := c.MkDir() 116 configFile1 := filepath.Join(tmpdir, "config-1.yaml") 117 configFile2 := filepath.Join(tmpdir, "config-2.yaml") 118 119 var f ConfigFlag 120 f.files = append(f.files, configFile1) 121 f.files = append(f.files, configFile2) 122 ctx := cmdtesting.Context(c) 123 files, err := f.AbsoluteFileNames(ctx) 124 c.Assert(err, jc.ErrorIsNil) 125 c.Assert(files, jc.DeepEquals, []string{ 126 configFile1, configFile2, 127 }) 128 } 129 130 func assertConfigFlag(c *gc.C, f ConfigFlag, files []string, attrs map[string]interface{}) { 131 c.Assert(f.files, jc.DeepEquals, files) 132 c.Assert(f.attrs, jc.DeepEquals, attrs) 133 } 134 135 func assertConfigFlagReadAttrs(c *gc.C, f ConfigFlag, expect map[string]interface{}) { 136 ctx := cmdtesting.Context(c) 137 attrs, err := f.ReadAttrs(ctx) 138 c.Assert(err, jc.ErrorIsNil) 139 c.Assert(attrs, jc.DeepEquals, expect) 140 }