launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/uniter/jujuc/relation-list_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuc_test 5 6 import ( 7 "fmt" 8 gc "launchpad.net/gocheck" 9 10 "launchpad.net/juju-core/cmd" 11 "launchpad.net/juju-core/testing" 12 "launchpad.net/juju-core/worker/uniter/jujuc" 13 ) 14 15 type RelationListSuite struct { 16 ContextSuite 17 } 18 19 var _ = gc.Suite(&RelationListSuite{}) 20 21 var relationListTests = []struct { 22 summary string 23 relid int 24 members0, members1 []string 25 args []string 26 code int 27 out string 28 }{ 29 { 30 summary: "no default relation, no arg", 31 relid: -1, 32 code: 2, 33 out: "no relation id specified", 34 }, { 35 summary: "no default relation, bad arg", 36 relid: -1, 37 args: []string{"-r", "bad"}, 38 code: 2, 39 out: `invalid value "bad" for flag -r: invalid relation id`, 40 }, { 41 summary: "no default relation, unknown arg", 42 relid: -1, 43 args: []string{"-r", "unknown:123"}, 44 code: 2, 45 out: `invalid value "unknown:123" for flag -r: unknown relation id`, 46 }, { 47 summary: "default relation, bad arg", 48 relid: 1, 49 args: []string{"-r", "bad"}, 50 code: 2, 51 out: `invalid value "bad" for flag -r: invalid relation id`, 52 }, { 53 summary: "default relation, unknown arg", 54 relid: 1, 55 args: []string{"-r", "unknown:123"}, 56 code: 2, 57 out: `invalid value "unknown:123" for flag -r: unknown relation id`, 58 }, { 59 summary: "default relation, no members", 60 relid: 1, 61 }, { 62 summary: "default relation, members", 63 members1: []string{"foo", "bar", "baz"}, 64 relid: 1, 65 out: "bar\nbaz\nfoo", 66 }, { 67 summary: "alternative relation, members", 68 members0: []string{"pew", "pow", "paw"}, 69 relid: 1, 70 args: []string{"-r", "ignored:0"}, 71 out: "paw\npew\npow", 72 }, { 73 summary: "explicit smart formatting 1", 74 relid: 1, 75 args: []string{"--format", "smart"}, 76 }, { 77 summary: "explicit smart formatting 2", 78 members1: []string{"foo", "bar", "baz"}, 79 relid: 1, 80 args: []string{"--format", "smart"}, 81 out: "bar\nbaz\nfoo", 82 }, { 83 summary: "json formatting 1", 84 relid: 1, 85 args: []string{"--format", "json"}, 86 out: "[]", 87 }, { 88 summary: "json formatting 2", 89 members1: []string{"foo", "bar", "baz"}, 90 relid: 1, 91 args: []string{"--format", "json"}, 92 out: `["bar","baz","foo"]`, 93 }, { 94 summary: "yaml formatting 1", 95 relid: 1, 96 args: []string{"--format", "yaml"}, 97 out: "[]", 98 }, { 99 summary: "yaml formatting 2", 100 members1: []string{"foo", "bar", "baz"}, 101 relid: 1, 102 args: []string{"--format", "yaml"}, 103 out: "- bar\n- baz\n- foo", 104 }, 105 } 106 107 func (s *RelationListSuite) TestRelationList(c *gc.C) { 108 for i, t := range relationListTests { 109 c.Logf("test %d: %s", i, t.summary) 110 hctx := s.GetHookContext(c, t.relid, "") 111 setMembers(hctx.rels[0], t.members0) 112 setMembers(hctx.rels[1], t.members1) 113 com, err := jujuc.NewCommand(hctx, "relation-list") 114 c.Assert(err, gc.IsNil) 115 ctx := testing.Context(c) 116 code := cmd.Main(com, ctx, t.args) 117 c.Logf(bufferString(ctx.Stderr)) 118 c.Assert(code, gc.Equals, t.code) 119 if code == 0 { 120 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 121 expect := t.out 122 if expect != "" { 123 expect = expect + "\n" 124 } 125 c.Assert(bufferString(ctx.Stdout), gc.Equals, expect) 126 } else { 127 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 128 expect := fmt.Sprintf(`(.|\n)*error: %s\n`, t.out) 129 c.Assert(bufferString(ctx.Stderr), gc.Matches, expect) 130 } 131 } 132 } 133 134 func (s *RelationListSuite) TestRelationListHelp(c *gc.C) { 135 template := ` 136 usage: relation-list [options] 137 purpose: list relation units 138 139 options: 140 --format (= smart) 141 specify output format (json|smart|yaml) 142 -o, --output (= "") 143 specify an output file 144 -r (= %s) 145 specify a relation by id 146 %s`[1:] 147 148 for relid, t := range map[int]struct { 149 usage, doc string 150 }{ 151 -1: {"", "\n-r must be specified when not in a relation hook\n"}, 152 0: {"peer0:0", ""}, 153 } { 154 c.Logf("test relid %d", relid) 155 hctx := s.GetHookContext(c, relid, "") 156 com, err := jujuc.NewCommand(hctx, "relation-list") 157 c.Assert(err, gc.IsNil) 158 ctx := testing.Context(c) 159 code := cmd.Main(com, ctx, []string{"--help"}) 160 c.Assert(code, gc.Equals, 0) 161 expect := fmt.Sprintf(template, t.usage, t.doc) 162 c.Assert(bufferString(ctx.Stdout), gc.Equals, expect) 163 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 164 } 165 } 166 167 func setMembers(rctx *ContextRelation, members []string) { 168 rctx.units = map[string]Settings{} 169 for _, name := range members { 170 rctx.units[name] = nil 171 } 172 }