launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #03666
[Merge] lp:~jcsackett/launchpad/flag-membership into lp:launchpad
j.c.sackett has proposed merging lp:~jcsackett/launchpad/flag-membership into lp:launchpad.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
Related bugs:
Bug #783476 in Launchpad itself: "Scripts failed to run: loganberry:flag-expired-memberships"
https://bugs.launchpad.net/launchpad/+bug/783476
For more details, see:
https://code.launchpad.net/~jcsackett/launchpad/flag-membership/+merge/61487
Summary
=======
flag-expired-memberships isn't running because of a permission error. This
branch fixes the error and introduces a test to check the functionality when
run as the dbuser for the cronscript.
Preimplementation
=================
Spoke with Curtis Hovey.
Implementation
==============
database/schema/security.cfg
----------------------------
Added the needed permission to the dbuser.
lib/lp/registry/tests/test_teammembership.py
--------------------------------------------
Added a test for the part of the script that was erroring, using switchDbUser
and reload_object to check the functionality when the code is run as the
cronscript dbuser.
Tests
=====
bin/test -vvct test_teammembership
QA
==
Have the script run on QA staging. It should run successfully.
Lint
====
= Launchpad lint =
Checking for conflicts and issues in changed files.
Linting changed files:
database/schema/security.cfg
lib/lp/registry/tests/test_teammembership.py
--
https://code.launchpad.net/~jcsackett/launchpad/flag-membership/+merge/61487
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~jcsackett/launchpad/flag-membership into lp:launchpad.
=== modified file 'database/schema/security.cfg'
--- database/schema/security.cfg 2011-05-18 14:14:41 +0000
+++ database/schema/security.cfg 2011-05-18 22:13:55 +0000
@@ -723,6 +723,7 @@
public.persontransferjob = SELECT, INSERT
public.teammembership = SELECT, UPDATE
public.teamparticipation = SELECT, DELETE
+public.account = SELECT
type=user
[karma]
=== modified file 'lib/lp/registry/tests/test_teammembership.py'
--- lib/lp/registry/tests/test_teammembership.py 2011-03-23 16:28:51 +0000
+++ lib/lp/registry/tests/test_teammembership.py 2011-05-18 22:13:55 +0000
@@ -9,6 +9,7 @@
)
import re
import subprocess
+import transaction
from unittest import (
TestCase,
TestLoader,
@@ -18,6 +19,7 @@
from zope.component import getUtility
from zope.security.proxy import removeSecurityProxy
+from canonical.config import config
from canonical.database.sqlbase import (
cursor,
flush_database_caches,
@@ -28,6 +30,7 @@
login,
login_person,
)
+from canonical.launchpad.interfaces.launchpad import ILaunchpadCelebrities
from canonical.launchpad.interfaces.lpstorm import IStore
from canonical.launchpad.testing.systemdocs import (
default_optionflags,
@@ -35,7 +38,10 @@
setUp,
tearDown,
)
-from canonical.testing.layers import DatabaseFunctionalLayer
+from canonical.testing.layers import (
+ DatabaseFunctionalLayer,
+ LaunchpadZopelessLayer,
+ )
from lp.registry.interfaces.person import (
IPersonSet,
TeamMembershipRenewalPolicy,
@@ -56,9 +62,51 @@
TestCaseWithFactory,
)
from lp.testing.mail_helpers import pop_notifications
+from lp.testing.storm import reload_object
+
+
+class TestTeamMembershipSetScripts(TestCaseWithFactory):
+ """Separate Testcase to separate out examples required dbuser switches.
+
+ This uses the LaunchpadZoplelessLayer to provide layer.switchDbUser
+ """
+
+ layer = LaunchpadZopelessLayer
+
+ def test_handleMembershipsExpiringToday_permissions(self):
+ # Create two teams, a control team and and a team to be the control's
+ # administrator.
+ adminteam = self.factory.makeTeam()
+ adminteam.setContactAddress(None)
+ team = self.factory.makeTeam(owner=adminteam)
+ naked_team = removeSecurityProxy(team)
+ naked_team.renewal_policy = TeamMembershipRenewalPolicy.AUTOMATIC
+ naked_team.defaultrenewalperiod = 10
+
+ # Create a person to be in the control team.
+ person = self.factory.makePerson()
+ team.addMember(person, team.teamowner)
+ membershipset = getUtility(ITeamMembershipSet)
+ teammembership = membershipset.getByPersonAndTeam(person, team)
+
+ # Set expiration time to now
+ now = datetime.now(pytz.UTC)
+ removeSecurityProxy(teammembership).dateexpires = now
+ transaction.commit()
+
+ # Switch dbuser to the user running the membership flagging
+ # cronscript. Reload the membership object so we can assert against
+ # it.
+ self.layer.switchDbUser(config.expiredmembershipsflagger.dbuser)
+ reload_object(teammembership)
+ janitor = getUtility(ILaunchpadCelebrities).janitor
+ membershipset.handleMembershipsExpiringToday(janitor)
+ self.assertEqual(
+ teammembership.status, TeamMembershipStatus.APPROVED)
class TestTeamMembershipSet(TestCaseWithFactory):
+
layer = DatabaseFunctionalLayer
def setUp(self):
@@ -155,7 +203,6 @@
sample_person_on_ubuntu_dev.status, TeamMembershipStatus.APPROVED)
self.assertEqual(
sample_person_on_motu.status, TeamMembershipStatus.APPROVED)
-
self.membershipset.handleMembershipsExpiringToday(foobar)
flush_database_caches()