Merge ~pappacena/launchpad:getrefpermission-constant-query-count into launchpad:master

Proposed by Thiago F. Pappacena
Status: Merged
Approved by: Thiago F. Pappacena
Approved revision: 753bb6671859a338cb76881efe72ffff808af8f6
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~pappacena/launchpad:getrefpermission-constant-query-count
Merge into: launchpad:master
Diff against target: 56 lines (+34/-0)
2 files modified
lib/lp/code/model/gitrepository.py (+2/-0)
lib/lp/code/model/tests/test_gitrepository.py (+32/-0)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+384843@code.launchpad.net

Commit message

Ensuring constant query count on GitRepository.checkRefPermissions

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/code/model/gitrepository.py b/lib/lp/code/model/gitrepository.py
2index bc9785a..2e9080f 100644
3--- a/lib/lp/code/model/gitrepository.py
4+++ b/lib/lp/code/model/gitrepository.py
5@@ -1393,6 +1393,8 @@ class GitRepository(StormBase, WebhookTargetMixin, GitIdentityMixin):
6 if is_owner:
7 grants = grants.union(
8 self.findRuleGrantsByGrantee(GitGranteeType.REPOSITORY_OWNER))
9+
10+ bulk.load_related(Person, grants, ["grantee_id"])
11 for grant in grants:
12 grants_for_user[grant.rule].append(grant)
13
14diff --git a/lib/lp/code/model/tests/test_gitrepository.py b/lib/lp/code/model/tests/test_gitrepository.py
15index 2917c4e..84044df 100644
16--- a/lib/lp/code/model/tests/test_gitrepository.py
17+++ b/lib/lp/code/model/tests/test_gitrepository.py
18@@ -514,6 +514,38 @@ class TestGitRepository(TestCaseWithFactory):
19 include_transitive=False)
20 self.assertEqual([exact_grant], list(results))
21
22+ def test_getRefsPermission_query_count(self):
23+ repository = self.factory.makeGitRepository()
24+ owner = repository.owner
25+ grantees = [self.factory.makePerson() for _ in range(2)]
26+
27+ ref_paths = ['refs/heads/master']
28+
29+ def add_fake_refs_to_request():
30+ ref_paths.append(
31+ self.factory.getUniqueUnicode("refs/heads/branch"))
32+
33+ with admin_logged_in():
34+ teams = [self.factory.makeTeam() for _ in range(2)]
35+ teams[0].addMember(grantees[0], teams[0].teamowner)
36+ teams[1].addMember(grantees[1], teams[1].teamowner)
37+ master_rule = self.factory.makeGitRule(
38+ repository=repository, ref_pattern=ref_paths[-1])
39+ self.factory.makeGitRuleGrant(
40+ rule=master_rule, grantee=teams[0], can_create=True)
41+ self.factory.makeGitRuleGrant(
42+ rule=master_rule, grantee=teams[1], can_push=True)
43+
44+ def check_permissions():
45+ repository.checkRefPermissions(grantees[0], ref_paths)
46+
47+ recorder1, recorder2 = record_two_runs(
48+ check_permissions, add_fake_refs_to_request, 1, 10,
49+ login_method=lambda: login_person(owner))
50+
51+ self.assertThat(recorder2, HasQueryCount.byEquality(recorder1))
52+ self.assertEqual(7, recorder1.count)
53+
54
55 class TestGitIdentityMixin(TestCaseWithFactory):
56 """Test the defaults and identities provided by GitIdentityMixin."""