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  }