github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/gui/gui_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gui_test
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"net/url"
    10  	"strings"
    11  
    12  	"github.com/juju/cmd/cmdtesting"
    13  	"github.com/juju/httprequest"
    14  	jc "github.com/juju/testing/checkers"
    15  	"github.com/juju/version"
    16  	"github.com/juju/webbrowser"
    17  	gc "gopkg.in/check.v1"
    18  
    19  	"github.com/juju/juju/api"
    20  	"github.com/juju/juju/apiserver/params"
    21  	"github.com/juju/juju/cmd/juju/gui"
    22  	jujutesting "github.com/juju/juju/juju/testing"
    23  )
    24  
    25  type baseGUISuite struct {
    26  	jujutesting.JujuConnSuite
    27  }
    28  
    29  // run executes the gui command passing the given args.
    30  func (s *baseGUISuite) run(c *gc.C, args ...string) (string, error) {
    31  	ctx, err := cmdtesting.RunCommand(c, gui.NewGUICommandForTest(
    32  		func(connection api.Connection) ([]params.GUIArchiveVersion, error) {
    33  			return []params.GUIArchiveVersion{
    34  				{
    35  					Version: version.MustParse("1.2.3"),
    36  					Current: false,
    37  				}, {
    38  					Version: version.MustParse("4.5.6"),
    39  					Current: true,
    40  				},
    41  			}, nil
    42  		}), args...)
    43  	return strings.Trim(cmdtesting.Stderr(ctx), "\n"), err
    44  }
    45  
    46  func (s *baseGUISuite) patchClient(f func(*httprequest.Client, string) error) {
    47  	if f == nil {
    48  		f = func(*httprequest.Client, string) error {
    49  			return nil
    50  		}
    51  	}
    52  	s.PatchValue(gui.ClientGet, f)
    53  }
    54  
    55  func (s *baseGUISuite) patchBrowser(f func(*url.URL) error) {
    56  	if f == nil {
    57  		f = func(*url.URL) error {
    58  			return nil
    59  		}
    60  	}
    61  	s.PatchValue(gui.WebbrowserOpen, f)
    62  }
    63  
    64  type guiSuite struct {
    65  	baseGUISuite
    66  }
    67  
    68  var _ = gc.Suite(&guiSuite{})
    69  
    70  func (s *guiSuite) guiURL(c *gc.C) string {
    71  	info := s.APIInfo(c)
    72  	return fmt.Sprintf("https://%s/gui/u/%s/%s", info.Addrs[0], "admin", "controller")
    73  }
    74  
    75  func (s *guiSuite) guiOldURL(c *gc.C) string {
    76  	info := s.APIInfo(c)
    77  	return fmt.Sprintf("https://%s/gui/%s/", info.Addrs[0], s.State.ModelUUID())
    78  }
    79  
    80  func (s *guiSuite) TestGUISuccessWithBrowser(c *gc.C) {
    81  	var clientURL, browserURL string
    82  	s.patchClient(func(client *httprequest.Client, u string) error {
    83  		clientURL = u
    84  		return nil
    85  	})
    86  	s.patchBrowser(func(u *url.URL) error {
    87  		browserURL = u.String()
    88  		return nil
    89  	})
    90  	out, err := s.run(c, "--browser", "--hide-credential")
    91  	c.Assert(err, jc.ErrorIsNil)
    92  	guiURL := s.guiURL(c)
    93  	expectOut := "Opening the Juju GUI in your browser.\nIf it does not open, open this URL:\n" + guiURL
    94  	c.Assert(out, gc.Equals, expectOut)
    95  	c.Assert(clientURL, gc.Equals, guiURL)
    96  	c.Assert(browserURL, gc.Equals, guiURL)
    97  }
    98  
    99  func (s *guiSuite) TestGUISuccessWithCredential(c *gc.C) {
   100  	s.patchClient(nil)
   101  	s.patchBrowser(nil)
   102  	out, err := s.run(c)
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	c.Assert(out, jc.Contains, `
   105  Your login credential is:
   106    username: admin
   107    password: dummy-secret`[1:])
   108  }
   109  
   110  func (s *guiSuite) TestGUISuccessNoCredential(c *gc.C) {
   111  	s.patchClient(nil)
   112  	s.patchBrowser(nil)
   113  	out, err := s.run(c, "--hide-credential")
   114  	c.Assert(err, jc.ErrorIsNil)
   115  	c.Assert(out, gc.Not(jc.Contains), "Password")
   116  }
   117  
   118  func (s *guiSuite) TestGUISuccessNoBrowser(c *gc.C) {
   119  	s.patchClient(nil)
   120  	// There is no need to patch the browser open function here.
   121  	out, err := s.run(c, "--hide-credential")
   122  	c.Assert(err, jc.ErrorIsNil)
   123  	c.Assert(out, gc.Equals, fmt.Sprintf(`
   124  GUI 4.5.6 for model "controller" is enabled at:
   125    %s`[1:], s.guiURL(c)))
   126  }
   127  
   128  func (s *guiSuite) TestGUISuccessOldGUI(c *gc.C) {
   129  	s.patchClient(func(client *httprequest.Client, u string) error {
   130  		if strings.Contains(u, "/u/") {
   131  			return errors.New("bad wolf")
   132  		}
   133  		return nil
   134  	})
   135  	// There is no need to patch the browser open function here.
   136  	out, err := s.run(c, "--hide-credential")
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	c.Assert(out, gc.Equals, fmt.Sprintf(`
   139  GUI 4.5.6 for model "controller" is enabled at:
   140    %s`[1:], s.guiOldURL(c)))
   141  }
   142  
   143  func (s *guiSuite) TestGUISuccessNoBrowserDeprecated(c *gc.C) {
   144  	s.patchClient(nil)
   145  	// There is no need to patch the browser open function here.
   146  	out, err := s.run(c, "--no-browser", "--hide-credential")
   147  	c.Assert(err, jc.ErrorIsNil)
   148  	c.Assert(out, gc.Equals, fmt.Sprintf(`
   149  GUI 4.5.6 for model "controller" is enabled at:
   150    %s`[1:], s.guiURL(c)))
   151  }
   152  
   153  func (s *guiSuite) TestGUISuccessBrowserNotFound(c *gc.C) {
   154  	s.patchClient(nil)
   155  	s.patchBrowser(func(u *url.URL) error {
   156  		return webbrowser.ErrNoBrowser
   157  	})
   158  	out, err := s.run(c, "--browser", "--hide-credential")
   159  	c.Assert(err, jc.ErrorIsNil)
   160  	expectOut := "Open this URL in your browser:\n" + s.guiURL(c)
   161  	c.Assert(out, gc.Equals, expectOut)
   162  }
   163  
   164  func (s *guiSuite) TestGUIErrorBrowser(c *gc.C) {
   165  	s.patchClient(nil)
   166  	s.patchBrowser(func(u *url.URL) error {
   167  		return errors.New("bad wolf")
   168  	})
   169  	out, err := s.run(c, "--browser")
   170  	c.Assert(err, gc.ErrorMatches, "cannot open web browser: bad wolf")
   171  	c.Assert(out, gc.Equals, "")
   172  }
   173  
   174  func (s *guiSuite) TestGUIErrorUnavailable(c *gc.C) {
   175  	s.patchClient(func(client *httprequest.Client, u string) error {
   176  		return errors.New("bad wolf")
   177  	})
   178  	out, err := s.run(c, "--browser")
   179  	c.Assert(err, gc.ErrorMatches, "Juju GUI is not available: bad wolf")
   180  	c.Assert(out, gc.Equals, "")
   181  }
   182  
   183  type guiDNSSuite struct {
   184  	baseGUISuite
   185  }
   186  
   187  var _ = gc.Suite(&guiDNSSuite{
   188  	baseGUISuite: baseGUISuite{
   189  		JujuConnSuite: jujutesting.JujuConnSuite{
   190  			ControllerConfigAttrs: map[string]interface{}{
   191  				"api-port":          443,
   192  				"autocert-dns-name": "example.com",
   193  			},
   194  		},
   195  	},
   196  })
   197  
   198  func (s *guiDNSSuite) TestGUISuccess(c *gc.C) {
   199  	s.patchClient(nil)
   200  	// There is no need to patch the browser open function here.
   201  	out, err := s.run(c, "--hide-credential")
   202  	c.Assert(err, jc.ErrorIsNil)
   203  	c.Assert(out, gc.Equals, `
   204  GUI 4.5.6 for model "controller" is enabled at:
   205    https://example.com/gui/u/admin/controller`[1:])
   206  }