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  }