github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/payload/api/server/public_test.go (about)

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