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