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

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

Remove using jsregestry

File size: 10.6 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.seoptimizer.browser.interfaces import IPloneSEOLayer
11
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_skins_install(self):
67        skinstool=getToolByName(self.portal, 'portal_skins')
68
69        for skin in skinstool.getSkinSelections():
70            path = skinstool.getSkinPath(skin)
71            path = map( string.strip, string.split( path,',' ) )
72            self.assert_(PROJECT_NAME in path, 'qSEOptimizer layer not found in %s' %skin)
73
74    def test_viewlets_install(self):
75        VIEWLETS = ['plone.htmlhead.title',
76                    'plone.resourceregistries',
77                    'quintagroup.seoptimizer.seotags',
78                    'quintagroup.seoptimizer.customscript']
79        request = self.app.REQUEST
80        # mark request with our browser layer
81        alsoProvides(request, IPloneSEOLayer)
82        view = queryMultiAdapter((self.portal, request), name="plone")
83        manager = queryMultiAdapter( (self.portal['front-page'], request, view),
84                                     IViewletManager, name='plone.htmlhead')
85        for p in VIEWLETS:
86            self.assert_(manager.get(p) is not None, "Not registered '%s' viewlet" % p)
87       
88    def test_browser_layer(self):
89        from plone.browserlayer import utils
90        self.assert_(IPloneSEOLayer in utils.registered_layers(),
91                     "Not registered 'IPloneSEOLayer' browser layer")
92
93    def test_action_install(self):
94        atool=getToolByName(self.portal, 'portal_actions')
95        action_ids = [a.id for a in atool.listActions()]
96        self.assert_("SEOProperties" in action_ids,
97                     "Not added 'SEOProperties' action")
98
99class TestUninstallation(TestCase):
100
101    def afterSetUp(self):
102        self.qi = self.portal.portal_quickinstaller
103        self.qi.uninstallProducts([PROJECT_NAME])
104
105    def test_propertysheet_uninstall(self):
106        properties = getToolByName(self.portal, 'portal_properties')
107        self.assertEqual(hasattr(properties.aq_base, PROPERTY_SHEET), False,
108            "'%s' property sheet not uninstalled" % PROPERTY_SHEET)
109
110    def test_configlet_uninstall(self):
111        self.assertNotEqual(self.qi.isProductInstalled(PROJECT_NAME), True,
112            'qSEOptimizer is already installed')
113
114        configTool = getToolByName(self.portal, 'portal_controlpanel', None)
115        self.assertEqual(PROJECT_NAME in [a.getId() for a in configTool.listActions()], False,
116            'Configlet found after uninstallation')
117
118    def test_skins_uninstall(self):
119        self.assertNotEqual(self.qi.isProductInstalled(PROJECT_NAME), True,
120            'qSEOptimizer is already installed')
121        skinstool=getToolByName(self.portal, 'portal_skins')
122
123        for skin in skinstool.getSkinSelections():
124            path = skinstool.getSkinPath(skin)
125            path = map( string.strip, string.split( path,',' ) )
126            self.assertEqual(PROJECT_NAME in path, False,
127                'qSEOptimizer layer found in %s after uninstallation' %skin)
128
129    def test_viewlets_uninstall(self):
130        VIEWLETS = ['quintagroup.seoptimizer.seotags',
131                    'quintagroup.seoptimizer.customscript']
132        request = self.app.REQUEST
133        view = queryMultiAdapter((self.portal, request), name="plone")
134        manager = queryMultiAdapter( (self.portal['front-page'], request, view),
135                                     IViewletManager, name='plone.htmlhead')
136        for p in VIEWLETS:
137            self.assertEqual(manager.get(p) is None, True,
138                "'%s' viewlet present after uninstallation" % p)
139
140    def test_browserlayer_uninstall(self):
141        from plone.browserlayer import utils
142        self.assertEqual(IPloneSEOLayer in utils.registered_layers(), False,
143            "Still registered 'IPloneSEOLayer' browser layer")
144
145    def test_action_uninstall(self):
146        atool=getToolByName(self.portal, 'portal_actions')
147        action_ids = [a.id for a in atool.listActions()]
148        self.assertEqual("SEOProperties" in action_ids, False,
149            "Not added 'SEOProperties' action")
150
151class TestReinstallation(TestCase):
152
153    def afterSetUp(self):
154        self.qi = self.portal.portal_quickinstaller
155        self.types_tool = getToolByName(self.portal, 'portal_types')
156        self.setup_tool = getToolByName(self.portal, 'portal_setup')
157        self.pprops_tool = getToolByName(self.portal, 'portal_properties')
158        self.seoprops_tool = getToolByName(self.pprops_tool, 'seo_properties', None)
159        # Set earlier version profile (2.0.0) for using upgrade steps
160        self.setup_tool.setLastVersionForProfile('%s:default' % PROJECT_NAME, '2.0.0')
161
162    def testChangeDomain(self):
163        # Test changed of content type's domain from 'quintagroup.seoptimizer' to 'plone'
164        for type in SEO_CONTENT:
165            self.types_tool.getTypeInfo(type).i18n_domain = 'quintagroup.seoptimizer'
166        self.qi.reinstallProducts([PROJECT_NAME])
167        for type in SEO_CONTENT:
168            self.assertEqual(self.types_tool.getTypeInfo(type).i18n_domain, 'plone',
169                "Not changed of %s content type's domain to 'plone'" % type)
170
171    def testCutItemsMetatagsOrderList(self):
172        # Test changed format metatags order list from "metaname accessor" to "metaname"
173        value, expect_mto = ['name1 accessor1', 'name2 accessor2'], ['name1','name2']
174        self.seoprops_tool.manage_changeProperties(metatags_order=value)
175        self.qi.reinstallProducts([PROJECT_NAME])
176        mto = list(self.seoprops_tool.getProperty('metatags_order'))
177        mto.sort()
178        self.assertEqual(mto, expect_mto,
179                    "Not changed format metatags order list from \"metaname accessor\" to"\
180                    " \"metaname\". %s != %s" %(mto, expect_mto))
181
182    def testAddMetatagsOrderList(self):
183        # Test added metatags order list if it was not there before
184        self.seoprops_tool.manage_delProperties(['metatags_order'])
185        self.qi.reinstallProducts([PROJECT_NAME])
186        mto = list(self.seoprops_tool.getProperty('metatags_order'))
187        mto.sort()
188        self.assertEqual(mto, DEFAULT_METATAGS_ORDER,
189                    "Not added metatags order list with default values."\
190                    "%s != %s" %(mto, DEFAULT_METATAGS_ORDER))
191
192    def testMigrationActions(self):
193        # Test migrated actions from portal_types action to seoproperties tool
194        self.seoprops_tool.content_types_with_seoproperties = ()
195
196        # Add seoaction to content type for testing
197        for type in CONTENTTYPES_WITH_SEOACTION:
198            self.types_tool.getTypeInfo(type).addAction(id='seo_properties',
199                                                   name='SEO Properties',
200                                                   action=None,
201                                                   condition=None,
202                                                   permission=(u'Modify portal content',),
203                                                   category='object',
204                                                  )
205            # Check presence seoaction in content type
206            seoaction = [act.id for act in self.types_tool.getTypeInfo(type).listActions()
207                                          if act.id == 'seo_properties']
208            self.assertEqual(bool(seoaction), True,
209                    "Not added seoaction to content type %s for testing" % type)
210
211        self.qi.reinstallProducts([PROJECT_NAME])
212
213        # Check presence seoaction in content type
214        for type in CONTENTTYPES_WITH_SEOACTION:
215            seoaction = [act.id for act in self.types_tool.getTypeInfo(type).listActions()
216                                          if act.id == 'seo_properties']
217            self.assertEqual(bool(seoaction), False,
218                "Not removed seoaction in content type %s" % type)
219
220        # Check added content type names in seo properties tool if content types have seoaction
221        ctws = list(self.seoprops_tool.content_types_with_seoproperties)
222        ctws.sort()
223        self.assertEqual(ctws, CONTENTTYPES_WITH_SEOACTION,
224            "Not added content type names in seo properties tool if content types have seoaction."\
225            " %s != %s" %(ctws, CONTENTTYPES_WITH_SEOACTION))
226
227
228def test_suite():
229    from unittest import TestSuite, makeSuite
230    suite = TestSuite()
231    suite.addTest(makeSuite(TestBeforeInstallation))
232    suite.addTest(makeSuite(TestInstallation))
233    suite.addTest(makeSuite(TestUninstallation))
234    suite.addTest(makeSuite(TestReinstallation))
235    return suite
Note: See TracBrowser for help on using the repository browser.