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  }