github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/uniter/runner/jujuc/leader-get_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuc_test 5 6 import ( 7 "github.com/juju/cmd" 8 "github.com/juju/cmd/cmdtesting" 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/testing" 14 "github.com/juju/juju/worker/uniter/runner/jujuc" 15 ) 16 17 type leaderGetSuite struct { 18 testing.BaseSuite 19 command cmd.Command 20 } 21 22 var _ = gc.Suite(&leaderGetSuite{}) 23 24 func (s *leaderGetSuite) SetUpTest(c *gc.C) { 25 s.BaseSuite.SetUpTest(c) 26 var err error 27 s.command, err = jujuc.NewLeaderGetCommand(nil) 28 c.Assert(err, jc.ErrorIsNil) 29 s.command = jujuc.NewJujucCommandWrappedForTest(s.command) 30 } 31 32 func (s *leaderGetSuite) TestInitError(c *gc.C) { 33 err := s.command.Init([]string{"x=x"}) 34 c.Assert(err, gc.ErrorMatches, `invalid key "x=x"`) 35 } 36 37 func (s *leaderGetSuite) TestInitKey(c *gc.C) { 38 err := s.command.Init([]string{"some-key"}) 39 c.Assert(err, jc.ErrorIsNil) 40 } 41 42 func (s *leaderGetSuite) TestInitAll(c *gc.C) { 43 err := s.command.Init([]string{"-"}) 44 c.Assert(err, jc.ErrorIsNil) 45 } 46 47 func (s *leaderGetSuite) TestInitEmpty(c *gc.C) { 48 err := s.command.Init(nil) 49 c.Assert(err, jc.ErrorIsNil) 50 } 51 52 func (s *leaderGetSuite) TestFormatError(c *gc.C) { 53 runContext := cmdtesting.Context(c) 54 code := cmd.Main(s.command, runContext, []string{"--format", "bad"}) 55 c.Check(code, gc.Equals, 2) 56 c.Check(bufferString(runContext.Stdout), gc.Equals, "") 57 c.Check(bufferString(runContext.Stderr), gc.Equals, `ERROR invalid value "bad" for option --format: unknown format "bad"`+"\n") 58 } 59 60 func (s *leaderGetSuite) TestSettingsError(c *gc.C) { 61 jujucContext := newLeaderGetContext(errors.New("zap")) 62 command, err := jujuc.NewLeaderGetCommand(jujucContext) 63 c.Assert(err, jc.ErrorIsNil) 64 runContext := cmdtesting.Context(c) 65 code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(command), runContext, nil) 66 c.Check(code, gc.Equals, 1) 67 c.Check(jujucContext.called, jc.IsTrue) 68 c.Check(bufferString(runContext.Stdout), gc.Equals, "") 69 c.Check(bufferString(runContext.Stderr), gc.Equals, "ERROR cannot read leadership settings: zap\n") 70 } 71 72 func (s *leaderGetSuite) TestSettingsFormatDefaultMissingKey(c *gc.C) { 73 s.testOutput(c, []string{"unknown"}, "") 74 } 75 76 func (s *leaderGetSuite) TestSettingsFormatDefaultKey(c *gc.C) { 77 s.testOutput(c, []string{"key"}, "value\n") 78 } 79 80 func (s *leaderGetSuite) TestSettingsFormatDefaultAll(c *gc.C) { 81 s.testParseOutput(c, []string{"-"}, jc.YAMLEquals, leaderGetSettings()) 82 } 83 84 func (s *leaderGetSuite) TestSettingsFormatDefaultEmpty(c *gc.C) { 85 s.testParseOutput(c, nil, jc.YAMLEquals, leaderGetSettings()) 86 } 87 88 func (s *leaderGetSuite) TestSettingsFormatSmartMissingKey(c *gc.C) { 89 s.testOutput(c, []string{"--format", "smart", "unknown"}, "") 90 } 91 92 func (s *leaderGetSuite) TestSettingsFormatSmartKey(c *gc.C) { 93 s.testOutput(c, []string{"--format", "smart", "key"}, "value\n") 94 } 95 96 func (s *leaderGetSuite) TestSettingsFormatSmartAll(c *gc.C) { 97 s.testParseOutput(c, []string{"--format", "smart", "-"}, jc.YAMLEquals, leaderGetSettings()) 98 } 99 100 func (s *leaderGetSuite) TestSettingsFormatSmartEmpty(c *gc.C) { 101 s.testParseOutput(c, []string{"--format", "smart"}, jc.YAMLEquals, leaderGetSettings()) 102 } 103 104 func (s *leaderGetSuite) TestSettingsFormatJSONMissingKey(c *gc.C) { 105 s.testParseOutput(c, []string{"--format", "json", "unknown"}, jc.JSONEquals, nil) 106 } 107 108 func (s *leaderGetSuite) TestSettingsFormatJSONKey(c *gc.C) { 109 s.testParseOutput(c, []string{"--format", "json", "key"}, jc.JSONEquals, "value") 110 } 111 112 func (s *leaderGetSuite) TestSettingsFormatJSONAll(c *gc.C) { 113 s.testParseOutput(c, []string{"--format", "json", "-"}, jc.JSONEquals, leaderGetSettings()) 114 } 115 116 func (s *leaderGetSuite) TestSettingsFormatJSONEmpty(c *gc.C) { 117 s.testParseOutput(c, []string{"--format", "json"}, jc.JSONEquals, leaderGetSettings()) 118 } 119 120 func (s *leaderGetSuite) TestSettingsFormatYAMLMissingKey(c *gc.C) { 121 s.testParseOutput(c, []string{"--format", "yaml", "unknown"}, jc.YAMLEquals, nil) 122 } 123 124 func (s *leaderGetSuite) TestSettingsFormatYAMLKey(c *gc.C) { 125 s.testParseOutput(c, []string{"--format", "yaml", "key"}, jc.YAMLEquals, "value") 126 } 127 128 func (s *leaderGetSuite) TestSettingsFormatYAMLAll(c *gc.C) { 129 s.testParseOutput(c, []string{"--format", "yaml", "-"}, jc.YAMLEquals, leaderGetSettings()) 130 } 131 132 func (s *leaderGetSuite) TestSettingsFormatYAMLEmpty(c *gc.C) { 133 s.testParseOutput(c, []string{"--format", "yaml"}, jc.YAMLEquals, leaderGetSettings()) 134 } 135 136 func (s *leaderGetSuite) testOutput(c *gc.C, args []string, expect string) { 137 s.testParseOutput(c, args, gc.Equals, expect) 138 } 139 140 func (s *leaderGetSuite) testParseOutput(c *gc.C, args []string, checker gc.Checker, expect interface{}) { 141 jujucContext := newLeaderGetContext(nil) 142 command, err := jujuc.NewLeaderGetCommand(jujucContext) 143 c.Assert(err, jc.ErrorIsNil) 144 runContext := cmdtesting.Context(c) 145 code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(command), runContext, args) 146 c.Check(code, gc.Equals, 0) 147 c.Check(jujucContext.called, jc.IsTrue) 148 c.Check(bufferString(runContext.Stdout), checker, expect) 149 c.Check(bufferString(runContext.Stderr), gc.Equals, "") 150 } 151 152 func leaderGetSettings() map[string]string { 153 return map[string]string{ 154 "key": "value", 155 "sample": "settings", 156 } 157 } 158 159 func newLeaderGetContext(err error) *leaderGetContext { 160 if err != nil { 161 return &leaderGetContext{err: err} 162 } 163 return &leaderGetContext{settings: leaderGetSettings()} 164 } 165 166 type leaderGetContext struct { 167 jujuc.Context 168 called bool 169 settings map[string]string 170 err error 171 } 172 173 func (c *leaderGetContext) LeaderSettings() (map[string]string, error) { 174 c.called = true 175 return c.settings, c.err 176 }