77
94
with self.assertRaises(SystemExit) as raised:
95
snapcraft.yaml.Config()
80
97
self.assertEqual(raised.exception.code, 1, 'Wrong exit code returned.')
81
98
self.assertEqual('Circular dependency chain!\n', fake_logger.output)
100
@unittest.mock.patch('snapcraft.yaml.Config.load_plugin')
101
def test_invalid_yaml_missing_name(self, mock_loadPlugin):
104
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
105
self.useFixture(fake_logger)
107
self.make_snapcraft_yaml("""
109
vendor: me <me@me.com>
117
with self.assertRaises(SystemExit) as raised:
118
snapcraft.yaml.Config()
120
self.assertEqual(raised.exception.code, 1, 'Wrong exit code returned.')
122
'Issues while validating snapcraft.yaml: \'name\' is a required property\n',
125
@unittest.mock.patch('snapcraft.yaml.Config.load_plugin')
126
def test_invalid_yaml_invalid_name_as_number(self, mock_loadPlugin):
129
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
130
self.useFixture(fake_logger)
132
self.make_snapcraft_yaml("""name: 1
134
vendor: me <me@me.com>
142
with self.assertRaises(SystemExit) as raised:
143
snapcraft.yaml.Config()
145
self.assertEqual(raised.exception.code, 1, 'Wrong exit code returned.')
147
'Issues while validating snapcraft.yaml: 1 is not of type \'string\'\n',
150
@unittest.mock.patch('snapcraft.yaml.Config.load_plugin')
151
def test_invalid_yaml_invalid_name_chars(self, mock_loadPlugin):
154
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
155
self.useFixture(fake_logger)
157
self.make_snapcraft_yaml("""name: myapp@me_1.0
159
vendor: me <me@me.com>
167
with self.assertRaises(SystemExit) as raised:
168
snapcraft.yaml.Config()
170
self.assertEqual(raised.exception.code, 1, 'Wrong exit code returned.')
172
'Issues while validating snapcraft.yaml: \'myapp@me_1.0\' does not match \'^[a-z0-9][a-z0-9+-]*$\'\n',
175
@unittest.mock.patch('snapcraft.yaml.Config.load_plugin')
176
def test_invalid_yaml_missing_description(self, mock_loadPlugin):
179
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
180
self.useFixture(fake_logger)
182
self.make_snapcraft_yaml("""name: test
184
vendor: me <me@me.com>
191
with self.assertRaises(SystemExit) as raised:
192
snapcraft.yaml.Config()
194
self.assertEqual(raised.exception.code, 1, 'Wrong exit code returned.')
196
'Issues while validating snapcraft.yaml: \'description\' is a required property\n',
200
class TestValidation(TestCase):
207
'name': 'my-package-1',
208
'version': '1.0-snapcraft1~ppa1',
209
'vendor': 'Me <me@me.com>',
210
'summary': 'my summary less that 79 chars',
211
'description': 'description which can be pretty long',
219
def test_required_properties(self):
220
for key in self.data:
221
data = self.data.copy()
222
with self.subTest(key=key):
225
with self.assertRaises(jsonschema.ValidationError) as raised:
226
snapcraft.yaml._validate_snapcraft_yaml(data)
228
expected_message = '\'{}\' is a required property'.format(key)
229
self.assertEqual(raised.exception.message, expected_message, msg=data)
231
def test_invalid_names(self):
238
for name in invalid_names:
239
data = self.data.copy()
240
with self.subTest(key=name):
243
with self.assertRaises(jsonschema.ValidationError) as raised:
244
snapcraft.yaml._validate_snapcraft_yaml(data)
246
expected_message = '\'{}\' does not match \'^[a-z0-9][a-z0-9+-]*$\''.format(name)
247
self.assertEqual(raised.exception.message, expected_message, msg=data)
249
def test_summary_too_long(self):
250
self.data['summary'] = 'a' * 80
251
with self.assertRaises(jsonschema.ValidationError) as raised:
252
snapcraft.yaml._validate_snapcraft_yaml(self.data)
254
expected_message = '\'{}\' is too long'.format(self.data['summary'])
255
self.assertEqual(raised.exception.message, expected_message, msg=self.data)
257
def test_valid_types(self):
258
self.data['type'] = 'app'
259
snapcraft.yaml._validate_snapcraft_yaml(self.data)
261
self.data['type'] = 'framework'
262
snapcraft.yaml._validate_snapcraft_yaml(self.data)
264
def test_invalid_types(self):
273
for t in invalid_types:
274
data = self.data.copy()
275
with self.subTest(key=t):
278
with self.assertRaises(jsonschema.ValidationError) as raised:
279
snapcraft.yaml._validate_snapcraft_yaml(data)
281
expected_message = '\'{}\' is not one of [\'app\', \'framework\']'.format(t)
282
self.assertEqual(raised.exception.message, expected_message, msg=data)
284
def test_valid_services(self):
285
self.data['services'] = [
288
'start': 'binary1 start',
293
'stop': 'binary2 --stop',
300
snapcraft.yaml._validate_snapcraft_yaml(self.data)
302
def test_services_required_properties(self):
303
self.data['services'] = [
305
'start': 'binary1 start',
309
with self.assertRaises(jsonschema.ValidationError) as raised:
310
snapcraft.yaml._validate_snapcraft_yaml(self.data)
312
expected_message = '\'name\' is a required property'
313
self.assertEqual(raised.exception.message, expected_message, msg=self.data)
315
def test_schema_file_not_found(self):
316
mock_the_open = unittest.mock.mock_open()
317
mock_the_open.side_effect = FileNotFoundError()
319
with unittest.mock.patch('snapcraft.yaml.open', mock_the_open, create=True):
320
with self.assertRaises(snapcraft.yaml.SchemaNotFoundError) as raised:
321
snapcraft.yaml._validate_snapcraft_yaml(self.data)
323
expected_path = os.path.join(snapcraft.common.get_schemadir(), 'snapcraft.yaml')
324
mock_the_open.assert_called_once_with(expected_path)
325
expected_message = 'Schema is missing, could not validate snapcraft.yaml, check installation'
326
self.assertEqual(raised.exception.message, expected_message)