1120
1128
def test_save_file_ignores_invalid_icons(self):
1121
1129
path = self.use_context(temp_dir())
1123
1130
with file(join(path, 'icon.svg'), 'w') as f:
1125
1132
files = self.save_files(path)
1126
1133
self.assertEqual([], files)
1127
# No width or height provided.
1135
def test_provides_content_type(self):
1136
path = self.use_context(temp_dir())
1128
1137
with file(join(path, 'icon.svg'), 'w') as f:
1129
1138
f.write('<?xml version="1.0"?><svg></svg>')
1130
files = self.save_files(path)
1131
self.assertEqual([], files)
1133
def test_adds_viewbox_to_icons(self):
1134
path = self.use_context(temp_dir())
1135
with file(join(path, 'icon.svg'), 'w') as f:
1136
f.write('<?xml version="1.0"?><svg width="10" height="10"></svg>')
1137
self.save_files(path)
1138
icon_id = self.base_fileid + quote_key('icon.svg')
1139
cf = CharmFileSet.get_by_id(self.fs, icon_id)
1141
"<?xml version='1.0' encoding='UTF-8'?>\n"
1142
+ '<svg height="10" viewBox="0 0 10 10" width="10" />',
1145
def test_provides_content_type(self):
1146
path = self.use_context(temp_dir())
1147
with file(join(path, 'icon.svg'), 'w') as f:
1148
f.write('<?xml version="1.0"?><svg width="10" height="10"></svg>')
1149
1139
with file(join(path, 'readme.txt'), 'w') as f:
1151
1141
self.save_files(path)
1692
1673
expected_file_paths.add(relpath)
1693
1674
expected_file_paths.add('also-common')
1694
1675
self.assertEqual(result['common'], result['also-common'])
1697
class TestFeaturedSource(MongoTestBase):
1699
def test_set_and_get_work(self):
1700
# FeaturedSource instances manage a set of featured charms in a
1701
# MongoDB collection.
1702
charm_data_1 = factory.get_charm_json(
1703
name='name1', owner='owner1', series='series1', promulgated=True)
1704
charm_data_2 = factory.get_charm_json(
1705
name='name2', owner='owner2', series='series2', promulgated=True)
1706
charm_data_3 = factory.get_charm_json(
1707
name='name3', owner='owner3', series='series3', promulgated=True)
1708
featured_source = FeaturedSource(
1709
self.db.create_collection(factory.random_string(10)))
1710
featured_source.set_featured(charm_data_1, 'charm')
1711
featured_source.set_featured(charm_data_2, 'charm')
1712
# The first two charms are featured, but the third is not.
1713
self.assertTrue(featured_source.is_featured(charm_data_1, 'charm'))
1714
self.assertTrue(featured_source.is_featured(charm_data_2, 'charm'))
1715
self.assertFalse(featured_source.is_featured(charm_data_3, 'charm'))
1717
def test_can_create_from_database(self):
1718
# A convienience constructor is proviede that accepts a database.
1719
charm_data = factory.get_charm_json(
1720
name='name1', owner='owner1', series='series1')
1721
featured_source = FeaturedSource.from_db(self.db)
1722
featured_source.set_featured(charm_data, 'charm')
1723
self.assertTrue(featured_source.is_featured(charm_data, 'charm'))
1725
def test_clearing_featured(self):
1726
# Once featured, an item can be removed from the featured set.
1727
charm_data = factory.get_charm_json(
1728
name='name1', owner='owner1', series='series1')
1729
featured_source = FeaturedSource.from_db(self.db)
1730
featured_source.set_featured(charm_data, 'charm')
1731
self.assertTrue(featured_source.is_featured(charm_data, 'charm'))
1732
# Now we remove the item's featured status and verify that it worked.
1733
featured_source.clear_featured(charm_data, 'charm')
1734
self.assertFalse(featured_source.is_featured(charm_data, 'charm'))
1735
# If the item is cleared again, nothing happens.
1736
featured_source.clear_featured(charm_data, 'charm')
1737
self.assertFalse(featured_source.is_featured(charm_data, 'charm'))
1739
def test_multiple_sets(self):
1740
# Setting an item as featured more than once will not include it more
1741
# than once in the set of featured items.
1742
charm_data = factory.get_charm_json(
1743
name='name1', owner='owner1', series='series1')
1744
featured_source = FeaturedSource.from_db(self.db)
1745
featured_source.set_featured(charm_data, 'charm')
1746
featured_source.set_featured(charm_data, 'charm')
1747
featured_source.set_featured(charm_data, 'charm')
1748
self.assertEqual(len(list(featured_source.collection.find())), 1)
1750
def test_creating_charm_queries(self):
1751
# Since we only store the identity of featured charms, we will have to
1752
# query the charms collection to retrieve them. The source provides
1753
# an private method to generate a query that will retrieve (all
1754
# versions of) all the featured charms (the duplicate versions are
1755
# filtered out client-side).
1756
charm_data_1 = factory.get_charm_json(
1757
name='name1', owner='owner1', series='series1', promulgated=True)
1758
charm_data_2 = factory.get_charm_json(
1759
name='name2', owner='owner2', series='series2', promulgated=True)
1760
featured_source = FeaturedSource.from_db(self.db)
1761
featured_source.set_featured(charm_data_1, 'charm')
1762
featured_source.set_featured(charm_data_2, 'charm')
1763
# Note that the doctype is not included in the query because the
1764
# documents do not contain a doctype.
1766
featured_source._make_featured_query('charm'),
1770
'series': u'series1'},
1773
'series': u'series2'},
1776
def test_get_featured(self):
1777
# To retrieve the set of featured items from a collection, pass that
1778
# collection and the document type to get_featured.
1779
charm_data_1 = factory.makeCharm(self.db)[1]
1780
charm_data_2 = factory.makeCharm(self.db)[1]
1781
featured_source = FeaturedSource.from_db(self.db)
1782
featured_source.set_featured(charm_data_1, 'charm')
1783
featured_source.set_featured(charm_data_2, 'charm')
1784
featured = featured_source.get_featured(self.db.charms, 'charm')
1785
self.assertEqual(len(featured), 2)
1787
def test_multiple_featured_versions(self):
1788
# If there are multiple versions of a featured charm, only the most
1789
# recent is returned from get_featured.
1790
collection = self.db.create_collection(factory.random_string(10))
1791
# First we need two charms that are favored.
1792
charm_data_1 = factory.get_charm_json(name='charm_1', revision='1')
1793
collection.save(charm_data_1)
1794
charm_data_2 = factory.get_charm_json(name='charm_2', revision='1')
1795
collection.save(charm_data_2)
1796
featured_source = FeaturedSource.from_db(self.db)
1797
featured_source.set_featured(charm_data_1, 'charm')
1798
featured_source.set_featured(charm_data_2, 'charm')
1799
# Now if a new revision of one of the charms is recorded, it will
1800
# still be returned in the set of featured charms.
1801
charm_data_3 = factory.get_charm_json(name='charm_1', revision='2')
1802
collection.save(charm_data_3)
1803
featured = featured_source.get_featured(collection, 'charm')
1804
self.assertEqual(len(featured), 2)
1806
[(u'~charmers/charms/precise/charm_1/trunk', u'2'),
1807
(u'~charmers/charms/precise/charm_2/trunk', u'1')],
1809
(charm_data['_id'], charm_data['revision'])
1810
for charm_data in featured))