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 }