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