Finish duck donation feature

This commit is contained in:
Gergely Polonkai 2015-10-21 15:04:53 +02:00
parent 2fb616b17c
commit 7eb89d2f4c
2 changed files with 130 additions and 13 deletions

View File

@ -78,19 +78,15 @@ class DuckClassTest(WebTest):
self.user = User.objects.create_user(username='test', self.user = User.objects.create_user(username='test',
password='test') password='test')
spec = Species.objects.create(name='duck') self.species = Species.objects.create(name='duck')
self.location = Location.objects.create(name='temp')
loc = Location.objects.create(name='temp')
self.comp_bad = Competence.objects.create(name='test1', self.comp_bad = Competence.objects.create(name='test1',
added_by=self.user) added_by=self.user)
self.comp_good = Competence.objects.create(name='test2', self.comp_good = Competence.objects.create(name='test2',
added_by=self.user) added_by=self.user)
self.duck = Duck.objects.create(species=self.species,
self.duck = Duck.objects.create(species=spec,
name='test duck', name='test duck',
location=loc, location=self.location,
donated_by=self.user, donated_by=self.user,
color='123456') color='123456')
@ -201,6 +197,88 @@ class DuckClassTest(WebTest):
page_json = json.loads(page.content) page_json = json.loads(page.content)
self.assertEqual('already-booked', page_json['status']) self.assertEqual('already-booked', page_json['status'])
def test_incomplete_donation(self):
"""
Test duck donation with incomplete data
"""
params = {
# No parameters
'none': '',
# Empty parameter set
'empty': {},
# Species omitted
'species-omit': {
'location': self.location.pk,
'color': '123456',
},
# Missing species
'species-notfound': {
'location': self.location.pk,
'species': 9999,
'color': '123456',
'expected-code': 404,
'expected-error': 'bad-species',
},
# Location omitted
'location-omit': {
'species': self.species.pk,
'color': '123456',
},
# Missing location
'location-notfound': {
'location': 9999,
'species': self.species.pk,
'color': '123456',
'expected-code': 404,
'expected-error': 'bad-location',
},
# Color omitted
'color-omit': {
'location': self.location.pk,
'species': self.species.pk,
},
# Invalid color
'color-invalid': {
'location': self.location.pk,
'species': self.species.pk,
'color': 'red',
'expected-error': 'bad-color',
'expected-code': 400,
},
}
url = '/api/v1/ducks/donate/'
for name, param in params.items():
if param == '':
expected_code = 400
expected_error = 'incomplete-request'
else:
expected_code = param.pop('expected-code', 400)
expected_error = param.pop('expected-error',
'incomplete-request')
page = self.app.post(url,
params=param,
expect_errors=True,
user=self.user)
self.assertEquals(
expected_code,
page.status_code,
msg="Got unexpected status code ({}) for parameter set {}".format(
page.status_code,
name))
page_json = json.loads(page.content)
self.assertEquals(
expected_error,
page_json['status'],
msg="Got unexpected status code ({}) for parameter set {}".format(
page.status_code,
name))
def test_duck_donation(self): def test_duck_donation(self):
""" """
Test duck donating functionality Test duck donating functionality
@ -214,13 +292,23 @@ class DuckClassTest(WebTest):
page = self.app.post('/api/v1/ducks/donate/', expect_errors=True) page = self.app.post('/api/v1/ducks/donate/', expect_errors=True)
self.assertEquals(page.status_code, 403) self.assertEquals(page.status_code, 403)
self.app.post( color = '123456'
page = self.app.post(
'/api/v1/ducks/donate/', '/api/v1/ducks/donate/',
params={ params={
'species': 1, 'species': self.species.pk,
'color': '123456', 'location': self.location.pk,
'color': color,
}, },
user=self.user) user=self.user)
self.assertEquals(200, page.status_code)
page_json = json.loads(page.content)
self.assertIn('id', page_json)
duck = Duck.objects.get(pk=page_json['id'])
self.assertEquals(color, duck.color)
def test_duck_details(self): def test_duck_details(self):
""" """

View File

@ -3,6 +3,8 @@
Views for the Duck Booking Tool API Views for the Duck Booking Tool API
""" """
import re
from django.conf import settings from django.conf import settings
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from rest_framework import viewsets from rest_framework import viewsets
@ -11,7 +13,7 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
from .serializers import DuckSerializer, CompetenceSerializer from .serializers import DuckSerializer, CompetenceSerializer
from booking.models import Duck, Competence, Booking from booking.models import Duck, Competence, Booking, Species, Location
class DuckViewSet(viewsets.ModelViewSet): class DuckViewSet(viewsets.ModelViewSet):
""" """
@ -68,7 +70,34 @@ class DuckViewSet(viewsets.ModelViewSet):
API call to donate a new duck API call to donate a new duck
""" """
return Response({'Woot!'}) color = request.data.get('color')
species_id = request.data.get('species')
location_id = request.data.get('location')
if None in (color, species_id, location_id):
return Response({'status': 'incomplete-request'}, status=400)
try:
species = Species.objects.get(pk=species_id)
except Species.DoesNotExist:
return Response({'status': 'bad-species'}, status=404)
try:
location = Location.objects.get(pk=location_id)
except Location.DoesNotExist:
return Response({'status': 'bad-location'}, status=404)
if not re.match(r'^[0-9a-f]{6}$', color, flags=re.IGNORECASE):
return Response({'status': 'bad-color'}, status=400)
color = color.lower()
duck = Duck.objects.create(donated_by=request.user,
species=species,
location=location,
color=color)
return Response({'status': 'ok', 'id': duck.pk})
class CompetenceViewSet(viewsets.ModelViewSet): class CompetenceViewSet(viewsets.ModelViewSet):
""" """