github.com/davecheney/cmd@v0.0.0-20151013155037-62127977de0d/cmd_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the LGPLv3, see LICENSE file for details.
     3  
     4  package cmd_test
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"os"
    10  	"path/filepath"
    11  
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/cmd"
    15  	"github.com/juju/cmd/cmdtesting"
    16  )
    17  
    18  type CmdSuite struct{}
    19  
    20  var _ = gc.Suite(&CmdSuite{})
    21  
    22  func (s *CmdSuite) TestContext(c *gc.C) {
    23  	ctx := cmdtesting.Context(c)
    24  	c.Assert(ctx.AbsPath("/foo/bar"), gc.Equals, "/foo/bar")
    25  	c.Assert(ctx.AbsPath("foo/bar"), gc.Equals, filepath.Join(ctx.Dir, "foo/bar"))
    26  }
    27  
    28  func (s *CmdSuite) TestContextGetenv(c *gc.C) {
    29  	ctx := cmdtesting.Context(c)
    30  	ctx.Env = make(map[string]string)
    31  	before := ctx.Getenv("foo")
    32  	ctx.Env["foo"] = "bar"
    33  	after := ctx.Getenv("foo")
    34  
    35  	c.Check(before, gc.Equals, "")
    36  	c.Check(after, gc.Equals, "bar")
    37  }
    38  
    39  func (s *CmdSuite) TestContextSetenv(c *gc.C) {
    40  	ctx := cmdtesting.Context(c)
    41  	before := ctx.Env["foo"]
    42  	ctx.Setenv("foo", "bar")
    43  	after := ctx.Env["foo"]
    44  
    45  	c.Check(before, gc.Equals, "")
    46  	c.Check(after, gc.Equals, "bar")
    47  }
    48  
    49  func (s *CmdSuite) TestInfo(c *gc.C) {
    50  	minimal := &TestCommand{Name: "verb", Minimal: true}
    51  	help := minimal.Info().Help(cmdtesting.NewFlagSet())
    52  	c.Assert(string(help), gc.Equals, minimalHelp)
    53  
    54  	full := &TestCommand{Name: "verb"}
    55  	f := cmdtesting.NewFlagSet()
    56  	var ignored string
    57  	f.StringVar(&ignored, "option", "", "option-doc")
    58  	help = full.Info().Help(f)
    59  	c.Assert(string(help), gc.Equals, fullHelp)
    60  
    61  	optionInfo := full.Info()
    62  	optionInfo.Doc = ""
    63  	help = optionInfo.Help(f)
    64  	c.Assert(string(help), gc.Equals, optionHelp)
    65  }
    66  
    67  var initErrorTests = []struct {
    68  	c    *TestCommand
    69  	help string
    70  }{
    71  	{&TestCommand{Name: "verb"}, fullHelp},
    72  	{&TestCommand{Name: "verb", Minimal: true}, minimalHelp},
    73  }
    74  
    75  func (s *CmdSuite) TestMainInitError(c *gc.C) {
    76  	for _, t := range initErrorTests {
    77  		ctx := cmdtesting.Context(c)
    78  		result := cmd.Main(t.c, ctx, []string{"--unknown"})
    79  		c.Assert(result, gc.Equals, 2)
    80  		c.Assert(bufferString(ctx.Stdout), gc.Equals, "")
    81  		expected := "error: flag provided but not defined: --unknown\n"
    82  		c.Assert(bufferString(ctx.Stderr), gc.Equals, expected)
    83  	}
    84  }
    85  
    86  func (s *CmdSuite) TestMainRunError(c *gc.C) {
    87  	ctx := cmdtesting.Context(c)
    88  	result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "error"})
    89  	c.Assert(result, gc.Equals, 1)
    90  	c.Assert(bufferString(ctx.Stdout), gc.Equals, "")
    91  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "error: BAM!\n")
    92  }
    93  
    94  func (s *CmdSuite) TestMainRunSilentError(c *gc.C) {
    95  	ctx := cmdtesting.Context(c)
    96  	result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "silent-error"})
    97  	c.Assert(result, gc.Equals, 1)
    98  	c.Assert(bufferString(ctx.Stdout), gc.Equals, "")
    99  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
   100  }
   101  
   102  func (s *CmdSuite) TestMainSuccess(c *gc.C) {
   103  	ctx := cmdtesting.Context(c)
   104  	result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "success!"})
   105  	c.Assert(result, gc.Equals, 0)
   106  	c.Assert(bufferString(ctx.Stdout), gc.Equals, "success!\n")
   107  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
   108  }
   109  
   110  func (s *CmdSuite) TestStdin(c *gc.C) {
   111  	const phrase = "Do you, Juju?"
   112  	ctx := cmdtesting.Context(c)
   113  	ctx.Stdin = bytes.NewBuffer([]byte(phrase))
   114  	result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "echo"})
   115  	c.Assert(result, gc.Equals, 0)
   116  	c.Assert(bufferString(ctx.Stdout), gc.Equals, phrase)
   117  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
   118  }
   119  
   120  func (s *CmdSuite) TestMainHelp(c *gc.C) {
   121  	for _, arg := range []string{"-h", "--help"} {
   122  		ctx := cmdtesting.Context(c)
   123  		result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{arg})
   124  		c.Assert(result, gc.Equals, 0)
   125  		c.Assert(bufferString(ctx.Stdout), gc.Equals, fullHelp)
   126  		c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
   127  	}
   128  }
   129  
   130  func (s *CmdSuite) TestDefaultContextReturnsErrorInDeletedDirectory(c *gc.C) {
   131  	ctx := cmdtesting.Context(c)
   132  	wd, err := os.Getwd()
   133  	c.Assert(err, gc.IsNil)
   134  	missing := ctx.Dir + "/missing"
   135  	err = os.Mkdir(missing, 0700)
   136  	c.Assert(err, gc.IsNil)
   137  	err = os.Chdir(missing)
   138  	c.Assert(err, gc.IsNil)
   139  	defer os.Chdir(wd)
   140  	err = os.Remove(missing)
   141  	c.Assert(err, gc.IsNil)
   142  	ctx, err = cmd.DefaultContext()
   143  	c.Assert(err, gc.ErrorMatches, `getwd: no such file or directory`)
   144  	c.Assert(ctx, gc.IsNil)
   145  }
   146  
   147  func (s *CmdSuite) TestCheckEmpty(c *gc.C) {
   148  	c.Assert(cmd.CheckEmpty(nil), gc.IsNil)
   149  	c.Assert(cmd.CheckEmpty([]string{"boo!"}), gc.ErrorMatches, `unrecognized args: \["boo!"\]`)
   150  }
   151  
   152  func (s *CmdSuite) TestZeroOrOneArgs(c *gc.C) {
   153  
   154  	expectValue := func(args []string, expected string) {
   155  		arg, err := cmd.ZeroOrOneArgs(args)
   156  		c.Assert(arg, gc.Equals, expected)
   157  		c.Assert(err, gc.IsNil)
   158  	}
   159  
   160  	expectValue(nil, "")
   161  	expectValue([]string{}, "")
   162  	expectValue([]string{"foo"}, "foo")
   163  
   164  	arg, err := cmd.ZeroOrOneArgs([]string{"foo", "bar"})
   165  	c.Assert(arg, gc.Equals, "")
   166  	c.Assert(err, gc.ErrorMatches, `unrecognized args: \["bar"\]`)
   167  }
   168  
   169  func (s *CmdSuite) TestIsErrSilent(c *gc.C) {
   170  	c.Assert(cmd.IsErrSilent(cmd.ErrSilent), gc.Equals, true)
   171  	c.Assert(cmd.IsErrSilent(cmd.NewRcPassthroughError(99)), gc.Equals, true)
   172  	c.Assert(cmd.IsErrSilent(fmt.Errorf("noisy")), gc.Equals, false)
   173  }