1
// Copyright 2014 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
4
package charmstore // import "gopkg.in/juju/charmstore.v5-unstable/internal/charmstore"
9
"github.com/juju/testing/httptesting"
10
gc "gopkg.in/check.v1"
12
"gopkg.in/juju/charmstore.v5-unstable/internal/router"
13
"gopkg.in/juju/charmstore.v5-unstable/internal/storetesting"
16
var serverParams = ServerParams{
17
AuthUsername: "test-user",
18
AuthPassword: "test-password",
19
IdentityAPIURL: "http://0.1.2.3",
22
type ServerSuite struct {
23
storetesting.IsolatedMgoESSuite
26
var _ = gc.Suite(&ServerSuite{})
28
func (s *ServerSuite) TestNewServerWithNoVersions(c *gc.C) {
29
h, err := NewServer(s.Session.DB("foo"), nil, serverParams, nil)
30
c.Assert(err, gc.ErrorMatches, `charm store server must serve at least one version of the API`)
34
type versionResponse struct {
39
func (s *ServerSuite) TestNewServerWithVersions(c *gc.C) {
40
db := s.Session.DB("foo")
41
serveVersion := func(vers string) NewAPIHandlerFunc {
42
return func(p *Pool, config ServerParams, _ string) HTTPCloseHandler {
43
return nopCloseHandler{
44
router.HandleJSON(func(_ http.Header, req *http.Request) (interface{}, error) {
45
return versionResponse{
54
h, err := NewServer(db, nil, serverParams, map[string]NewAPIHandlerFunc{
55
"version1": serveVersion("version1"),
57
c.Assert(err, gc.IsNil)
59
assertServesVersion(c, h, "version1")
60
assertDoesNotServeVersion(c, h, "version2")
61
assertDoesNotServeVersion(c, h, "version3")
63
h, err = NewServer(db, nil, serverParams, map[string]NewAPIHandlerFunc{
64
"version1": serveVersion("version1"),
65
"version2": serveVersion("version2"),
67
c.Assert(err, gc.IsNil)
69
assertServesVersion(c, h, "version1")
70
assertServesVersion(c, h, "version2")
71
assertDoesNotServeVersion(c, h, "version3")
73
h, err = NewServer(db, nil, serverParams, map[string]NewAPIHandlerFunc{
74
"version1": serveVersion("version1"),
75
"version2": serveVersion("version2"),
76
"version3": serveVersion("version3"),
78
c.Assert(err, gc.IsNil)
80
assertServesVersion(c, h, "version1")
81
assertServesVersion(c, h, "version2")
82
assertServesVersion(c, h, "version3")
84
h, err = NewServer(db, nil, serverParams, map[string]NewAPIHandlerFunc{
85
"version1": serveVersion("version1"),
88
c.Assert(err, gc.IsNil)
90
assertServesVersion(c, h, "")
91
assertServesVersion(c, h, "version1")
94
func (s *ServerSuite) TestNewServerWithConfig(c *gc.C) {
96
params := ServerParams{
97
AuthUsername: "test-user",
98
AuthPassword: "test-password",
99
IdentityAPIURL: "http://0.1.2.3/",
101
serveConfig := func(p *Pool, config ServerParams, _ string) HTTPCloseHandler {
102
return nopCloseHandler{
103
router.HandleJSON(func(_ http.Header, req *http.Request) (interface{}, error) {
108
h, err := NewServer(s.Session.DB("foo"), nil, params, map[string]NewAPIHandlerFunc{
109
"version1": serveConfig,
111
c.Assert(err, gc.IsNil)
114
// The IdentityLocation field is filled out from the IdentityAPIURL
115
// and the final slash is trimmed.
117
httptesting.AssertJSONCall(c, httptesting.JSONCallParams{
119
URL: "/version1/some/path",
120
ExpectBody: ServerParams{
121
AuthUsername: "test-user",
122
AuthPassword: "test-password",
123
IdentityAPIURL: "http://0.1.2.3",
124
IdentityLocation: "http://0.1.2.3",
129
func (s *ServerSuite) TestNewServerWithElasticSearch(c *gc.C) {
130
params := ServerParams{
131
AuthUsername: "test-user",
132
AuthPassword: "test-password",
133
IdentityAPIURL: "http://0.1.2.3",
135
serveConfig := func(p *Pool, config ServerParams, _ string) HTTPCloseHandler {
136
return nopCloseHandler{
137
router.HandleJSON(func(_ http.Header, req *http.Request) (interface{}, error) {
142
h, err := NewServer(s.Session.DB("foo"), &SearchIndex{s.ES, s.TestIndex}, params,
143
map[string]NewAPIHandlerFunc{
144
"version1": serveConfig,
146
c.Assert(err, gc.IsNil)
148
httptesting.AssertJSONCall(c, httptesting.JSONCallParams{
150
URL: "/version1/some/path",
151
ExpectBody: ServerParams{
152
AuthUsername: "test-user",
153
AuthPassword: "test-password",
154
IdentityAPIURL: "http://0.1.2.3",
155
IdentityLocation: "http://0.1.2.3",
160
func assertServesVersion(c *gc.C, h http.Handler, vers string) {
165
httptesting.AssertJSONCall(c, httptesting.JSONCallParams{
167
URL: path + "/some/path",
168
ExpectBody: versionResponse{
175
func assertDoesNotServeVersion(c *gc.C, h http.Handler, vers string) {
176
rec := httptesting.DoRequest(c, httptesting.DoRequestParams{
178
URL: "/" + vers + "/some/path",
180
c.Assert(rec.Code, gc.Equals, http.StatusNotFound)
183
type nopCloseHandler struct {
187
func (nopCloseHandler) Close() {