launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/api/client_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package api_test
     5  
     6  import (
     7  	"fmt"
     8  	gc "launchpad.net/gocheck"
     9  	"net/http"
    10  
    11  	"launchpad.net/juju-core/charm"
    12  	jujutesting "launchpad.net/juju-core/juju/testing"
    13  	"launchpad.net/juju-core/state/api"
    14  	"launchpad.net/juju-core/state/api/params"
    15  	"launchpad.net/juju-core/testing"
    16  	jc "launchpad.net/juju-core/testing/checkers"
    17  )
    18  
    19  type clientSuite struct {
    20  	jujutesting.JujuConnSuite
    21  }
    22  
    23  var _ = gc.Suite(&clientSuite{})
    24  
    25  // TODO(jam) 2013-08-27 http://pad.lv/1217282
    26  // Right now most of the direct tests for api.Client behavior are in
    27  // state/apiserver/client/*_test.go
    28  
    29  func (s *clientSuite) TestCloseMultipleOk(c *gc.C) {
    30  	client := s.APIState.Client()
    31  	c.Assert(client.Close(), gc.IsNil)
    32  	c.Assert(client.Close(), gc.IsNil)
    33  	c.Assert(client.Close(), gc.IsNil)
    34  }
    35  
    36  func (s *clientSuite) TestAddLocalCharm(c *gc.C) {
    37  	charmArchive := testing.Charms.Bundle(c.MkDir(), "dummy")
    38  	curl := charm.MustParseURL(
    39  		fmt.Sprintf("local:quantal/%s-%d", charmArchive.Meta().Name, charmArchive.Revision()),
    40  	)
    41  	client := s.APIState.Client()
    42  
    43  	// Test the sanity checks first.
    44  	_, err := client.AddLocalCharm(charm.MustParseURL("cs:quantal/wordpress-1"), nil)
    45  	c.Assert(err, gc.ErrorMatches, `expected charm URL with local: schema, got "cs:quantal/wordpress-1"`)
    46  
    47  	// Upload an archive with its original revision.
    48  	savedURL, err := client.AddLocalCharm(curl, charmArchive)
    49  	c.Assert(err, gc.IsNil)
    50  	c.Assert(savedURL.String(), gc.Equals, curl.String())
    51  
    52  	// Upload a charm directory with changed revision.
    53  	charmDir := testing.Charms.ClonedDir(c.MkDir(), "dummy")
    54  	charmDir.SetDiskRevision(42)
    55  	savedURL, err = client.AddLocalCharm(curl, charmDir)
    56  	c.Assert(err, gc.IsNil)
    57  	c.Assert(savedURL.Revision, gc.Equals, 42)
    58  
    59  	// Upload a charm directory again, revision should be bumped.
    60  	savedURL, err = client.AddLocalCharm(curl, charmDir)
    61  	c.Assert(err, gc.IsNil)
    62  	c.Assert(savedURL.String(), gc.Equals, curl.WithRevision(43).String())
    63  
    64  	// Finally, try the NotImplementedError by mocking the server
    65  	// address to a handler that returns 405 Method Not Allowed for
    66  	// POST.
    67  	http.HandleFunc("/charms", func(w http.ResponseWriter, r *http.Request) {
    68  		if r.Method == "POST" {
    69  			http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
    70  		}
    71  	})
    72  	go func() {
    73  		err = http.ListenAndServe(":8900", nil)
    74  		c.Assert(err, gc.IsNil)
    75  	}()
    76  
    77  	api.SetServerRoot(client, "http://localhost:8900")
    78  	_, err = client.AddLocalCharm(curl, charmArchive)
    79  	c.Assert(err, jc.Satisfies, params.IsCodeNotImplemented)
    80  }