github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/controller/gui_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package controller_test 5 6 import ( 7 "bytes" 8 "encoding/json" 9 "io/ioutil" 10 "net/http" 11 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/version" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/api/base" 18 "github.com/juju/juju/api/controller" 19 "github.com/juju/juju/apiserver/params" 20 ) 21 22 // sendJSONResponse encodes the given content as JSON and writes it to the 23 // given response writer. 24 func sendJSONResponse(c *gc.C, w http.ResponseWriter, content interface{}) { 25 w.Header().Set("Content-Type", params.ContentTypeJSON) 26 encoder := json.NewEncoder(w) 27 err := encoder.Encode(content) 28 c.Assert(err, jc.ErrorIsNil) 29 } 30 31 // withHTTPClient sets up a fixture with the given address and handle, then 32 // runs the given test and checks that the HTTP handler has been called with 33 // the given method. 34 func withHTTPClient(c *gc.C, address, expectMethod string, handle func(http.ResponseWriter, *http.Request), test func(*controller.Client)) { 35 fix := newHTTPFixture(address, handle) 36 stub := fix.run(c, func(ac base.APICallCloser) { 37 client := controller.NewClient(ac) 38 test(client) 39 }) 40 stub.CheckCalls(c, []testing.StubCall{{expectMethod, nil}}) 41 } 42 43 func (s *Suite) TestGUIArchives(c *gc.C) { 44 response := params.GUIArchiveResponse{ 45 Versions: []params.GUIArchiveVersion{{ 46 Version: version.MustParse("1.0.0"), 47 SHA256: "hash1", 48 Current: false, 49 }, { 50 Version: version.MustParse("2.0.0"), 51 SHA256: "hash2", 52 Current: true, 53 }}, 54 } 55 withHTTPClient(c, "/gui-archive", "GET", func(w http.ResponseWriter, req *http.Request) { 56 defer req.Body.Close() 57 sendJSONResponse(c, w, response) 58 }, func(client *controller.Client) { 59 // Retrieve the GUI archive versions. 60 versions, err := client.GUIArchives() 61 c.Assert(err, jc.ErrorIsNil) 62 c.Assert(versions, jc.DeepEquals, response.Versions) 63 }) 64 } 65 66 func (s *Suite) TestGUIArchivesError(c *gc.C) { 67 withHTTPClient(c, "/gui-archive", "GET", func(w http.ResponseWriter, req *http.Request) { 68 defer req.Body.Close() 69 w.WriteHeader(http.StatusBadRequest) 70 }, func(client *controller.Client) { 71 // Call to get GUI archive versions. 72 versions, err := client.GUIArchives() 73 c.Assert(err, gc.ErrorMatches, "cannot retrieve GUI archives info: .*") 74 c.Assert(versions, gc.IsNil) 75 }) 76 } 77 78 func (s *Suite) TestUploadGUIArchive(c *gc.C) { 79 archive := []byte("archive content") 80 hash, size, vers := "archive-hash", int64(len(archive)), version.MustParse("2.1.0") 81 withHTTPClient(c, "/gui-archive", "POST", func(w http.ResponseWriter, req *http.Request) { 82 defer req.Body.Close() 83 err := req.ParseForm() 84 c.Assert(err, jc.ErrorIsNil) 85 // Check version and content length. 86 c.Assert(req.Form.Get("version"), gc.Equals, vers.String()) 87 c.Assert(req.ContentLength, gc.Equals, size) 88 // Check request body. 89 obtainedArchive, err := ioutil.ReadAll(req.Body) 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(obtainedArchive, gc.DeepEquals, archive) 92 // Check hash. 93 h := req.Form.Get("hash") 94 c.Assert(h, gc.Equals, hash) 95 // Send the response. 96 sendJSONResponse(c, w, params.GUIArchiveVersion{ 97 Current: true, 98 }) 99 }, func(client *controller.Client) { 100 // Upload a new Juju GUI archive. 101 current, err := client.UploadGUIArchive(bytes.NewReader(archive), hash, size, vers) 102 c.Assert(err, jc.ErrorIsNil) 103 c.Assert(current, jc.IsTrue) 104 }) 105 } 106 107 func (s *Suite) TestUploadGUIArchiveError(c *gc.C) { 108 archive := []byte("archive content") 109 hash, size, vers := "archive-hash", int64(len(archive)), version.MustParse("2.1.0") 110 withHTTPClient(c, "/gui-archive", "POST", func(w http.ResponseWriter, req *http.Request) { 111 defer req.Body.Close() 112 w.WriteHeader(http.StatusBadRequest) 113 }, func(client *controller.Client) { 114 // Call to upload a new Juju GUI archive. 115 current, err := client.UploadGUIArchive(bytes.NewReader(archive), hash, size, vers) 116 c.Assert(err, gc.ErrorMatches, "cannot upload the GUI archive: .*") 117 c.Assert(current, jc.IsFalse) 118 }) 119 } 120 121 func (s *Suite) TestSelectGUIVersion(c *gc.C) { 122 vers := version.MustParse("2.0.42") 123 withHTTPClient(c, "/gui-version", "PUT", func(w http.ResponseWriter, req *http.Request) { 124 defer req.Body.Close() 125 // Check request body. 126 var request params.GUIVersionRequest 127 decoder := json.NewDecoder(req.Body) 128 err := decoder.Decode(&request) 129 c.Assert(err, jc.ErrorIsNil) 130 c.Assert(request.Version, gc.Equals, vers) 131 }, func(client *controller.Client) { 132 // Switch to a specific Juju GUI version. 133 err := client.SelectGUIVersion(vers) 134 c.Assert(err, jc.ErrorIsNil) 135 }) 136 } 137 138 func (s *Suite) TestSelectGUIVersionError(c *gc.C) { 139 vers := version.MustParse("2.0.42") 140 withHTTPClient(c, "/gui-version", "PUT", func(w http.ResponseWriter, req *http.Request) { 141 defer req.Body.Close() 142 w.WriteHeader(http.StatusBadRequest) 143 }, func(client *controller.Client) { 144 // Call to select a Juju GUI version. 145 err := client.SelectGUIVersion(vers) 146 c.Assert(err, gc.ErrorMatches, "cannot select GUI version: .*") 147 }) 148 }