Last active
January 11, 2017 18:12
-
-
Save filipeximenes/2a1d669f3baecc4483c6042ea44186bb to your computer and use it in GitHub Desktop.
Django REST Framework tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
class Bike(models.Model): | |
COLOR_OPTIONS = (('yellow', 'Yellow'), ('red', 'Red'), ('black', 'Black')) | |
color = models.CharField(max_length=255, null=True, blank=True, | |
choices=COLOR_OPTIONS) | |
size = models.DecimalField(max_digits=4, decimal_places=2, null=True, blank=True) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from rest_framework import serializers | |
from bikes.models import Bike | |
class BikeSerializer(serializers.ModelSerializer): | |
COLOR_OPTIONS = ('yellow', 'black') | |
color = serializers.ChoiceField(choices=COLOR_OPTIONS) | |
size = serializers.FloatField(min_value=30.0, max_value=60.0) | |
class Meta: | |
model = Bike | |
fields = ['color', 'size'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from decimal import Decimal | |
from rest_framework.test import APITestCase | |
from bikes.models import Bike | |
from bikes.serializers import BikeSerializer | |
class BikeSerializerTests(APITestCase): | |
def setUp(self): | |
self.bike_attributes = { | |
'color': 'yellow', | |
'size': Decimal('52.12') | |
} | |
self.serializer_data = { | |
'color': 'black', | |
'size': 51.23 | |
} | |
self.bike = Bike.objects.create(**self.bike_attributes) | |
self.serializer = BikeSerializer(instance=self.bike) | |
def test_contains_expected_fields(self): | |
data = self.serializer.data | |
self.assertEqual(set(data.keys()), set(['color', 'size'])) | |
def test_color_field_content(self): | |
data = self.serializer.data | |
self.assertEqual(data['color'], self.bike_attributes['color']) | |
def test_size_field_content(self): | |
data = self.serializer.data | |
self.assertEqual(data['size'], float(self.bike_attributes['size'])) | |
def test_size_lower_bound(self): | |
self.serializer_data['size'] = 29.9 | |
serializer = BikeSerializer(data=self.serializer_data) | |
self.assertFalse(serializer.is_valid()) | |
self.assertEqual(set(serializer.errors), set(['size'])) | |
def test_size_upper_bound(self): | |
self.serializer_data['size'] = 60.1 | |
serializer = BikeSerializer(data=self.serializer_data) | |
self.assertFalse(serializer.is_valid()) | |
self.assertEqual(set(serializer.errors), set(['size'])) | |
def test_float_data_correctly_saves_as_decimal(self): | |
self.serializer_data['size'] = 31.789 | |
serializer = BikeSerializer(data=self.serializer_data) | |
serializer.is_valid() | |
new_bike = serializer.save() | |
new_bike.refresh_from_db() | |
self.assertEqual(new_bike.size, Decimal('31.79')) | |
def test_color_must_be_in_choices(self): | |
self.bike_attributes['color'] = 'red' | |
serializer = BikeSerializer(instance=self.bike, data=self.bike_attributes) | |
self.assertFalse(serializer.is_valid()) | |
self.assertEqual(set(serializer.errors.keys()), set(['color'])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment