~andrewjbeach/juju-ci-tools/make-local-patcher

« back to all changes in this revision

Viewing changes to tests/test_jujucharm.py

  • Committer: Aaron Bentley
  • Date: 2015-08-19 15:07:08 UTC
  • mto: This revision was merged to the branch mainline in revision 1069.
  • Revision ID: aaron.bentley@canonical.com-20150819150708-88xesx4iardg12b4
Wait for proc to exit after signalling.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
"""Tests for charm related classes and helpers."""
2
 
 
3
 
import os
4
 
 
5
 
import yaml
6
 
 
7
 
from jujucharm import (
8
 
    Charm,
9
 
    CharmCommand,
10
 
    local_charm_path,
11
 
    sane_charm_store_api_url,
12
 
    )
13
 
from tests import (
14
 
    temp_os_env,
15
 
    TestCase,
16
 
    )
17
 
from utility import (
18
 
    JujuAssertionError,
19
 
    temp_dir,
20
 
    )
21
 
 
22
 
 
23
 
class TestCharm(TestCase):
24
 
 
25
 
    def test_create_default(self):
26
 
        charm = Charm('test', 'a summary')
27
 
        expected = {
28
 
            'name': 'test',
29
 
            'summary': 'a summary',
30
 
            'series': ('xenial', 'trusty'),
31
 
            'maintainer': 'juju-qa@lists.canonical.com',
32
 
            'description': 'description',
33
 
        }
34
 
        self.assertEqual(charm.metadata, expected)
35
 
 
36
 
    def test_default_series_default(self):
37
 
        charm = Charm('test', 'a summary')
38
 
        self.assertEqual(charm.default_series, 'xenial')
39
 
 
40
 
    def test_default_series_unset(self):
41
 
        charm = Charm('test', 'a summary')
42
 
        del charm.metadata['series']
43
 
        self.assertEqual(charm.default_series, 'xenial')
44
 
 
45
 
    def test_default_series_single(self):
46
 
        charm = Charm('test', 'a summary', series='wily')
47
 
        self.assertEqual(charm.default_series, 'wily')
48
 
 
49
 
    def test_default_series_list(self):
50
 
        charm = Charm('test', 'a summary', series=['trusty', 'xenial'])
51
 
        self.assertEqual(charm.default_series, 'trusty')
52
 
 
53
 
    def test_to_dir(self):
54
 
        charm = Charm('test', 'a summary')
55
 
        charm.metadata['description'] = 'a description'
56
 
        del charm.metadata['maintainer']
57
 
        with temp_dir() as charm_dir:
58
 
            charm.to_dir(charm_dir)
59
 
            metafile = os.path.join(charm_dir, 'metadata.yaml')
60
 
            with open(metafile) as f:
61
 
                metadata = yaml.load(f)
62
 
        expected = {
63
 
            'name': 'test',
64
 
            'summary': 'a summary',
65
 
            'description': 'a description',
66
 
            'series': ['xenial', 'trusty'],
67
 
        }
68
 
        self.assertEqual(metadata, expected)
69
 
 
70
 
    def test_to_repo_dir(self):
71
 
        charm = Charm('test', 'a summary', series='wily')
72
 
        with temp_dir() as repo_dir:
73
 
            charm.to_repo_dir(repo_dir)
74
 
            metafile = os.path.join(repo_dir, 'wily', 'test', 'metadata.yaml')
75
 
            with open(metafile) as f:
76
 
                metadata = yaml.load(f)
77
 
        expected = {
78
 
            'name': 'test',
79
 
            'summary': 'a summary',
80
 
            'series': 'wily',
81
 
            'maintainer': Charm.DEFAULT_MAINTAINER,
82
 
            'description': Charm.DEFAULT_DESCRIPTION,
83
 
        }
84
 
        self.assertEqual(metadata, expected)
85
 
 
86
 
    def test_add_hook_script(self):
87
 
        charm = Charm('test', 'a summary')
88
 
        config_changed = '#!/bin/sh\necho changed'
89
 
        charm.add_hook_script('config-changed', config_changed)
90
 
        with temp_dir() as charm_dir:
91
 
            charm.to_dir(charm_dir)
92
 
            hookfile = os.path.join(charm_dir, 'hooks', 'config-changed')
93
 
            self.assertTrue(os.access(hookfile, os.X_OK))
94
 
            with open(hookfile) as f:
95
 
                self.assertEqual(f.read(), config_changed)
96
 
 
97
 
    def test_add_hook_multiple(self):
98
 
        charm = Charm('test', 'a summary')
99
 
        config_changed = '#!/bin/sh\necho changed'
