Skip to content

Commit 766a519

Browse files
committed
Fix AGH issue by maintaining old unauthenticated locations endpoint, adding new authenticated locations_user endpoint. Clean up GSR booking tests and cache clearing.
1 parent 773568f commit 766a519

6 files changed

Lines changed: 111 additions & 30 deletions

File tree

backend/gsr_booking/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
MyMembershipViewSet,
1515
RecentGSRs,
1616
ReservationsView,
17+
UserLocations,
1718
)
1819

1920

@@ -27,6 +28,7 @@
2728
urlpatterns = [
2829
path("", include(router.urls)),
2930
path("locations/", Locations.as_view(), name="locations"),
31+
path("user-locations/", UserLocations.as_view(), name="user-locations"),
3032
path("recent/", RecentGSRs.as_view(), name="recent-gsrs"),
3133
path("wharton/", CheckWharton.as_view(), name="is-wharton"),
3234
path("seas/", CheckSEAS.as_view(), name="is-seas"),

backend/gsr_booking/views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ def get_queryset(self):
145145
class Locations(generics.ListAPIView):
146146
"""Lists all available locations to book from"""
147147

148+
serializer_class = GSRSerializer
149+
queryset = GSR.objects.all()
150+
151+
152+
class UserLocations(generics.ListAPIView):
153+
"""Lists all available locations to book based on user permission level"""
154+
148155
serializer_class = GSRSerializer
149156
permission_classes = [IsAuthenticated]
150157

backend/tests/gsr_booking/test_gsr_booking.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest import mock
2+
13
from django.contrib.auth import get_user_model
24
from django.test import TestCase
35
from rest_framework.test import APIClient
@@ -17,13 +19,16 @@ def setUp(self):
1719
username="user2", password="password", first_name="user", last_name="two"
1820
)
1921

20-
Group.objects.create(
21-
owner=self.user1, name="g1", color="blue"
22-
) # creating group also adds user
23-
group2 = Group.objects.create(owner=self.user2, name="g2", color="blue")
24-
GroupMembership.objects.create(user=self.user1, group=group2, accepted=True)
25-
group3 = Group.objects.create(owner=self.user2, name="g3", color="blue")
26-
GroupMembership.objects.create(user=self.user1, group=group3)
22+
with mock.patch(
23+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
24+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
25+
Group.objects.create(
26+
owner=self.user1, name="g1", color="blue"
27+
) # creating group also adds user
28+
group2 = Group.objects.create(owner=self.user2, name="g2", color="blue")
29+
GroupMembership.objects.create(user=self.user1, group=group2, accepted=True)
30+
group3 = Group.objects.create(owner=self.user2, name="g3", color="blue")
31+
GroupMembership.objects.create(user=self.user1, group=group3)
2732
self.client = APIClient()
2833
self.client.login(username="user1", password="password")
2934

@@ -42,11 +47,23 @@ class MembershipViewTestCase(TestCase):
4247
def setUp(self):
4348
self.user1 = User.objects.create_user(username="user1", password="password")
4449
self.user2 = User.objects.create_user(username="user2", password="password")
50+
self._patcher_seas = mock.patch(
51+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
52+
)
53+
self._patcher_wharton = mock.patch(
54+
"gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False
55+
)
56+
self._patcher_seas.start()
57+
self._patcher_wharton.start()
4558
self.group = Group.objects.create(owner=self.user1, name="g1", color="blue")
4659
self.group2 = Group.objects.create(owner=self.user2, name="g2", color="white")
4760
self.client = APIClient()
4861
self.client.login(username="user1", password="password")
4962

63+
def tearDown(self):
64+
self._patcher_seas.stop()
65+
self._patcher_wharton.stop()
66+
5067
def test_invite_single(self):
5168
self.client.login(username="user2", password="password")
5269
response = self.client.post(
@@ -148,11 +165,23 @@ class GroupTestCase(TestCase):
148165
def setUp(self):
149166
self.user1 = User.objects.create_user(username="user1", password="password")
150167
self.user2 = User.objects.create_user(username="user2", password="password")
168+
self._patcher_seas = mock.patch(
169+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
170+
)
171+
self._patcher_wharton = mock.patch(
172+
"gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False
173+
)
174+
self._patcher_seas.start()
175+
self._patcher_wharton.start()
151176
self.group = Group.objects.create(owner=self.user1, name="g1", color="blue")
152177
self.group2 = Group.objects.create(owner=self.user2, name="g2", color="white")
153178
self.client = APIClient()
154179
self.client.login(username="user1", password="password")
155180

181+
def tearDown(self):
182+
self._patcher_seas.stop()
183+
self._patcher_wharton.stop()
184+
156185
def test_get_groups(self):
157186
response = self.client.get("/gsr/groups/")
158187
self.assertEqual(200, response.status_code)

backend/tests/gsr_booking/test_gsr_views.py

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ class TestGSRs(TestCase):
8686
def setUpTestData(cls):
8787
create_test_gsrs(cls)
8888
test_user = User.objects.create_user("user1", "user")
89-
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
89+
with mock.patch(
90+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
91+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
92+
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
9093

9194
def setUp(self):
9295
# Clear cache to avoid stale data from previous tests
@@ -100,9 +103,22 @@ def setUp(self):
100103
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=False)
101104
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=False)
102105
def test_get_location(self, mock_is_seas, mock_is_wharton):
103-
"""Test that regular users do not see Wharton or PennGroups GSRs"""
104106
response = self.client.get(reverse("locations"))
105107
res_json = json.loads(response.content)
108+
for entry in res_json:
109+
if entry["id"] == 1:
110+
self.assertEquals(entry["name"], "Huntsman")
111+
if entry["id"] == 2:
112+
self.assertEquals(entry["name"], "Amy Gutmann Hall")
113+
if entry["id"] == 3:
114+
self.assertEquals(entry["name"], "Weigle")
115+
116+
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=False)
117+
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=False)
118+
def test_get_user_location(self, mock_is_seas, mock_is_wharton):
119+
"""Test that regular users do not see Wharton or PennGroups GSRs"""
120+
response = self.client.get(reverse("user-locations"))
121+
res_json = json.loads(response.content)
106122

