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  }