68
68
self.assertEqual('~foo/bar/baz/25', charm_id)
70
70
def test_construct_charm_id_promulgated(self):
71
# Promulgation has no effect on this ID.
71
72
payload = factory.get_payload_json(owner='foo', series='bar',
72
73
name='baz', promulgated=True)
73
74
factory.add_store_data(payload, revision=25, promulgated=True)
81
82
charm_id = construct_charm_id(payload)
82
83
self.assertEqual('~foo/bar/baz/0', charm_id)
85
def test_construct_charm_id_no_revision(self):
86
payload = factory.get_payload_json(owner='foo', series='bar',
88
charm_id = construct_charm_id(payload, use_revision=False)
89
self.assertEqual('~foo/bar/baz', charm_id)
85
92
class CharmTestCase(TestCase):
86
93
"""Unit tests for the Charm model that wraps charm representations."""
1293
1300
ignore, charm_with_error = factory.makeCharm(
1294
1301
self.db, name='charm_with_error', charm_error=True)
1295
1302
result = find_charms(self.db)
1296
self.assertEqual(1, result.count())
1303
self.assertEqual(1, len(result))
1297
1304
self.assertEqual(valid_charm, result[0])
1299
1306
def test_find_charms_invalid_included(self):
1303
1310
ignore, charm_with_error = factory.makeCharm(
1304
1311
self.db, name='charm_with_error', charm_error=True)
1305
1312
result = find_charms(self.db, valid_charms_only=False)
1306
self.assertEqual(2, result.count())
1313
self.assertEqual(2, len(result))
1308
1315
def test_find_charms_with_more_parameters(self):
1309
1316
# Any parameter of Collection.find() can be specified.
1310
1317
ignore, charm_1 = factory.makeCharm(self.db, name='valid_charm_1')
1311
1318
ignore, charm_2 = factory.makeCharm(self.db, name='valid_charm_2')
1312
1319
result = find_charms(self.db, {'name': 'does-not-exist'})
1313
self.assertEqual(0, result.count())
1320
self.assertEqual(0, len(result))
1314
1321
result = find_charms(self.db, spec={'name': 'valid_charm_1'})
1315
self.assertEqual(1, result.count())
1322
self.assertEqual(1, len(result))
1316
1323
self.assertEqual(charm_1, result[0])
1317
1324
result = find_charms(
1318
1325
self.db, spec={'name': 'valid_charm_1'}, fields=('bname', 'name'))
1337
1344
self.db, promulgated=True)
1338
1345
factory.makeCharm(self.db)
1339
1346
result = find_charms(self.db, only_promulgated=True)
1340
self.assertEqual(1, result.count())
1347
self.assertEqual(1, len(result))
1341
1348
self.assertEqual(promulgated_charm, result[0])
1350
def test_sort(self):
1351
charm_1 = factory.makeCharm(self.db, owner='a', series='b')[0]
1352
charm_2 = factory.makeCharm(self.db, owner='b', series='a')[0]
1353
charms = find_charms(self.db, sort=[('owner', pymongo.ASCENDING)])
1354
self.assertEqual([charm_1, charm_2], [c['_id'] for c in charms])
1355
charms = find_charms(self.db, sort=[('owner', pymongo.DESCENDING)])
1356
self.assertEqual([charm_2, charm_1], [c['_id'] for c in charms])
1344
1359
class TestCharmSource(MongoTestBase):
1359
1374
factory.makeCharm(self.db)[0]
1360
1375
# Create a charm which is index-incompatible with the previous one.
1361
1376
factory.makeCharm(self.db,
1362
owner={'first': 'J', 'last': 'Random'})[0]
1377
maintainer={'first': 'J', 'last': 'Random'})[0]
1363
1378
handler = self.get_handler('sync-index')
1364
1379
with patch('charmworld.models.configure_logging'):
1365
1380
with patch('charmworld.models.get_ini', lambda: INI):
1372
1387
def test_save_deletes_on_error(self):
1373
1388
self.use_index_client()
1374
1389
source = CharmSource.from_request(self)
1375
source.save({'_id': 'a', 'b': {}})
1376
1397
with self.assertRaises(ElasticHttpError):
1377
source.save({'_id': 'a', 'b': 'c'})
1378
with self.assertRaises(ElasticHttpNotFoundError):
1379
self.index_client.get('a')
1405
self.assertIs(None, self.index_client.get('a'))
1382
1408
class TestOptionsStorage(TestCase):