1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# Copyright 2009-2010 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Test Archive features."""
from zope.security.interfaces import Unauthorized
from canonical.testing.layers import DatabaseFunctionalLayer
from lp.registry.interfaces.person import PersonVisibility
from lp.testing import (
celebrity_logged_in,
login_person,
TestCaseWithFactory,
)
from lp.testing.mail_helpers import pop_notifications
from lp.testing.views import create_initialized_view
class TestArchiveSubscriptions(TestCaseWithFactory):
"""Edge-case tests for private PPA subscribers.
See also lib/lp/soyuz/stories/ppa/xx-private-ppa-subscription-stories.txt
"""
layer = DatabaseFunctionalLayer
def setUp(self):
"""Create a test archive."""
super(TestArchiveSubscriptions, self).setUp()
self.owner = self.factory.makePerson()
self.private_team = self.factory.makeTeam(
visibility=PersonVisibility.PRIVATE,
name="subscribertest", owner=self.owner)
login_person(self.owner)
self.archive = self.factory.makeArchive(
private=True, owner=self.private_team)
self.subscriber = self.factory.makePerson()
def test_subscriber_can_access_private_team_ppa(self):
# As per bug 597783, we need to make sure a subscriber can see
# a private team's PPA after they have been given a subscription.
# This is essentially allowing access for the subscriber to see
# the private team.
def get_name():
return self.archive.owner.name
# Before a subscription, accessing the team name will raise.
login_person(self.subscriber)
self.assertRaises(Unauthorized, get_name)
login_person(self.owner)
self.archive.newSubscription(
self.subscriber, registrant=self.archive.owner)
# When a subscription exists, it's fine.
login_person(self.subscriber)
self.assertEqual(self.archive.owner.name, "subscribertest")
def test_subscriber_can_browse_private_team_ppa(self):
# As per bug 597783, we need to make sure a subscriber can see
# a private team's PPA after they have been given a subscription.
# This test ensures the subscriber can correctly load the PPA's view,
# thus ensuring that all attributes necessary to render the view have
# the necessary security permissions.
# Before a subscription, accessing the view name will raise.
login_person(self.subscriber)
view = create_initialized_view(
self.archive, '+index', principal=self.subscriber)
self.assertRaises(Unauthorized, view.render)
login_person(self.owner)
self.archive.newSubscription(
self.subscriber, registrant=self.archive.owner)
# When a subscription exists, it's fine.
login_person(self.subscriber)
self.assertIn(self.archive.displayname, view.render())
# Just to double check, by default, the subscriber still can't see the
# +packages view which requires extra permissions.
self.assertRaises(
Unauthorized, create_initialized_view,
self.archive, '+packages', principal=self.subscriber)
def test_new_subscription_sends_email(self):
# Creating a new subscription sends an email to all members
# of the person or team subscribed.
self.assertEqual(0, len(pop_notifications()))
self.archive.newSubscription(
self.subscriber, registrant=self.archive.owner)
notifications = pop_notifications()
self.assertEqual(1, len(notifications))
self.assertEqual(
self.subscriber.preferredemail.email,
notifications[0]['to'])
def test_new_commercial_subscription_no_email(self):
# As per bug 611568, an email is not sent for commercial PPAs.
with celebrity_logged_in('commercial_admin'):
self.archive.commercial = True
# Logging in as a celebrity team causes an email to be sent
# because a person is added as a member of the team, so this
# needs to be cleared out before calling newSubscription().
pop_notifications()
self.archive.newSubscription(
self.subscriber, registrant=self.archive.owner)
self.assertEqual(0, len(pop_notifications()))
|