Skip to content

Commit

Permalink
Refactor upgrade step and add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
hvelarde committed Oct 23, 2013
1 parent 69e4017 commit 308fd8c
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 37 deletions.
6 changes: 3 additions & 3 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ There's a frood who really knows where his towel is.
1.0a3 (unreleased)
^^^^^^^^^^^^^^^^^^

- Remove all Google Weather related code (closes `#2`_). [marcosfromero]
- Remove all Google Weather related code. [marcosfromero]

- Weather conditions moved to title tag. [flecox]

Expand All @@ -17,8 +17,8 @@ There's a frood who really knows where his towel is.
- Made the code to be more resistent to invalid data from the weather server.
[frapell]

- Major refactoring to allow updates and city changes through AJAX calls.
(fixes `#6`_) [frapell]
- Major refactoring to allow updates and city changes through AJAX calls
(fixes `#6`_). [frapell]

- Implemented Yahoo! weather. [frapell]

Expand Down
32 changes: 9 additions & 23 deletions src/collective/weather/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<i18n:registerTranslations directory="locales" />

<include package=".browser" />
<include package=".upgrades" />

<genericsetup:registerProfile
name="default"
Expand All @@ -36,28 +37,13 @@
provides="Products.GenericSetup.interfaces.EXTENSION"
/>

<genericsetup:registerProfile
name="upgrade_to_2"
title="collective.weather upgrade to version 2"
directory="profiles/upgrade_to_2"
description="Remove all google weather related code."
provides="Products.GenericSetup.interfaces.EXTENSION" />

<genericsetup:upgradeStep
title="collective.weather upgrade to version 2"
source="*"
destination="2"
description="Remove all google weather related code."
handler="collective.weather.setuphandlers.upgrade_to_2"
profile="collective.weather:default" />

<!-- The weather viewlet -->
<browser:viewlet
name="collective.weather.top_bar_weather"
manager="plone.app.layout.viewlets.interfaces.IPortalHeader"
class=".viewlet.TopBarWeatherViewlet"
permission="zope2.View"
layer="collective.weather.interfaces.IWeatherLayer"
/>
<!-- The weather viewlet -->
<browser:viewlet
name="collective.weather.top_bar_weather"
manager="plone.app.layout.viewlets.interfaces.IPortalHeader"
class=".viewlet.TopBarWeatherViewlet"
permission="zope2.View"
layer="collective.weather.interfaces.IWeatherLayer"
/>

</configure>
7 changes: 0 additions & 7 deletions src/collective/weather/profiles/upgrade_to_2/registry.xml

This file was deleted.

88 changes: 88 additions & 0 deletions src/collective/weather/tests/test_upgrades.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-

from collective.weather.testing import INTEGRATION_TESTING
from plone.registry import field
from plone.registry.interfaces import IRegistry
from plone.registry.record import Record
from zope.component import getUtility

import unittest2 as unittest


class UpgradeTestCaseBase(unittest.TestCase):

layer = INTEGRATION_TESTING

def setUp(self, from_version, to_version):
self.portal = self.layer['portal']
self.setup = self.portal['portal_setup']
self.profile_id = u'collective.weather:default'
self.from_version = from_version
self.to_version = to_version

def _get_upgrade_step(self, title):
"""Get one of the upgrade steps.
Keyword arguments:
title -- the title used to register the upgrade step
"""
self.setup.setLastVersionForProfile(self.profile_id, self.from_version)
upgrades = self.setup.listUpgrades(self.profile_id)
steps = [s for s in upgrades[0] if s['title'] == title]
return steps[0] if steps else None

def _do_upgrade_step(self, step):
"""Execute an upgrade step.
Keyword arguments:
step -- the step we want to run
"""
request = self.layer['request']
request.form['profile_id'] = self.profile_id
request.form['upgrades'] = [step['id']]
self.setup.manage_doUpgrades(request=request)

def _how_many_upgrades_to_do(self):
self.setup.setLastVersionForProfile(self.profile_id, self.from_version)
upgrades = self.setup.listUpgrades(self.profile_id)
assert len(upgrades) > 0
return len(upgrades[0])


class Upgrade1to2TestCase(UpgradeTestCaseBase):

def setUp(self):
UpgradeTestCaseBase.setUp(self, u'1', u'2')

def test_upgrade_to_2_registrations(self):
version = self.setup.getLastVersionForProfile(self.profile_id)[0]
self.assertTrue(version >= self.to_version)
self.assertEqual(self._how_many_upgrades_to_do(), 1)

def test_code_clean_up(self):
# check if the upgrade step is registered
title = u'code_clean_up'
description = u'Remove all Google Weather related code.'
step = self._get_upgrade_step(title)
self.assertIsNotNone(step)
self.assertEqual(step['description'], description)

# simulate state on previous version
registry = getUtility(IRegistry)
BASE_REGISTRY = 'collective.weather.browser.interfaces.IGoogleWeatherSchema.{0}'
records = [
BASE_REGISTRY.format('use_google'),
BASE_REGISTRY.format('google_location_ids'),
BASE_REGISTRY.format('google_language'),
BASE_REGISTRY.format('google_units'),
]

for r in records:
registry.records[r] = Record(field.TextLine(title=u'Test'))
self.assertIn(r, registry)

# run the upgrade step to validate the update
self._do_upgrade_step(step)

for r in records:
self.assertNotIn(r, registry)
Empty file.
5 changes: 5 additions & 0 deletions src/collective/weather/upgrades/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<configure xmlns="http://namespaces.zope.org/zope">

<include package=".v2" />

</configure>
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
import logging


def upgrade_to_2(context, logger=None):
"""
def code_clean_up(context, logger=None):
"""Remove all Google Weather related code.
"""
if logger is None:
# Called as upgrade step: define our own logger
logger = logging.getLogger(PROJECTNAME)

profile = 'profile-collective.weather:upgrade_to_2'
profile = 'profile-collective.weather.upgrades.v2:default'
setup = getToolByName(context, 'portal_setup')
setup.runAllImportStepsFromProfile(profile)
26 changes: 26 additions & 0 deletions src/collective/weather/upgrades/v2/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup">

<genericsetup:registerProfile
name="default"
title="collective.weather: version 2"
directory="profile"
description="Upgrade collective.weather profile to version 2."
provides="Products.GenericSetup.interfaces.EXTENSION"
/>

<genericsetup:upgradeSteps
source="1"
destination="2"
profile="collective.weather:default">

<genericsetup:upgradeStep
title="code_clean_up"
description="Remove all Google Weather related code."
handler=".code_clean_up"
/>

</genericsetup:upgradeSteps>

</configure>
7 changes: 7 additions & 0 deletions src/collective/weather/upgrades/v2/profile/registry.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<registry>
<record name="collective.weather.browser.interfaces.IGoogleWeatherSchema.use_google" delete="true" />
<record name="collective.weather.browser.interfaces.IGoogleWeatherSchema.google_location_ids" delete="true" />
<record name="collective.weather.browser.interfaces.IGoogleWeatherSchema.google_language" delete="true" />
<record name="collective.weather.browser.interfaces.IGoogleWeatherSchema.google_units" delete="true" />
</registry>

0 comments on commit 308fd8c

Please sign in to comment.