1
from juju.charm.errors import CharmURLError
2
from juju.charm.url import CharmCollection, CharmURL
3
from juju.lib.testing import TestCase
6
class CharmCollectionTest(TestCase):
10
str(CharmCollection("foo", "bar", "baz")), "foo:~bar/baz")
12
str(CharmCollection("ping", None, "pong")), "ping:pong")
15
class CharmURLTest(TestCase):
17
def assert_url(self, url, schema, user, series, name, rev):
18
self.assertEquals(url.collection.schema, schema)
19
self.assertEquals(url.collection.user, user)
20
self.assertEquals(url.collection.series, series)
21
self.assertEquals(url.name, name)
22
self.assertEquals(url.revision, rev)
24
def assert_error(self, err, url_str, message):
26
str(err), "Bad charm URL %r: %s" % (url_str, message))
28
def assert_parse(self, string, schema, user, series, name, rev):
29
url = CharmURL.parse(string)
30
self.assert_url(url, schema, user, series, name, rev)
31
self.assertEquals(str(url), string)
32
self.assertEquals(url.path, string.split(":", 1)[1])
36
"cs:~user/series/name", "cs", "user", "series", "name", None)
38
"cs:~user/series/name-0", "cs", "user", "series", "name", 0)
40
"cs:series/name", "cs", None, "series", "name", None)
42
"cs:series/name-0", "cs", None, "series", "name", 0)
44
"cs:series/name0", "cs", None, "series", "name0", None)
46
"cs:series/n0-0n-n0", "cs", None, "series", "n0-0n-n0", None)
48
"local:series/name", "local", None, "series", "name", None)
50
"local:series/name-0", "local", None, "series", "name", 0)
52
def assert_cannot_parse(self, string, message):
53
err = self.assertRaises(CharmURLError, CharmURL.parse, string)
54
self.assert_error(err, string, message)
56
def test_cannot_parse(self):
57
self.assert_cannot_parse(
58
None, "not a string type")
59
self.assert_cannot_parse(
60
"series/name-1", "no schema specified")
61
self.assert_cannot_parse(
62
"bs:~user/series/name-1", "invalid schema")
63
self.assert_cannot_parse(
64
"cs:~1/series/name-1", "invalid user")
65
self.assert_cannot_parse(
66
"cs:~user/1/name-1", "invalid series")
67
self.assert_cannot_parse(
68
"cs:~user/series/name-1-2", "invalid name")
69
self.assert_cannot_parse(
70
"cs:~user/series/name-1-n-2", "invalid name")
71
self.assert_cannot_parse(
72
"cs:~user/series/name--a-2", "invalid name")
73
self.assert_cannot_parse(
74
"cs:~user/series/huh/name-1", "invalid form")
75
self.assert_cannot_parse(
76
"cs:~user/name", "no series specified")
77
self.assert_cannot_parse(
78
"cs:name", "invalid form")
79
self.assert_cannot_parse(
80
"local:~user/series/name", "users not allowed in local URLs")
81
self.assert_cannot_parse(
82
"local:~user/name", "users not allowed in local URLs")
83
self.assert_cannot_parse(
84
"local:name", "invalid form")
86
def test_revision(self):
87
url1 = CharmURL.parse("cs:foo/bar")
88
error = self.assertRaises(CharmURLError, url1.assert_revision)
90
str(error), "Bad charm URL 'cs:foo/bar': expected a revision")
92
url2 = url1.with_revision(0)
93
url1.collection.schema = "local" # change url1, verify deep copied
94
url2.assert_revision()
95
self.assertEquals(str(url2), "cs:foo/bar-0")
97
url3 = url2.with_revision(999)
98
url3.assert_revision()
99
self.assertEquals(str(url3), "cs:foo/bar-999")
101
def assert_infer(self, string, schema, user, series, name, rev):
102
url = CharmURL.infer(string, "default")
103
self.assert_url(url, schema, user, series, name, rev)
105
def test_infer(self):
107
"name", "cs", None, "default", "name", None)
109
"name-0", "cs", None, "default", "name", 0)
111
"series/name", "cs", None, "series", "name", None)
113
"series/name-0", "cs", None, "series", "name", 0)
115
"cs:name", "cs", None, "default", "name", None)
117
"cs:name-0", "cs", None, "default", "name", 0)
119
"cs:~user/name", "cs", "user", "default", "name", None)
121
"cs:~user/name-0", "cs", "user", "default", "name", 0)
123
"local:name", "local", None, "default", "name", None)
125
"local:name-0", "local", None, "default", "name", 0)
127
def test_cannot_infer(self):
128
err = self.assertRaises(
129
CharmURLError, CharmURL.infer, "name", "invalid!series")
132
"Bad charm URL 'cs:invalid!series/name': invalid series (URL "
133
"inferred from 'name')")
135
err = self.assertRaises(
136
CharmURLError, CharmURL.infer, "~user/name", "default")
139
"Bad charm URL '~user/name': a URL with a user must specify a "