Skip to content

Commit

Permalink
Fix failure when component id is not numeric
Browse files Browse the repository at this point in the history
Just catch the ValueError and turn it into a proper error message. Tests
are added for this case.
  • Loading branch information
lubomir committed Aug 26, 2015
1 parent 8b451d8 commit d4ac26a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
20 changes: 20 additions & 0 deletions pdc/apps/component/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,11 @@ def test_retrieve_global_component_contacts(self):
self.assertEqual(response.data['contact']['email'],
'person1@test.com')

def test_list_for_non_int_component_id(self):
url = reverse('globalcomponentcontact-list', kwargs={'instance_pk': 'hello'})
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_update_global_component_contact(self):
url = reverse('globalcomponentcontact-detail', kwargs={'instance_pk': 2,
'pk': 1})
Expand Down Expand Up @@ -488,6 +493,11 @@ def test_list_specified_global_component_labels(self):
self.assertEqual(response.data.get('results')[0].get('name'), self.args_label1.get('name'))
self.assertEqual(response.data.get('results')[0].get('description'), self.args_label1.get('description'))

def test_list_for_non_int_component_id(self):
url = reverse('globalcomponentlabel-list', kwargs={'instance_pk': 'hello'})
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_retrieve_specified_global_component_label(self):
url = reverse('globalcomponentlabel-detail', kwargs={'instance_pk': 1, 'pk': 1})
response = self.client.get(url, format='json')
Expand Down Expand Up @@ -822,6 +832,11 @@ def test_release_component_contacts_url(self):
self.assertContains(response, 'release-components', 3)
self.assertContains(response, 'global-components', 2)

def test_list_for_non_int_component_id(self):
url = reverse('releasecomponentcontact-list', kwargs={'instance_pk': 'hello'})
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_detail_release_component_not_exist(self):
url = reverse('releasecomponent-detail', kwargs={'pk': 9999})
response = self.client.get(url, format='json')
Expand Down Expand Up @@ -1302,6 +1317,11 @@ def test_get_single_release_component_contact(self):
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_get_single_release_component_contact_with_bad_component_id(self):
url = reverse('releasecomponentcontact-detail', kwargs={'instance_pk': 'hello', 'pk': 5})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_assign_label_to_global_component_without_name(self):
url = reverse('globalcomponentlabel-list', kwargs={'instance_pk': 1})
response = self.client.post(url, format='json', data={})
Expand Down
25 changes: 21 additions & 4 deletions pdc/apps/component/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404
from django.http import Http404

from mptt.exceptions import InvalidMove

Expand Down Expand Up @@ -338,7 +339,11 @@ class GlobalComponentContactViewSet(HackedComponentContactMixin,

def get_queryset(self):
gc_id = self.kwargs.get('instance_pk')
gc = get_object_or_404(GlobalComponent, id=gc_id)
try:
gc = get_object_or_404(GlobalComponent, id=gc_id)
except ValueError:
# Raised when non-numeric instance_pk is given.
raise Http404('Global component with id=%s not found' % gc_id)
return gc.contacts.all()

def list(self, request, *args, **kwargs):
Expand Down Expand Up @@ -492,7 +497,11 @@ class GlobalComponentLabelViewSet(viewsets.PDCModelViewSet):

def get_queryset(self):
gc_id = self.kwargs.get('instance_pk')
gc = get_object_or_404(GlobalComponent, id=gc_id)
try:
gc = get_object_or_404(GlobalComponent, id=gc_id)
except ValueError:
# Raised when non-numeric instance_pk is given.
raise Http404('Global component with id=%s not found' % gc_id)
labels = gc.labels.all()
return labels

Expand Down Expand Up @@ -1078,7 +1087,11 @@ class ReleaseComponentContactViewSet(HackedComponentContactMixin,

def get_queryset(self):
rc_id = self.kwargs.get("instance_pk", None)
release_component = get_object_or_404(ReleaseComponent, pk=rc_id)
try:
release_component = get_object_or_404(ReleaseComponent, pk=rc_id)
except ValueError:
# Raised when non-numeric instance_pk is given.
raise Http404('Release component with id=%s not found' % rc_id)
return release_component.contacts.all()

def get_serializer_context(self):
Expand Down Expand Up @@ -1128,7 +1141,11 @@ def list(self, request, *args, **kwargs):
# cannot benefit from DRF built-in features such as pagination.
rc_id = kwargs.get("instance_pk", None)
# Release Component object
rc = get_object_or_404(ReleaseComponent, pk=rc_id)
try:
rc = get_object_or_404(ReleaseComponent, pk=rc_id)
except ValueError:
# Raised when non-numeric instance_pk is given.
raise Http404('Release component with id=%s not found' % rc_id)
gcc_qs = GlobalComponent.objects.get(pk=rc.global_component_id).contacts.all()
rcc_qs = rc.contacts.all()
# Contact type based inheritance mechanisms(excerpted from JIRA PDC-184)
Expand Down

0 comments on commit d4ac26a

Please sign in to comment.