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  }