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  }