107123
gsr_ids = [entry["id"] for entry in res_json]
108124

@@ -115,9 +131,9 @@ def test_get_location(self, mock_is_seas, mock_is_wharton):
115131

116132
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=False)
117133
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=False)
118-
def test_get_location_regular_user(self, mock_is_seas, mock_is_wharton):
134+
def test_get_user_location_regular_user(self, mock_is_seas, mock_is_wharton):
119135
"""Test that regular users only see LibCal GSRs"""
120-
response = self.client.get(reverse("locations"))
136+
response = self.client.get(reverse("user-locations"))
121137
res_json = json.loads(response.content)
122138

123139
# Regular users should only see LibCal GSRs
@@ -128,9 +144,9 @@ def test_get_location_regular_user(self, mock_is_seas, mock_is_wharton):
128144

129145
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=True)
130146
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=False)
131-
def test_get_location_wharton_user(self, mock_is_seas, mock_is_wharton):
147+
def test_get_user_location_wharton_user(self, mock_is_seas, mock_is_wharton):
132148
"""Test that Wharton users see LibCal and Wharton GSRs"""
133-
response = self.client.get(reverse("locations"))
149+
response = self.client.get(reverse("user-locations"))
134150
res_json = json.loads(response.content)
135151

136152
# Wharton users should see LibCal and Wharton GSRs
@@ -145,9 +161,9 @@ def test_get_location_wharton_user(self, mock_is_seas, mock_is_wharton):
145161

146162
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=False)
147163
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=True)
148-
def test_get_location_seas_user(self, mock_is_seas, mock_is_wharton):
164+
def test_get_user_location_seas_user(self, mock_is_seas, mock_is_wharton):
149165
"""Test that SEAS users see LibCal and PennGroups GSRs"""
150-
response = self.client.get(reverse("locations"))
166+
response = self.client.get(reverse("user-locations"))
151167
res_json = json.loads(response.content)
152168

153169
# SEAS users should see LibCal and PennGroups GSRs
@@ -162,9 +178,9 @@ def test_get_location_seas_user(self, mock_is_seas, mock_is_wharton):
162178

163179
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=True)
164180
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=True)
165-
def test_get_location_wharton_seas_user(self, mock_is_seas, mock_is_wharton):
181+
def test_get_user_location_wharton_seas_user(self, mock_is_seas, mock_is_wharton):
166182
"""Test that users with both Wharton and SEAS access see all non-Penn Labs GSRs"""
167-
response = self.client.get(reverse("locations"))
183+
response = self.client.get(reverse("user-locations"))
168184
res_json = json.loads(response.content)
169185

170186
# Users with both should see all kinds
@@ -177,15 +193,17 @@ def test_get_location_wharton_seas_user(self, mock_is_seas, mock_is_wharton):
177193
self.assertIn(GSR.KIND_WHARTON, kinds_seen)
178194
self.assertIn(GSR.KIND_PENNGROUPS, kinds_seen)
179195

180-
def test_get_location_penn_labs_member(self):
196+
@mock.patch("gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False)
197+
@mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False)
198+
def test_get_user_location_penn_labs_member(self, mock_is_wharton, mock_is_seas):
181199
"""Test that Penn Labs members see all GSRs regardless of their individual status"""
182200
# Add user to Penn Labs group
183201
penn_labs_group = Group.objects.get(name="Penn Labs")
184202
GroupMembership.objects.create(
185203
user=self.user, group=penn_labs_group, accepted=True, type=GroupMembership.MEMBER
186204
)
187205

188-
response = self.client.get(reverse("locations"))
206+
response = self.client.get(reverse("user-locations"))
189207
res_json = json.loads(response.content)
190208

