1
from operator import attrgetter
3
from django.contrib.auth.models import AnonymousUser
4
from django.test import TestCase
6
from offspring.web.queuemanager.models import (
12
from offspring.web.queuemanager.tests.factory import factory
15
class ProjectTests(TestCase):
17
def test_default_manager(self):
18
# Make sure .all_objects is the default manager or else the admin UI
19
# will exclude all private objects and we would break model validation
20
# of unique fields if the user reuses a value from an object they're
22
self.assertEquals(Project.all_objects, Project._default_manager)
24
def test_is_private_for_public_project(self):
25
project = factory.makeProject(is_private=False)
26
self.assertEqual(False, project.is_private)
28
def test_is_private_for_private_project(self):
29
private_project = factory.makeProject(is_private=True)
30
self.assertEqual(True, private_project.is_private)
32
def test_is_visible_to_anyone_if_public(self):
33
project = factory.makeProject(is_private=False)
34
self.assertTrue(project.is_visible_to(AnonymousUser()))
36
def test_is_not_visible_to_anyone_if_private(self):
37
project = factory.makeProject(is_private=True)
38
self.assertFalse(project.is_visible_to(AnonymousUser()))
40
def test_is_visible_to_owner_if_private(self):
41
project = factory.makeProject(is_private=True)
42
self.assertTrue(project.is_visible_to(project.owner))
44
def test_is_visible_to_member_of_access_group_if_private(self):
45
user = factory.makeUser()
46
group = factory.makeAccessGroup([user])
47
project = factory.makeProject(is_private=True, access_groups=[group])
48
self.assertTrue(project.is_visible_to(user))
50
def test_default_model_manager_only_returns_public_projects(self):
51
project = factory.makeProject(is_private=False)
52
project2 = factory.makeProject(is_private=True)
53
self.assertEqual([project], list(Project.objects.all()))
55
def test_all_objects_model_manager(self):
56
# Project.all_objects() is a separate model manager which returns
57
# private objects as well. Its .all() method will return public and
58
# private objects regardless of whether or not the current user has
59
# access to them. It is to be used with caution.
60
project = factory.makeProject(is_private=False)
61
project2 = factory.makeProject(is_private=True)
62
self.assertEqual([project, project2], list(Project.all_objects.all()))
64
def test_accessible_by_user_with_anonymous_user(self):
65
project = factory.makeProject(is_private=True)
66
project2 = factory.makeProject(is_private=False)
67
self.assertEqual(True, project.is_private)
68
self.assertEqual(False, project2.is_private)
69
objects = Project.all_objects.accessible_by_user(AnonymousUser())
70
self.assertEqual([project2], list(objects))
72
def test_accessible_by_user_with_public_project(self):
73
user = factory.makeUser()
74
project = factory.makeProject(is_private=False)
75
self.assertEqual(False, project.is_private)
76
objects = Project.all_objects.accessible_by_user(user)
77
self.assertEqual([project], list(objects))
79
def test_accessible_by_user_with_private_project(self):
80
user = factory.makeUser()
81
group = factory.makeAccessGroup([user])
82
project = factory.makeProject(is_private=True, access_groups=[group])
83
# This second project is private but has no access groups set up, so
84
# the user cannot see it.
85
project2 = factory.makeProject(is_private=True)
86
self.assertEqual(True, project.is_private)
87
self.assertEqual(True, project2.is_private)
88
objects = Project.all_objects.accessible_by_user(user)
89
self.assertEqual([project], list(objects))
92
class ReleaseOrLexbuilderOrBuildResultOrBuildRequestTestsMixin(object):
93
"""A mixin with tests that work for the following models:
100
You just need to mix this with TestCase in your subclass and define
101
factoryMethod and model.
105
def factoryMethod(self, project):
106
raise NotImplementedError()
108
def test_default_manager(self):
109
# Make sure .all_objects is the default manager or else the admin UI
110
# will exclude all private objects and we would break model validation
111
# of unique fields if the user reuses a value from an object they're
112
# not allowed to see.
113
self.assertEquals(self.model.all_objects, self.model._default_manager)
115
def test_is_private_for_public_object(self):
116
public_object = self.factoryMethod(
117
factory.makeProject(is_private=False))
118
self.assertFalse(public_object.is_private)
120
def test_is_private_for_private_object(self):
121
private_object = self.factoryMethod(
122
factory.makeProject(is_private=True))
123
self.assertTrue(private_object.is_private)
125
def test_is_visible_to_anyone_if_public(self):
126
public_object = self.factoryMethod(
127
factory.makeProject(is_private=False))
128
self.assertTrue(public_object.is_visible_to(AnonymousUser()))
130
def test_is_not_visible_to_anyone_if_private(self):
131
private_object = self.factoryMethod(
132
factory.makeProject(is_private=True))
133
self.assertFalse(private_object.is_visible_to(AnonymousUser()))
135
def test_is_visible_to_owner_if_private(self):
136
# The object we're dealing with inherits the access-control rules from
137
# the project it's related to, so the owner that matters is the
139
owner = factory.makeUser()
140
private_object = self.factoryMethod(
141
factory.makeProject(is_private=True, owner=owner))
142
self.assertTrue(private_object.is_visible_to(owner))
144
def test_is_visible_to_member_of_access_group_if_private(self):
145
user = factory.makeUser()
146
group = factory.makeAccessGroup([user])
147
private_object = self.factoryMethod(
148
factory.makeProject(is_private=True, access_groups=[group]))
149
self.assertTrue(private_object.is_visible_to(user))
151
def test_default_model_manager_only_returns_public_objects(self):
152
private_object = self.factoryMethod(
153
factory.makeProject(is_private=True))
154
public_object = self.factoryMethod(
155
factory.makeProject(is_private=False))
156
self.assertEqual([public_object], list(self.model.objects.all()))
158
def test_all_objects_model_manager(self):
159
# self.model.all_objects() is a separate model manager which returns
160
# private objects as well. Its .all() method will return public and
161
# private objects regardless of whether or not the current user has
162
# access to them. It is to be used with caution.
163
public_object = self.factoryMethod(
164
project=factory.makeProject(is_private=False))
165
private_object = self.factoryMethod(
166
project=factory.makeProject(is_private=True))
167
self.assertEqual([public_object, private_object],
168
list(self.model.all_objects.all()))
170
def test_accessible_by_user(self):
171
user = factory.makeUser()
172
group = factory.makeAccessGroup([user])
173
visible_object = self.factoryMethod(
174
factory.makeProject(is_private=True, access_groups=[group]))
175
# This object is linked to a private project which has no access
176
# groups set up, so the user cannot see it.
177
invisible_object = self.factoryMethod(
178
project=factory.makeProject(is_private=True))
181
list(self.model.all_objects.accessible_by_user(user)))
185
TestCase, ReleaseOrLexbuilderOrBuildResultOrBuildRequestTestsMixin):
188
def factoryMethod(self, project):
189
return factory.makeRelease(
190
build=factory.makeBuildResult(project=project))
193
class LexbuilderTests(
194
TestCase, ReleaseOrLexbuilderOrBuildResultOrBuildRequestTestsMixin):
197
def factoryMethod(self, project):
198
return factory.makeLexbuilder(
199
current_job=factory.makeBuildResult(project=project))
202
class BuildResultTests(
203
TestCase, ReleaseOrLexbuilderOrBuildResultOrBuildRequestTestsMixin):
205
factoryMethod = factory.makeBuildResult
208
class BuildRequestTests(
209
TestCase, ReleaseOrLexbuilderOrBuildResultOrBuildRequestTestsMixin):
211
factoryMethod = factory.makeBuildRequest
214
class ProjectGroupTests(TestCase):
216
def test_get_projects_filters_private_objects(self):
217
user = factory.makeUser()
218
group = factory.makeProjectGroup()
219
public_project = factory.makeProject(
220
is_private=False, project_group=group)
221
private_project_visible_to_user = factory.makeProject(
222
is_private=True, project_group=group, owner=user)
223
private_project = factory.makeProject(
224
is_private=True, project_group=group)
226
sorted([public_project, private_project_visible_to_user],
227
key=attrgetter('name')),
228
sorted(group.get_projects(user), key=attrgetter('name')))