← Back to team overview

launchpad-reviewers team mailing list archive

[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()