github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/store/lpad_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package store_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	gc "launchpad.net/gocheck"
    10  	"launchpad.net/lpad"
    11  
    12  	"launchpad.net/juju-core/charm"
    13  	"launchpad.net/juju-core/store"
    14  	"launchpad.net/juju-core/testing"
    15  )
    16  
    17  var jsonType = map[string]string{
    18  	"Content-Type": "application/json",
    19  }
    20  
    21  func (s *StoreSuite) TestPublishCharmDistro(c *gc.C) {
    22  	branch := s.dummyBranch(c, "~joe/charms/oneiric/dummy/trunk")
    23  
    24  	// The Distro call will look for bare /charms, first.
    25  	testing.Server.Response(200, jsonType, []byte("{}"))
    26  
    27  	// And then it picks up the tips.
    28  	data := fmt.Sprintf(`[`+
    29  		`["file://%s", "rev1", ["oneiric", "precise"]],`+
    30  		`["file://%s", "%s", []],`+
    31  		`["file:///non-existent/~jeff/charms/precise/bad/trunk", "rev2", []],`+
    32  		`["file:///non-existent/~jeff/charms/precise/bad/skip-me", "rev3", []]`+
    33  		`]`,
    34  		branch.path(), branch.path(), branch.digest())
    35  	testing.Server.Response(200, jsonType, []byte(data))
    36  
    37  	apiBase := lpad.APIBase(testing.Server.URL)
    38  	err := store.PublishCharmsDistro(s.store, apiBase)
    39  
    40  	// Should have a single failure from the trunk branch that doesn't
    41  	// exist. The redundant update with the known digest should be
    42  	// ignored, and skip-me isn't a supported branch name so it's
    43  	// ignored as well.
    44  	c.Assert(err, gc.ErrorMatches, `1 branch\(es\) failed to be published`)
    45  	berr := err.(store.PublishBranchErrors)[0]
    46  	c.Assert(berr.URL, gc.Equals, "file:///non-existent/~jeff/charms/precise/bad/trunk")
    47  	c.Assert(berr.Err, gc.ErrorMatches, "(?s).*bzr: ERROR: Not a branch.*")
    48  
    49  	for _, url := range []string{"cs:oneiric/dummy", "cs:precise/dummy-0", "cs:~joe/oneiric/dummy-0"} {
    50  		dummy, err := s.store.CharmInfo(charm.MustParseURL(url))
    51  		c.Assert(err, gc.IsNil)
    52  		c.Assert(dummy.Meta().Name, gc.Equals, "dummy")
    53  	}
    54  
    55  	// The known digest should have been ignored, so revision is still at 0.
    56  	_, err = s.store.CharmInfo(charm.MustParseURL("cs:~joe/oneiric/dummy-1"))
    57  	c.Assert(err, gc.Equals, store.ErrNotFound)
    58  
    59  	// bare /charms lookup
    60  	req := testing.Server.WaitRequest()
    61  	c.Assert(req.Method, gc.Equals, "GET")
    62  	c.Assert(req.URL.Path, gc.Equals, "/charms")
    63  
    64  	// tips request
    65  	req = testing.Server.WaitRequest()
    66  	c.Assert(req.Method, gc.Equals, "GET")
    67  	c.Assert(req.URL.Path, gc.Equals, "/charms")
    68  	c.Assert(req.Form["ws.op"], gc.DeepEquals, []string{"getBranchTips"})
    69  	c.Assert(req.Form["since"], gc.IsNil)
    70  
    71  	// Request must be signed by juju.
    72  	c.Assert(req.Header.Get("Authorization"), gc.Matches, `.*oauth_consumer_key="juju".*`)
    73  }