191209
# Penn Labs members should see all GSRs
@@ -212,9 +230,9 @@ def test_get_location_penn_labs_member(self):
212230

213231
@mock.patch("gsr_booking.views.WhartonGSRBooker.is_wharton", return_value=False)
214232
@mock.patch("gsr_booking.views.PennGroupsGSRBooker.is_seas", return_value=False)
215-
def test_get_location_api_error_handling(self, mock_is_seas, mock_is_wharton):
233+
def test_get_user_location_api_error_handling(self, mock_is_seas, mock_is_wharton):
216234
"""Test that when permission checks return False, users only see LibCal GSRs"""
217-
response = self.client.get(reverse("locations"))
235+
response = self.client.get(reverse("user-locations"))
218236
res_json = json.loads(response.content)
219237

220238
# When permission checks return False, users should only see LibCal GSRs
@@ -228,7 +246,10 @@ class TestGSRFunctions(TestCase):
228246
def setUpTestData(cls):
229247
create_test_gsrs(cls)
230248
test_user = User.objects.create_user("user1", "user")
231-
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
249+
with mock.patch(
250+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
251+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
252+
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
232253

233254
def setUp(self):
234255
self.user = User.objects.create_user("user", "user@seas.upenn.edu", "user")
@@ -368,7 +389,10 @@ class TestSEASViews(TestCase):
368389
def setUpTestData(cls):
369390
create_test_gsrs(cls)
370391
test_user = User.objects.create_user("user1", "user")
371-
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
392+
with mock.patch(
393+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
394+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
395+
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
372396

373397
def setUp(self):
374398
self.user = User.objects.create_user("user", "user@seas.upenn.edu", "user")
@@ -430,7 +454,10 @@ class TestPennGroupsViews(TestCase):
430454
def setUpTestData(cls):
431455
create_test_gsrs(cls)
432456
test_user = User.objects.create_user("user1", "user")
433-
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
457+
with mock.patch(
458+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
459+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
460+
Group.objects.create(owner=test_user, name="Penn Labs", color="blue")
434461

435462
def setUp(self):
436463
self.user = User.objects.create_user("user", "user@seas.upenn.edu", "user")

backend/tests/gsr_booking/test_gsr_wrapper.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,15 +159,21 @@ def mock_get_user_pennid(self, user):
159159

160160

161161
class TestBookingWrapper(TestCase):
162-
def setUp(self):
162+
@classmethod
163+
def setUpTestData(cls):
163164
call_command("load_gsrs")
165+
166+
def setUp(self):
164167
self.user = User.objects.create_user("user", "user@seas.upenn.edu", "user")
165168
self.group_user = User.objects.create_user(
166169
"grou_user", "group_user@seas.upenn.edu", "group_user"
167170
)
168171
self.client = APIClient()
169172
self.client.force_authenticate(user=self.user)
170-
self.group = Group.objects.create(owner=self.group_user, name="Penn Labs", color="blue")
173+
with mock.patch(
174+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
175+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
176+
self.group = Group.objects.create(owner=self.group_user, name="Penn Labs", color="blue")
171177

172178
@mock.patch("gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False)
173179
@mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False)

backend/tests/gsr_booking/test_share_codes.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
from datetime import datetime, timedelta
3+
from unittest import mock
34

45
from django.contrib.auth import get_user_model
56
from django.core.management import call_command
@@ -43,13 +44,19 @@ def load_sample_booking(owner):
4344

4445

4546
class ShareCodeViewTests(TestCase):
46-
def setUp(self):
47+
@classmethod
48+
def setUpTestData(cls):
4749
call_command("load_gsrs")
50+
51+
def setUp(self):
4852
self.client = APIClient()
4953
self.owner = User.objects.create_user("owner", password="one")
5054
self.other = User.objects.create_user("other", password="two")
51-
Group.objects.create(owner=self.other, name="Penn Labs", color="blue")
52-
self.group = Group.objects.create(owner=self.owner, name="group", color="blue")
55+
with mock.patch(
56+
"gsr_booking.models.PennGroupsGSRBooker.is_seas", return_value=False
57+
), mock.patch("gsr_booking.models.WhartonGSRBooker.is_wharton", return_value=False):
58+
Group.objects.create(owner=self.other, name="Penn Labs", color="blue")
59+
self.group = Group.objects.create(owner=self.owner, name="group", color="blue")
5360

5461
self.booking = load_sample_booking(self.owner)
5562

@@ -258,8 +265,11 @@ def test_create_share_code_replaces_expired(self):
258265

259266

260267
class ShareCodeModelSerializerTests(TestCase):
261-
def setUp(self):
268+
@classmethod
269+
def setUpTestData(cls):
262270
call_command("load_gsrs")
271+
272+
def setUp(self):
263273
self.user = User.objects.create_user("owner", password="one")
264274
self.booking = load_sample_booking(self.user)
265275

0 commit comments

Comments
 (0)