github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/cmd/juju/action/status_test.go (about)

     1  // Copyright 2014-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package action_test
     5  
     6  import (
     7  	"bytes"
     8  	"time"
     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/apiserver/params"
    15  	"github.com/juju/juju/cmd/juju/action"
    16  	"github.com/juju/juju/testing"
    17  )
    18  
    19  type StatusSuite struct {
    20  	BaseActionSuite
    21  	subcommand *action.StatusCommand
    22  }
    23  
    24  var _ = gc.Suite(&StatusSuite{})
    25  
    26  func (s *StatusSuite) SetUpTest(c *gc.C) {
    27  	s.BaseActionSuite.SetUpTest(c)
    28  	s.subcommand = &action.StatusCommand{}
    29  }
    30  
    31  func (s *StatusSuite) TestHelp(c *gc.C) {
    32  	s.checkHelp(c, s.subcommand)
    33  }
    34  
    35  func (s *StatusSuite) TestRun(c *gc.C) {
    36  	prefix := "deadbeef"
    37  	fakeid := prefix + "-0000-4000-8000-feedfacebeef"
    38  	fakeid2 := prefix + "-0001-4000-8000-feedfacebeef"
    39  	faketag := "action-" + fakeid
    40  	faketag2 := "action-" + fakeid2
    41  
    42  	emptyArgs := []string{}
    43  	emptyPrefixArgs := []string{}
    44  	prefixArgs := []string{prefix}
    45  	result1 := []params.ActionResult{{Status: "some-random-status"}}
    46  	result2 := []params.ActionResult{{Status: "a status"}, {Status: "another status"}}
    47  
    48  	errNotFound := "no actions found"
    49  	errNotFoundForPrefix := `no actions found matching prefix "` + prefix + `"`
    50  	errFoundTagButNoResults := `identifier "` + prefix + `" matched action\(s\) \[.*\], but found no results`
    51  
    52  	tests := []statusTestCase{
    53  		{expectError: errNotFound},
    54  		{args: emptyArgs, expectError: errNotFound},
    55  		{args: emptyArgs, tags: tagsForIdPrefix("", faketag, faketag2), results: result2},
    56  		{args: emptyPrefixArgs, expectError: errNotFound},
    57  		{args: emptyPrefixArgs, tags: tagsForIdPrefix("", faketag, faketag2), results: result2},
    58  		{args: prefixArgs, expectError: errNotFoundForPrefix},
    59  		{args: prefixArgs, expectError: errNotFoundForPrefix, tags: tagsForIdPrefix(prefix)},
    60  		{args: prefixArgs, expectError: errNotFoundForPrefix, tags: tagsForIdPrefix(prefix, "bb", "bc")},
    61  		{args: prefixArgs, expectError: errFoundTagButNoResults, tags: tagsForIdPrefix(prefix, faketag, faketag2)},
    62  		{args: prefixArgs, expectError: errFoundTagButNoResults, tags: tagsForIdPrefix(prefix, faketag)},
    63  		{args: prefixArgs, tags: tagsForIdPrefix(prefix, faketag), results: result1},
    64  		{args: prefixArgs, tags: tagsForIdPrefix(prefix, faketag, faketag2), results: result2},
    65  	}
    66  
    67  	for i, test := range tests {
    68  		c.Logf("iteration %d, test case %+v", i, test)
    69  		s.runTestCase(c, test)
    70  	}
    71  }
    72  
    73  func (s *StatusSuite) runTestCase(c *gc.C, tc statusTestCase) {
    74  	fakeClient := makeFakeClient(
    75  		0*time.Second, // No API delay
    76  		5*time.Second, // 5 second test timeout
    77  		tc.tags,
    78  		tc.results,
    79  		"", // No API error
    80  	)
    81  
    82  	restore := s.patchAPIClient(fakeClient)
    83  	defer restore()
    84  
    85  	s.subcommand = &action.StatusCommand{}
    86  	ctx, err := testing.RunCommand(c, s.subcommand, tc.args...)
    87  	if tc.expectError == "" {
    88  		c.Check(err, jc.ErrorIsNil)
    89  	} else {
    90  		c.Check(err, gc.ErrorMatches, tc.expectError)
    91  	}
    92  	if len(tc.results) > 0 {
    93  		buf, err := cmd.DefaultFormatters["yaml"](action.ActionResultsToMap(tc.results))
    94  		c.Check(err, jc.ErrorIsNil)
    95  		c.Check(ctx.Stdout.(*bytes.Buffer).String(), gc.Equals, string(buf)+"\n")
    96  		c.Check(ctx.Stderr.(*bytes.Buffer).String(), gc.Equals, "")
    97  	}
    98  }
    99  
   100  type statusTestCase struct {
   101  	args        []string
   102  	expectError string
   103  	tags        params.FindTagsResults
   104  	results     []params.ActionResult
   105  }