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