100
 
        upgrade_charm = '#!/bin/sh\necho upgraded'
101
 
        charm.add_hook_script('config-changed', config_changed)
102
 
        charm.add_hook_script('upgrade-charm', upgrade_charm)
103
 
        with temp_dir() as charm_dir:
104
 
            charm.to_dir(charm_dir)
105
 
            changedfile = os.path.join(charm_dir, 'hooks', 'config-changed')
106
 
            self.assertTrue(os.access(changedfile, os.X_OK))
107
 
            with open(changedfile) as f:
108
 
                self.assertEqual(f.read(), config_changed)
109
 
            upgradedfile = os.path.join(charm_dir, 'hooks', 'upgrade-charm')
110
 
            self.assertTrue(os.access(upgradedfile, os.X_OK))
111
 
            with open(upgradedfile) as f:
112
 
                self.assertEqual(f.read(), upgrade_charm)
113
 
 
114
 
    def test_ensure_valid_name(self):
115
 
        Charm('good-name', 'A charm with a valid name')
116
 
        charm = Charm('BAD_NAME', 'A charm with a bad name',
117
 
                      ensure_valid_name=False)
118
 
        self.assertIsNone(Charm.NAME_REGEX.match(charm.metadata['name']))
119
 
        self.assertRaisesRegexp(
120
 
            JujuAssertionError,
121
 
            'Invalid Juju Charm Name, "BAD_NAME" does not match ".*"\.',
122
 
            Charm, 'BAD_NAME', 'A charm with a checked bad name')
123
 
 
124
 
    def test_ensure_valid_name_anchoring(self):
125
 
        for name in ['~bad-name', 'bad-name-!']:
126
 
            self.assertRaises(JujuAssertionError, Charm, name,
127
 
                              'A charm with a partially correct name')
128
 
 
129
 
 
130
 
class TestLocalCharm(TestCase):
131
 
 
132
 
    def test_make_local_charm_1x(self):
133
 
        charm = 'mysql'
134
 
        path = local_charm_path(charm, '1.25.0')
135
 
        self.assertEqual(path, 'local:mysql')
136
 
 
137
 
    def test_make_local_charm_1x_series(self):
138
 
        charm = 'mysql'
139
 
        path = local_charm_path(charm, '1.25.0', series='trusty')
140
 
        self.assertEqual(path, 'local:trusty/mysql')
141
 
 
142
 
    def test_make_local_charm_2x(self):
143
 
        charm = 'mysql'
144
 
        path = local_charm_path(charm, '2.0.0', repository='/tmp/charms')
145
 
        self.assertEqual(path, '/tmp/charms/mysql')
146
 
 
147
 
    def test_make_local_charm_2x_os_env(self):
148
 
        charm = 'mysql'
149
 
        with temp_os_env('JUJU_REPOSITORY', '/home/foo/repository'):
150
 
            path = local_charm_path(charm, '2.0.0')
151
 
        self.assertEqual(path, '/home/foo/repository/charms/mysql')
152
 
 
153
 
    def test_make_local_charm_2x_win(self):
154
 
        charm = 'mysql'
155
 
        with temp_os_env('JUJU_REPOSITORY', '/home/foo/repository'):
156
 
            path = local_charm_path(charm, '2.0.0', platform='win')
157
 
        self.assertEqual(path, '/home/foo/repository/charms-win/mysql')
158
 
 
159
 
    def test_make_local_charm_2x_centos(self):
160
 
        charm = 'mysql'
161
 
        with temp_os_env('JUJU_REPOSITORY', '/home/foo/repository'):
162
 
            path = local_charm_path(charm, '2.0.0', platform='centos')
163
 
        self.assertEqual(path, '/home/foo/repository/charms-centos/mysql')
164
 
 
165
 
 
166
 
class TestSaneCharmStoreApiUrl(TestCase):
167
 
 
168
 
    def test_returns_default_value(self):
169
 
        self.assertEqual(
170
 
            sane_charm_store_api_url(None),
171
 
            CharmCommand.default_api_url)
172
 
 
173
 
    def test_replaces_places_api_characters(self):
174
 
        api = 'https://example.com'
175
 
        expected = 'https://api.example.com/charmstore'
176
 
        self.assertEqual(
177
 
            sane_charm_store_api_url(api),
178
 
            expected)
179
 
 
180
 
    def test_replaces_www_characters(self):
181
 
        api = 'https://www.example.com'
182
 
        expected = 'https://api.example.com/charmstore'
183
 
        self.assertEqual(
184
 
            sane_charm_store_api_url(api),
185
 
            expected)