github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/authentication/visitor_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package authentication_test 5 6 import ( 7 "net/http" 8 "net/http/cookiejar" 9 "net/http/httptest" 10 "net/url" 11 12 "github.com/juju/juju/api/authentication" 13 "github.com/juju/testing" 14 jc "github.com/juju/testing/checkers" 15 gc "gopkg.in/check.v1" 16 "gopkg.in/macaroon-bakery.v1/httpbakery" 17 ) 18 19 type VisitorSuite struct { 20 testing.IsolationSuite 21 22 jar *cookiejar.Jar 23 client *httpbakery.Client 24 server *httptest.Server 25 handler http.Handler 26 } 27 28 var _ = gc.Suite(&VisitorSuite{}) 29 30 func (s *VisitorSuite) SetUpTest(c *gc.C) { 31 s.IsolationSuite.SetUpTest(c) 32 var err error 33 s.jar, err = cookiejar.New(nil) 34 c.Assert(err, jc.ErrorIsNil) 35 s.client = httpbakery.NewClient() 36 s.client.Jar = s.jar 37 s.handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) 38 s.server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 39 s.handler.ServeHTTP(w, r) 40 })) 41 s.AddCleanup(func(c *gc.C) { s.server.Close() }) 42 } 43 44 func (s *VisitorSuite) TestVisitWebPage(c *gc.C) { 45 v := authentication.NewVisitor("bob", func(username string) (string, error) { 46 c.Assert(username, gc.Equals, "bob") 47 return "hunter2", nil 48 }) 49 var formUser, formPassword string 50 s.handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 51 r.ParseForm() 52 formUser = r.Form.Get("user") 53 formPassword = r.Form.Get("password") 54 }) 55 err := v.VisitWebPage(s.client, map[string]*url.URL{ 56 "juju_userpass": mustParseURL(s.server.URL), 57 }) 58 c.Assert(err, jc.ErrorIsNil) 59 c.Assert(formUser, gc.Equals, "bob") 60 c.Assert(formPassword, gc.Equals, "hunter2") 61 } 62 63 func (s *VisitorSuite) TestVisitWebPageMethodNotSupported(c *gc.C) { 64 v := authentication.NewVisitor("bob", nil) 65 err := v.VisitWebPage(s.client, map[string]*url.URL{}) 66 c.Assert(err, gc.Equals, httpbakery.ErrMethodNotSupported) 67 } 68 69 func (s *VisitorSuite) TestVisitWebPageErrorResult(c *gc.C) { 70 v := authentication.NewVisitor("bob", func(username string) (string, error) { 71 return "hunter2", nil 72 }) 73 s.handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 74 http.Error(w, `{"Message":"bleh"}`, http.StatusInternalServerError) 75 }) 76 err := v.VisitWebPage(s.client, map[string]*url.URL{ 77 "juju_userpass": mustParseURL(s.server.URL), 78 }) 79 c.Assert(err, gc.ErrorMatches, "bleh") 80 } 81 82 func mustParseURL(s string) *url.URL { 83 u, err := url.Parse(s) 84 if err != nil { 85 panic(err) 86 } 87 return u 88 }