mirror of
https://github.com/fspc/workstand.git
synced 2025-02-23 09:13:23 -05:00
Tests!
This commit is contained in:
parent
f8deacacd3
commit
162a387b01
@ -1,3 +1,151 @@
|
|||||||
|
from decimal import Decimal
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from model_mommy import timezone
|
||||||
|
|
||||||
# Create your tests here.
|
from rest_framework.test import APIClient
|
||||||
|
from model_mommy import mommy
|
||||||
|
from rest_framework import status
|
||||||
|
from .models import Bike, BikeState
|
||||||
|
|
||||||
|
class TestGet(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.user = mommy.make('registration.CustomUser', is_admin=True, is_superuser=True)
|
||||||
|
|
||||||
|
def test_endpoint_exists(self):
|
||||||
|
client = APIClient()
|
||||||
|
result = client.get('/api/v1/bikes/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
def test_returns_bikes(self):
|
||||||
|
mommy.make('bike.bike', 10)
|
||||||
|
client = APIClient()
|
||||||
|
result = client.get('/api/v1/bikes/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertEqual(len(result.data), 10)
|
||||||
|
|
||||||
|
def test_create_new_bike(self):
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
data = {
|
||||||
|
"colour": "black",
|
||||||
|
"make": "Miyata",
|
||||||
|
"serial_number": "12345676",
|
||||||
|
"source": Bike.COS_BIKE_DIVERSION_PILOT,
|
||||||
|
"donated_by": "Greg",
|
||||||
|
"donated_at": "2017-01-01",
|
||||||
|
}
|
||||||
|
result = client.post('/api/v1/bikes/', data=data)
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_201_CREATED)
|
||||||
|
self.assertEqual(result.data['colour'], data['colour'])
|
||||||
|
self.assertEqual(result.data['make'], data['make'])
|
||||||
|
self.assertEqual(result.data['serial_number'], data['serial_number'])
|
||||||
|
self.assertEqual(result.data['source'], data['source'])
|
||||||
|
self.assertEqual(result.data['donated_by'], data['donated_by'])
|
||||||
|
self.assertEqual(result.data['donated_at'], data['donated_at'])
|
||||||
|
|
||||||
|
def test_update_partial_created_at(self):
|
||||||
|
bike = mommy.make('bike.Bike')
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
data = {'created_at': timezone.now().isoformat()}
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/', data=data)
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def test_update_partial_state(self):
|
||||||
|
bike = mommy.make('bike.Bike')
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
data = {'state': BikeState.CLAIMED}
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/', data=data)
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def test_assessed_cannot_transition(self):
|
||||||
|
bike = mommy.make('bike.Bike')
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/assessed/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
|
def test_assessed_cannot_transition(self):
|
||||||
|
data = {
|
||||||
|
"colour": "black",
|
||||||
|
"make": "Miyata",
|
||||||
|
"serial_number": "12345676",
|
||||||
|
"source": Bike.COS_BIKE_DIVERSION_PILOT,
|
||||||
|
"donated_by": "Greg",
|
||||||
|
"donated_at": "2017-01-01",
|
||||||
|
}
|
||||||
|
bike = Bike.objects.create(**data)
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/assessed/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def test_assessed_can_transition(self):
|
||||||
|
data = {
|
||||||
|
"colour": "black",
|
||||||
|
"make": "Miyata",
|
||||||
|
"serial_number": "12345676",
|
||||||
|
"source": Bike.COS_BIKE_DIVERSION_PILOT,
|
||||||
|
"donated_by": "Greg",
|
||||||
|
"donated_at": "2017-01-01",
|
||||||
|
"size": Bike.SMALL,
|
||||||
|
"price": Decimal('68.00')
|
||||||
|
}
|
||||||
|
bike = Bike.objects.create(**data)
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/assessed/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertEqual(result.data['state'], BikeState.ASSESSED)
|
||||||
|
|
||||||
|
def test_available_cannot_transition(self):
|
||||||
|
data = {
|
||||||
|
"colour": "black",
|
||||||
|
"make": "Miyata",
|
||||||
|
"serial_number": "12345676",
|
||||||
|
"source": Bike.COS_BIKE_DIVERSION_PILOT,
|
||||||
|
"donated_by": "Greg",
|
||||||
|
"donated_at": "2017-01-01",
|
||||||
|
"size": Bike.SMALL,
|
||||||
|
"price": Decimal('68.00'),
|
||||||
|
"state": BikeState.ASSESSED
|
||||||
|
}
|
||||||
|
bike = Bike.objects.create(**data)
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/available/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def test_available_can_transition(self):
|
||||||
|
data = {
|
||||||
|
"colour": "black",
|
||||||
|
"make": "Miyata",
|
||||||
|
"serial_number": "12345676",
|
||||||
|
"source": Bike.COS_BIKE_DIVERSION_PILOT,
|
||||||
|
"donated_by": "Greg",
|
||||||
|
"donated_at": "2017-01-01",
|
||||||
|
"size": Bike.SMALL,
|
||||||
|
"price": Decimal('68.00'),
|
||||||
|
"state": BikeState.ASSESSED,
|
||||||
|
"stolen": False,
|
||||||
|
"cpic_searched_at": timezone.now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
bike = Bike.objects.create(**data)
|
||||||
|
client = APIClient()
|
||||||
|
client.force_authenticate(user=self.user, token='blah')
|
||||||
|
result = client.put(f'/api/v1/bikes/{bike.id}/available/')
|
||||||
|
|
||||||
|
self.assertEqual(result.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertEqual(result.data['state'], BikeState.AVAILABLE)
|
||||||
|
@ -1,11 +1,18 @@
|
|||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
|
from django_fsm import can_proceed
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
|
from rest_framework.decorators import detail_route
|
||||||
|
from rest_framework.exceptions import ValidationError
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from bike.models import Bike
|
from bike.models import Bike, BikeState
|
||||||
from bike.serializers import BikeSerializer
|
from bike.serializers import BikeSerializer
|
||||||
|
|
||||||
|
from rest_framework import status
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
class BikesView(TemplateView):
|
class BikesView(TemplateView):
|
||||||
@ -18,3 +25,30 @@ class BikesView(TemplateView):
|
|||||||
class BikeViewSet(viewsets.ModelViewSet):
|
class BikeViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Bike.objects.all()
|
queryset = Bike.objects.all()
|
||||||
serializer_class = BikeSerializer
|
serializer_class = BikeSerializer
|
||||||
|
|
||||||
|
@detail_route(methods=['put'])
|
||||||
|
def assessed(self, request, pk):
|
||||||
|
bike = get_object_or_404(Bike, pk=pk)
|
||||||
|
state = BikeState.ASSESSED
|
||||||
|
if not can_proceed(bike.assessed):
|
||||||
|
raise ValidationError(detail=f'Transition from {bike.state} to {state}')
|
||||||
|
|
||||||
|
bike.assessed()
|
||||||
|
bike.save()
|
||||||
|
|
||||||
|
serializer = BikeSerializer(bike, context={'request': request})
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
@detail_route(methods=['put'])
|
||||||
|
def available(self, request, pk):
|
||||||
|
bike = get_object_or_404(Bike, pk=pk)
|
||||||
|
state = BikeState.AVAILABLE
|
||||||
|
if not can_proceed(bike.available):
|
||||||
|
raise ValidationError(detail=f'Transition from {bike.state} to {state}')
|
||||||
|
|
||||||
|
bike.available()
|
||||||
|
bike.save()
|
||||||
|
|
||||||
|
serializer = BikeSerializer(bike, context={'request': request})
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user