github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/core/crossmodel/offerurl_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package crossmodel_test 5 6 import ( 7 "fmt" 8 "regexp" 9 "strings" 10 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/core/crossmodel" 15 ) 16 17 type OfferURLSuite struct{} 18 19 var _ = gc.Suite(&OfferURLSuite{}) 20 21 var urlTests = []struct { 22 s, err string 23 exact string 24 url *crossmodel.OfferURL 25 }{{ 26 s: "controller:user/modelname.applicationname", 27 url: &crossmodel.OfferURL{"controller", "user", "modelname", "applicationname"}, 28 }, { 29 s: "controller:user/modelname.applicationname:rel", 30 url: &crossmodel.OfferURL{"controller", "user", "modelname", "applicationname:rel"}, 31 }, { 32 s: "modelname.applicationname", 33 url: &crossmodel.OfferURL{"", "", "modelname", "applicationname"}, 34 }, { 35 s: "modelname.applicationname:rel", 36 url: &crossmodel.OfferURL{"", "", "modelname", "applicationname:rel"}, 37 }, { 38 s: "user/modelname.applicationname:rel", 39 url: &crossmodel.OfferURL{"", "user", "modelname", "applicationname:rel"}, 40 }, { 41 s: "/modelname.applicationname", 42 url: &crossmodel.OfferURL{"", "", "modelname", "applicationname"}, 43 exact: "modelname.applicationname", 44 }, { 45 s: "/modelname.applicationname:rel", 46 url: &crossmodel.OfferURL{"", "", "modelname", "applicationname:rel"}, 47 exact: "modelname.applicationname:rel", 48 }, { 49 s: "user/modelname.applicationname", 50 url: &crossmodel.OfferURL{"", "user", "modelname", "applicationname"}, 51 }, { 52 s: "controller:modelname", 53 err: `application offer URL is missing application`, 54 }, { 55 s: "controller:user/modelname", 56 err: `application offer URL is missing application`, 57 }, { 58 s: "model", 59 err: `application offer URL is missing application`, 60 }, { 61 s: "/user/model", 62 err: `application offer URL is missing application`, 63 }, { 64 s: "model.application@bad", 65 err: `application name "application@bad" not valid`, 66 }, { 67 s: "user[bad/model.application", 68 err: `user name "user\[bad" not valid`, 69 }, { 70 s: "user/[badmodel.application", 71 err: `model name "\[badmodel" not valid`, 72 }} 73 74 func (s *OfferURLSuite) TestParseURL(c *gc.C) { 75 for i, t := range urlTests { 76 c.Logf("test %d: %q", i, t.s) 77 url, err := crossmodel.ParseOfferURL(t.s) 78 79 match := t.s 80 if t.exact != "" { 81 match = t.exact 82 } 83 if t.url != nil { 84 c.Assert(err, gc.IsNil) 85 c.Check(url, gc.DeepEquals, t.url) 86 c.Check(url.String(), gc.Equals, match) 87 } 88 if t.err != "" { 89 t.err = strings.Replace(t.err, "$URL", regexp.QuoteMeta(fmt.Sprintf("%q", t.s)), -1) 90 c.Check(err, gc.ErrorMatches, t.err) 91 c.Check(url, gc.IsNil) 92 } 93 } 94 } 95 96 var urlPartsTests = []struct { 97 s, err string 98 url *crossmodel.OfferURLParts 99 }{{ 100 s: "controller:/user/modelname.applicationname", 101 url: &crossmodel.OfferURLParts{"controller", "user", "modelname", "applicationname"}, 102 }, { 103 s: "user/modelname.applicationname", 104 url: &crossmodel.OfferURLParts{"", "user", "modelname", "applicationname"}, 105 }, { 106 s: "user/modelname", 107 url: &crossmodel.OfferURLParts{"", "user", "modelname", ""}, 108 }, { 109 s: "modelname.application", 110 url: &crossmodel.OfferURLParts{"", "", "modelname", "application"}, 111 }, { 112 s: "controller:/modelname", 113 url: &crossmodel.OfferURLParts{"controller", "", "modelname", ""}, 114 }, { 115 s: "controller:", 116 url: &crossmodel.OfferURLParts{Source: "controller"}, 117 }, { 118 s: "", 119 url: &crossmodel.OfferURLParts{}, 120 }, { 121 s: "user/prod/applicationname/extra", 122 err: `application offer URL has invalid form, must be \[<user/\]<model>.<appname>: "user/prod/applicationname/extra"`, 123 }, { 124 s: "controller:/user/modelname.application@bad", 125 err: `application name "application@bad" not valid`, 126 }, { 127 s: "controller:/user[bad/modelname.application", 128 err: `user name "user\[bad" not valid`, 129 }, { 130 s: ":foo", 131 err: `application offer URL has invalid form, must be \[<user/\]<model>.<appname>: $URL`, 132 }} 133 134 func (s *OfferURLSuite) TestParseURLParts(c *gc.C) { 135 for i, t := range urlPartsTests { 136 c.Logf("test %d: %q", i, t.s) 137 url, err := crossmodel.ParseOfferURLParts(t.s) 138 139 if t.url != nil { 140 c.Check(err, gc.IsNil) 141 c.Check(url, gc.DeepEquals, t.url) 142 } 143 if t.err != "" { 144 t.err = strings.Replace(t.err, "$URL", regexp.QuoteMeta(fmt.Sprintf("%q", t.s)), -1) 145 c.Assert(err, gc.ErrorMatches, t.err) 146 c.Assert(url, gc.IsNil) 147 } 148 } 149 } 150 151 func (s *OfferURLSuite) TestHasEndpoint(c *gc.C) { 152 url, err := crossmodel.ParseOfferURL("model.application:endpoint") 153 c.Assert(err, jc.ErrorIsNil) 154 c.Check(url.HasEndpoint(), jc.IsTrue) 155 url, err = crossmodel.ParseOfferURL("model.application") 156 c.Assert(err, jc.ErrorIsNil) 157 c.Check(url.HasEndpoint(), jc.IsFalse) 158 url, err = crossmodel.ParseOfferURL("controller:/user/model.application:thing") 159 c.Assert(err, jc.ErrorIsNil) 160 c.Check(url.HasEndpoint(), jc.IsTrue) 161 url, err = crossmodel.ParseOfferURL("controller:/user/model.application") 162 c.Assert(err, jc.ErrorIsNil) 163 c.Check(url.HasEndpoint(), jc.IsFalse) 164 } 165 166 func (s *OfferURLSuite) TestMakeURL(c *gc.C) { 167 url := crossmodel.MakeURL("user", "model", "app", "") 168 c.Assert(url, gc.Equals, "user/model.app") 169 url = crossmodel.MakeURL("user", "model", "app", "ctrl") 170 c.Assert(url, gc.Equals, "ctrl:user/model.app") 171 } 172 173 func (s *OfferURLSuite) TestAsLocal(c *gc.C) { 174 url, err := crossmodel.ParseOfferURL("source:model.application:endpoint") 175 c.Assert(err, jc.ErrorIsNil) 176 expected, err := crossmodel.ParseOfferURL("model.application:endpoint") 177 c.Assert(err, jc.ErrorIsNil) 178 original := *url 179 c.Assert(url.AsLocal(), gc.DeepEquals, expected) 180 c.Assert(*url, gc.DeepEquals, original) 181 }