~jcsackett/charmworld/bac-tag-constraints

« back to all changes in this revision

Viewing changes to charmworld/tests/test_models.py

[r=sinzui][bug=1208477][author=abentley] Remove doctype attribute.

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
    CharmFile,
33
33
    CharmFileSet,
34
34
    CharmSource,
35
 
    FeaturedSource,
36
35
    find_charms,
37
36
    construct_charm_id,
38
37
    options_to_storage,
608
607
        charm = Charm({})
609
608
        self.assertEqual('', charm.short_url)
610
609
 
 
610
    def test_is_featured(self):
 
611
        # The is_featured property is a bool.
 
612
        charm_data = factory.get_charm_json(is_featured=True)
 
613
        charm = Charm(charm_data)
 
614
        self.assertIs(True, charm.is_featured)
 
615
        # The default is False.
 
616
        charm = Charm({})
 
617
        self.assertIs(False, charm.is_featured)
 
618
 
611
619
    def test_changes_since(self):
612
620
        changes = [factory.makeChange(created=date(2013, 6, num))
613
621
                   for num in range(1, 31)]
1119
1127
 
1120
1128
    def test_save_file_ignores_invalid_icons(self):
1121
1129
        path = self.use_context(temp_dir())
1122
 
        # Not an SVG.
1123
1130
        with file(join(path, 'icon.svg'), 'w') as f:
1124
1131
            f.write('foo')
1125
1132
        files = self.save_files(path)
1126
1133
        self.assertEqual([], files)
1127
 
        # No width or height provided.
 
1134
 
 
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)
1132
 
 
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)
1140
 
        self.assertEqual(
1141
 
            "<?xml version='1.0' encoding='UTF-8'?>\n"
1142
 
            + '<svg height="10" viewBox="0 0 10 10" width="10" />',
1143
 
            cf.read())
1144
 
 
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:
1150
1140
            f.write('foo')
1151
1141
        self.save_files(path)
1589
1579
        bundle1 = Bundle(
1590
1580
            {'name': 'tiny',
1591
1581
             'owner': 'bac',
1592
 
             'basket': 'apache/1',
 
1582
             'basket': 'apache-1',
1593
1583
             'inherits': 'big-apache',
1594
1584
             })
1595
1585
        bundle2 = Bundle(
1596
1586
            {'name': 'tiny',
1597
1587
             'owner': 'bac',
1598
 
             'basket': 'apache/1',
 
1588
             'basket': 'apache-1',
1599
1589
             'inherits': 'moderately-big-apache',
1600
1590
             'branch_deleted': True,
1601
1591
             })
1605
1595
        bundle1 = Bundle(
1606
1596
            {'name': 'tiny',
1607
1597
             'owner': 'bac',
1608
 
             'basket': 'apache/4',
 
1598
             'basket': 'apache-4',
1609
1599
             })
1610
1600
        bundle2 = Bundle(
1611
1601
            {'name': 'tiny',
1612
1602
             'owner': 'abc',
1613
 
             'basket': 'apache/4',
 
1603
             'basket': 'apache-4',
1614
1604
             })
1615
1605
        self.assertNotEqual(bundle1, bundle2)
1616
1606
 
1618
1608
        bundle = Bundle(
1619
1609
            {'name': 'tiny',
1620
1610
             'owner': 'bac',
1621
 
             'basket': 'apache/8',
1622
 
             })
1623
 
        self.assertEqual(
1624
 
            "~bac/apache/8/tiny", bundle.id)
1625
 
 
1626
 
    def test_permanent_url(self):
1627
 
        bundle = Bundle(
1628
 
            {'name': 'tiny',
1629
 
             'owner': 'bac',
1630
 
             'basket': 'apache/6',
1631
 
             })
1632
 
        self.assertEqual(
1633
 
            "jc:~bac/apache/6/tiny", bundle.permanent_url)
1634
 
 
1635
 
    def test_short_url(self):
1636
 
        bundle = Bundle(
1637
 
            {'name': 'tiny',
1638
 
             'owner': 'bac',
1639
 
             'basket': 'apache/6',
1640
 
             })
1641
 
        self.assertEqual(
1642
 
            "/bundle/~bac/apache/6/tiny", bundle.short_url)
 
1611
             'basket': 'apache-8',
 
1612
             })
 
1613
        self.assertEqual(
 
1614
            "~bac/apache-8/tiny", bundle.id)
 
1615
 
 
1616
    def test_perm_url(self):
 
1617
        bundle = Bundle(
 
1618
            {'name': 'tiny',
 
1619
             'owner': 'bac',
 
1620
             'basket': 'apache-6',
 
1621
             })
 
1622
        self.assertEqual(
 
1623
            "jc:~bac/apache-6/tiny", bundle.permanent_url)
1643
1624
 
1644
1625
 
1645
1626
class TestSlurpFiles(MongoTestBase):
1692
1673
                expected_file_paths.add(relpath)
1693
1674
        expected_file_paths.add('also-common')
1694
1675
        self.assertEqual(result['common'], result['also-common'])
1695
 
 
1696
 
 
1697
 
class TestFeaturedSource(MongoTestBase):
1698
 
 
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'))
1716
 
 
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'))
1724
 
 
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'))
1738
 
 
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)
1749
 
 
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.
1765
 
        self.assertEqual(
1766
 
            featured_source._make_featured_query('charm'),
1767
 
            {'$or': [
1768
 
                {'name': u'name1',
1769
 
                 'owner': u'owner1',
1770
 
                 'series': u'series1'},
1771
 
                {'name': u'name2',
1772
 
                 'owner': u'owner2',
1773
 
                 'series': u'series2'},
1774
 
            ]})
1775
 
 
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)
1786
 
 
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)
1805
 
        self.assertEqual(
1806
 
            [(u'~charmers/charms/precise/charm_1/trunk', u'2'),
1807
 
             (u'~charmers/charms/precise/charm_2/trunk', u'1')],
1808
 
            sorted(
1809
 
                (charm_data['_id'], charm_data['revision'])
1810
 
                for charm_data in featured))