github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/payloads/facade_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package payloads_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/charm.v6"
    12  	"gopkg.in/juju/names.v2"
    13  
    14  	"github.com/juju/juju/apiserver/facades/client/payloads"
    15  	"github.com/juju/juju/apiserver/params"
    16  	"github.com/juju/juju/payload"
    17  	"github.com/juju/juju/payload/api"
    18  )
    19  
    20  var _ = gc.Suite(&Suite{})
    21  
    22  type Suite struct {
    23  	testing.IsolationSuite
    24  
    25  	stub  *testing.Stub
    26  	state *stubState
    27  }
    28  
    29  func (s *Suite) SetUpTest(c *gc.C) {
    30  	s.IsolationSuite.SetUpTest(c)
    31  
    32  	s.stub = &testing.Stub{}
    33  	s.state = &stubState{stub: s.stub}
    34  }
    35  
    36  func (Suite) newPayload(name string) (payload.FullPayloadInfo, params.Payload) {
    37  	ptype := "docker"
    38  	id := "id" + name
    39  	tags := []string{"a-tag"}
    40  	unit := "a-application/0"
    41  	machine := "1"
    42  
    43  	pl := payload.FullPayloadInfo{
    44  		Payload: payload.Payload{
    45  			PayloadClass: charm.PayloadClass{
    46  				Name: name,
    47  				Type: ptype,
    48  			},
    49  			ID:     id,
    50  			Status: payload.StateRunning,
    51  			Labels: tags,
    52  			Unit:   unit,
    53  		},
    54  		Machine: machine,
    55  	}
    56  	apiPayload := params.Payload{
    57  		Class:   name,
    58  		Type:    ptype,
    59  		ID:      id,
    60  		Status:  payload.StateRunning,
    61  		Labels:  tags,
    62  		Unit:    names.NewUnitTag(unit).String(),
    63  		Machine: names.NewMachineTag(machine).String(),
    64  	}
    65  	return pl, apiPayload
    66  }
    67  
    68  func (s *Suite) TestListNoPatterns(c *gc.C) {
    69  	payloadA, apiPayloadA := s.newPayload("spam")
    70  	payloadB, apiPayloadB := s.newPayload("eggs")
    71  	s.state.payloads = append(s.state.payloads, payloadA, payloadB)
    72  
    73  	facade := payloads.NewAPI(s.state)
    74  	args := params.PayloadListArgs{
    75  		Patterns: []string{},
    76  	}
    77  	results, err := facade.List(args)
    78  	c.Assert(err, jc.ErrorIsNil)
    79  
    80  	c.Check(results, jc.DeepEquals, params.PayloadListResults{
    81  		Results: []params.Payload{
    82  			apiPayloadA,
    83  			apiPayloadB,
    84  		},
    85  	})
    86  }
    87  
    88  func (s *Suite) TestListAllMatch(c *gc.C) {
    89  	payloadA, apiPayloadA := s.newPayload("spam")
    90  	payloadB, apiPayloadB := s.newPayload("eggs")
    91  	s.state.payloads = append(s.state.payloads, payloadA, payloadB)
    92  
    93  	facade := payloads.NewAPI(s.state)
    94  	args := params.PayloadListArgs{
    95  		Patterns: []string{
    96  			"a-application/0",
    97  		},
    98  	}
    99  	results, err := facade.List(args)
   100  	c.Assert(err, jc.ErrorIsNil)
   101  
   102  	c.Check(results, jc.DeepEquals, params.PayloadListResults{
   103  		Results: []params.Payload{
   104  			apiPayloadA,
   105  			apiPayloadB,
   106  		},
   107  	})
   108  }
   109  
   110  func (s *Suite) TestListNoMatch(c *gc.C) {
   111  	payloadA, _ := s.newPayload("spam")
   112  	payloadB, _ := s.newPayload("eggs")
   113  	s.state.payloads = append(s.state.payloads, payloadA, payloadB)
   114  
   115  	facade := payloads.NewAPI(s.state)
   116  	args := params.PayloadListArgs{
   117  		Patterns: []string{
   118  			"a-application/1",
   119  		},
   120  	}
   121  	results, err := facade.List(args)
   122  	c.Assert(err, jc.ErrorIsNil)
   123  
   124  	c.Check(results.Results, gc.HasLen, 0)
   125  }
   126  
   127  func (s *Suite) TestListNoPayloads(c *gc.C) {
   128  	facade := payloads.NewAPI(s.state)
   129  	args := params.PayloadListArgs{
   130  		Patterns: []string{},
   131  	}
   132  	results, err := facade.List(args)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  
   135  	c.Check(results.Results, gc.HasLen, 0)
   136  }
   137  
   138  func (s *Suite) TestListMultiMatch(c *gc.C) {
   139  	payloadA, apiPayloadA := s.newPayload("spam")
   140  	payloadB, apiPayloadB := s.newPayload("eggs")
   141  	s.state.payloads = append(s.state.payloads, payloadA, payloadB)
   142  
   143  	facade := payloads.NewAPI(s.state)
   144  	args := params.PayloadListArgs{
   145  		Patterns: []string{
   146  			"spam",
   147  			"eggs",
   148  		},
   149  	}
   150  	results, err := facade.List(args)
   151  	c.Assert(err, jc.ErrorIsNil)
   152  
   153  	c.Check(results, jc.DeepEquals, params.PayloadListResults{
   154  		Results: []params.Payload{
   155  			apiPayloadA,
   156  			apiPayloadB,
   157  		},
   158  	})
   159  }
   160  
   161  func (s *Suite) TestListPartialMatch(c *gc.C) {
   162  	payloadA, apiPayloadA := s.newPayload("spam")
   163  	payloadB, _ := s.newPayload("eggs")
   164  	s.state.payloads = append(s.state.payloads, payloadA, payloadB)
   165  
   166  	facade := payloads.NewAPI(s.state)
   167  	args := params.PayloadListArgs{
   168  		Patterns: []string{
   169  			"spam",
   170  		},
   171  	}
   172  	results, err := facade.List(args)
   173  	c.Assert(err, jc.ErrorIsNil)
   174  
   175  	c.Check(results, jc.DeepEquals, params.PayloadListResults{
   176  		Results: []params.Payload{
   177  			apiPayloadA,
   178  		},
   179  	})
   180  }
   181  
   182  func (s *Suite) TestListPartialMultiMatch(c *gc.C) {
   183  	payloadA, apiPayloadA := s.newPayload("spam")
   184  	payloadB, _ := s.newPayload("eggs")
   185  	payloadC, apiPayloadC := s.newPayload("ham")
   186  	s.state.payloads = append(s.state.payloads, payloadA, payloadB, payloadC)
   187  
   188  	facade := payloads.NewAPI(s.state)
   189  	args := params.PayloadListArgs{
   190  		Patterns: []string{
   191  			"spam",
   192  			"ham",
   193  		},
   194  	}
   195  	results, err := facade.List(args)
   196  	c.Assert(err, jc.ErrorIsNil)
   197  
   198  	c.Check(results, jc.DeepEquals, params.PayloadListResults{
   199  		Results: []params.Payload{
   200  			apiPayloadA,
   201  			apiPayloadC,
   202  		},
   203  	})
   204  }
   205  
   206  func (s *Suite) TestListAllFilters(c *gc.C) {
   207  	pl := payload.FullPayloadInfo{
   208  		Payload: payload.Payload{
   209  			PayloadClass: charm.PayloadClass{
   210  				Name: "spam",
   211  				Type: "docker",
   212  			},
   213  			ID:     "idspam",
   214  			Status: payload.StateRunning,
   215  			Labels: []string{"a-tag"},
   216  			Unit:   "a-application/0",
   217  		},
   218  		Machine: "1",
   219  	}
   220  	apiPayload := api.Payload2api(pl)
   221  	s.state.payloads = append(s.state.payloads, pl)
   222  
   223  	facade := payloads.NewAPI(s.state)
   224  	patterns := []string{
   225  		"spam",               // name
   226  		"docker",             // type
   227  		"idspam",             // ID
   228  		payload.StateRunning, // status
   229  		"a-application/0",    // unit
   230  		"1",                  // machine
   231  		"a-tag",              // tags
   232  	}
   233  	for _, pattern := range patterns {
   234  		c.Logf("trying pattern %q", pattern)
   235  
   236  		args := params.PayloadListArgs{
   237  			Patterns: []string{
   238  				pattern,
   239  			},
   240  		}
   241  		results, err := facade.List(args)
   242  		c.Assert(err, jc.ErrorIsNil)
   243  
   244  		c.Check(results, jc.DeepEquals, params.PayloadListResults{
   245  			Results: []params.Payload{
   246  				apiPayload,
   247  			},
   248  		})
   249  	}
   250  }
   251  
   252  type stubState struct {
   253  	stub *testing.Stub
   254  
   255  	payloads []payload.FullPayloadInfo
   256  }
   257  
   258  func (s *stubState) ListAll() ([]payload.FullPayloadInfo, error) {
   259  	s.stub.AddCall("ListAll")
   260  	if err := s.stub.NextErr(); err != nil {
   261  		return nil, errors.Trace(err)
   262  	}
   263  
   264  	return s.payloads, nil
   265  }