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  }