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