source: products/quintagroup.seoptimizer/branches/refactoring2.3.0/quintagroup/seoptimizer/tests/testInstallation.py @ 1930

Last change on this file since 1930 was 1930, checked in by liebster, 14 years ago

Add seo_canonical property migration

File size: 11.2 KB
Line 
1#
2# Test product's installation
3#
4import string
5from zope.interface import alsoProvides
6from zope.component import queryMultiAdapter
7from zope.publisher.browser import TestRequest
8from zope.viewlet.interfaces import IViewletManager
9
10from quintagroup.canonicalpath.adapters import PROPERTY_LINK
11from quintagroup.seoptimizer.browser.interfaces import IPloneSEOLayer
12from base import *
13
14PROPS = {'stop_words': STOP_WORDS,
15         'fields': ['seo_title', 'seo_description', 'seo_keywords']}
16
17DEFAULT_METATAGS_ORDER = [
18    'DC.contributors', 'DC.creator', 'DC.date.created',
19    'DC.date.modified','DC.description', 'DC.distribution',
20    'DC.format', 'DC.language', 'DC.publisher', 'DC.rights',
21    'DC.subject', 'DC.type', 'description', 'distribution',
22    'keywords', 'robots']
23DEFAULT_METATAGS_ORDER.sort()
24
25SEO_CONTENT = ['File', 'Document', 'News Item']
26CONTENTTYPES_WITH_SEOACTION = ['File', 'Document', 'News Item', 'Folder', 'Event']
27CONTENTTYPES_WITH_SEOACTION.sort()
28
29
30class TestBeforeInstallation(FunctionalTestCaseNotInstalled):
31
32    def afterSetUp(self):
33        #self.qi = self.portal.portal_quickinstaller
34        #self.qi.uninstallProducts([PROJECT_NAME])
35        self.basic_auth = 'mgr:mgrpw'
36        self.portal_path = '/%s' % self.portal.absolute_url(1)
37
38    def testAccessPortalRootAnonymous(self):
39        response = self.publish(self.portal_path)
40        self.assertEqual(response.getStatus(), 200)
41
42    def testAccessPortalRootAuthenticated(self):
43        response = self.publish(self.portal_path, self.basic_auth)
44        self.assertEqual(response.getStatus(), 200)
45
46
47class TestInstallation(TestCase):
48
49    def afterSetUp(self):
50        self.properties = getToolByName(self.portal, 'portal_properties')
51
52    def testAddingPropertySheet(self):
53        """ Test adding property sheet to portal_properties tool """
54        self.failUnless(hasattr(self.properties.aq_base, PROPERTY_SHEET))
55
56    def testAddingPropertyFields(self):
57        """ Test adding property field to portal_properties.maps_properties sheet """
58        map_sheet = self.properties[PROPERTY_SHEET]
59        for key, value in PROPS.items():
60            self.failUnless(map_sheet.hasProperty(key) and list(map_sheet.getProperty(key)) == value)
61
62    def test_configlet_install(self):
63        configTool = getToolByName(self.portal, 'portal_controlpanel', None)
64        self.assert_(PROJECT_NAME in [a.getId() for a in configTool.listActions()], 'Configlet not found')
65
66    def test_viewlets_install(self):
67        VIEWLETS = ['plone.htmlhead.title',
68                    'plone.resourceregistries',
69                    'quintagroup.seoptimizer.seotags',
70                    'quintagroup.seoptimizer.customscript']
71        request = self.app.REQUEST
72        # mark request with our browser layer
73        alsoProvides(request, IPloneSEOLayer)
74        view = queryMultiAdapter((self.portal, request), name="plone")
75        manager = queryMultiAdapter( (self.portal['front-page'], request, view),
76                                     IViewletManager, name='plone.htmlhead')
77        for p in VIEWLETS:
78            self.assert_(manager.get(p) is not None, "Not registered '%s' viewlet" % p)
79       
80    def test_browser_layer(self):
81        from plone.browserlayer import utils
82        self.assert_(IPloneSEOLayer in utils.registered_layers(),
83                     "Not registered 'IPloneSEOLayer' browser layer")
84
85    def test_action_install(self):
86        atool=getToolByName(self.portal, 'portal_actions')
87        action_ids = [a.id for a in atool.listActions()]
88        self.assert_("SEOProperties" in action_ids,
89                     "Not added 'SEOProperties' action")
90
91class TestUninstallation(TestCase):
92
93    def afterSetUp(self):
94        self.qi = self.portal.portal_quickinstaller
95        self.qi.uninstallProducts([PROJECT_NAME])
96
97    def test_propertysheet_uninstall(self):
98        properties = getToolByName(self.portal, 'portal_properties')
99        self.assertEqual(hasattr(properties.aq_base, PROPERTY_SHEET), False,
100            "'%s' property sheet not uninstalled" % PROPERTY_SHEET)
101
102    def test_configlet_uninstall(self):
103        self.assertNotEqual(self.qi.isProductInstalled(PROJECT_NAME), True,
104            'qSEOptimizer is already installed')
105
106        configTool = getToolByName(self.portal, 'portal_controlpanel', None)
107        self.assertEqual(PROJECT_NAME in [a.getId() for a in configTool.listActions()], False,
108            'Configlet found after uninstallation')
109
110    def test_viewlets_uninstall(self):
111        VIEWLETS = ['quintagroup.seoptimizer.seotags',
112                    'quintagroup.seoptimizer.customscript']
113        request = self.app.REQUEST
114        view = queryMultiAdapter((self.portal, request), name="plone")
115        manager = queryMultiAdapter( (self.portal['front-page'], request, view),
116                                     IViewletManager, name='plone.htmlhead')
117        for p in VIEWLETS:
118            self.assertEqual(manager.get(p) is None, True,
119                "'%s' viewlet present after uninstallation" % p)
120
121    def test_browserlayer_uninstall(self):
122        from plone.browserlayer import utils
123        self.assertEqual(IPloneSEOLayer in utils.registered_layers(), False,
124            "Still registered 'IPloneSEOLayer' browser layer")
125
126    def test_action_uninstall(self):
127        atool=getToolByName(self.portal, 'portal_actions')
128        action_ids = [a.id for a in atool.listActions()]
129        self.assertEqual("SEOProperties" in action_ids, False,
130            "Not added 'SEOProperties' action")
131
132class TestReinstallation(TestCase):
133
134    def afterSetUp(self):
135        self.qi = self.portal.portal_quickinstaller
136        self.types_tool = getToolByName(self.portal, 'portal_types')
137        self.setup_tool = getToolByName(self.portal, 'portal_setup')
138        self.pprops_tool = getToolByName(self.portal, 'portal_properties')
139        self.seoprops_tool = getToolByName(self.pprops_tool, 'seo_properties', None)
140        # Set earlier version profile (2.0.0) for using upgrade steps
141        self.setup_tool.setLastVersionForProfile('%s:default' % PROJECT_NAME, '2.0.0')
142
143    def testChangeDomain(self):
144        # Test changed of content type's domain from 'quintagroup.seoptimizer' to 'plone'
145        for type in SEO_CONTENT:
146            self.types_tool.getTypeInfo(type).i18n_domain = 'quintagroup.seoptimizer'
147        self.qi.reinstallProducts([PROJECT_NAME])
148        for type in SEO_CONTENT:
149            self.assertEqual(self.types_tool.getTypeInfo(type).i18n_domain, 'plone',
150                "Not changed of %s content type's domain to 'plone'" % type)
151
152    def testCutItemsMetatagsOrderList(self):
153        # Test changed format metatags order list from "metaname accessor" to "metaname"
154        value, expect_mto = ['name1 accessor1', 'name2 accessor2'], ['name1','name2']
155        self.seoprops_tool.manage_changeProperties(metatags_order=value)
156        self.qi.reinstallProducts([PROJECT_NAME])
157        mto = list(self.seoprops_tool.getProperty('metatags_order'))
158        mto.sort()
159        self.assertEqual(mto, expect_mto,
160                    "Not changed format metatags order list from \"metaname accessor\" to"\
161                    " \"metaname\". %s != %s" %(mto, expect_mto))
162
163    def testAddMetatagsOrderList(self):
164        # Test added metatags order list if it was not there before
165        self.seoprops_tool.manage_delProperties(['metatags_order'])
166        self.qi.reinstallProducts([PROJECT_NAME])
167        mto = list(self.seoprops_tool.getProperty('metatags_order'))
168        mto.sort()
169        self.assertEqual(mto, DEFAULT_METATAGS_ORDER,
170                    "Not added metatags order list with default values."\
171                    "%s != %s" %(mto, DEFAULT_METATAGS_ORDER))
172
173    def testMigrationActions(self):
174        # Test migrated actions from portal_types action to seoproperties tool
175        self.seoprops_tool.content_types_with_seoproperties = ()
176
177        # Add seoaction to content type for testing
178        for type in CONTENTTYPES_WITH_SEOACTION:
179            self.types_tool.getTypeInfo(type).addAction(id='seo_properties',
180                                                   name='SEO Properties',
181                                                   action=None,
182                                                   condition=None,
183                                                   permission=(u'Modify portal content',),
184                                                   category='object',
185                                                  )
186            # Check presence seoaction in content type
187            seoaction = [act.id for act in self.types_tool.getTypeInfo(type).listActions()
188                                          if act.id == 'seo_properties']
189            self.assertEqual(bool(seoaction), True,
190                    "Not added seoaction to content type %s for testing" % type)
191
192        self.qi.reinstallProducts([PROJECT_NAME])
193
194        # Check presence seoaction in content type
195        for type in CONTENTTYPES_WITH_SEOACTION:
196            seoaction = [act.id for act in self.types_tool.getTypeInfo(type).listActions()
197                                          if act.id == 'seo_properties']
198            self.assertEqual(bool(seoaction), False,
199                "Not removed seoaction in content type %s" % type)
200
201        # Check added content type names in seo properties tool if content types have seoaction
202        ctws = list(self.seoprops_tool.content_types_with_seoproperties)
203        ctws.sort()
204        self.assertEqual(ctws, CONTENTTYPES_WITH_SEOACTION,
205            "Not added content type names in seo properties tool if content types have seoaction."\
206            " %s != %s" %(ctws, CONTENTTYPES_WITH_SEOACTION))
207
208    def testRemoveSkin(self):
209        # Test remove layers
210        layer = 'quintagroup.seoptimizer'
211        skinstool = getToolByName(self.portal, 'portal_skins')
212        for skin in skinstool.getSkinSelections():
213            paths  = ','.join((skinstool.getSkinPath(skin), layer))
214            skinstool.addSkinSelection(skin, paths)
215        self.qi.reinstallProducts([PROJECT_NAME])
216        for skin in skinstool.getSkinSelections():
217            path = skinstool.getSkinPath(skin)
218            path = map(string.strip, string.split(path, ','))
219            self.assertEqual(layer in path, False,
220                '%s layer found in %s after uninstallation' %(layer, skin))
221
222    def testMigrateCanonical(self):
223        """ Test Migrate qSEO_canonical property into PROPERTY_LINK
224            for all portal objects, which use SEO
225        """
226        doc = self.portal.get('front-page')
227        doc.manage_addProperty('qSEO_canonical', 'val', 'string')
228        value = doc.getProperty('qSEO_canonical')
229        assert doc.getProperty('qSEO_canonical') == 'val' 
230
231        self.qi.reinstallProducts([PROJECT_NAME])
232        value = doc.getProperty(PROPERTY_LINK)
233        has_prop = bool(doc.hasProperty('qSEO_canonical'))
234        self.assertEqual(has_prop, False, "Property 'qSEO_canonical' is not deleted.")
235        self.assertEqual(value == 'val', True,
236                "Property not migrated from 'qSEO_canonical' to '%s'." % PROPERTY_LINK)
237
238def test_suite():
239    from unittest import TestSuite, makeSuite
240    suite = TestSuite()
241    suite.addTest(makeSuite(TestBeforeInstallation))
242    suite.addTest(makeSuite(TestInstallation))
243    suite.addTest(makeSuite(TestUninstallation))
244    suite.addTest(makeSuite(TestReinstallation))
245    return suite
Note: See TracBrowser for help on using the repository browser.