Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 27 additions & 11 deletions resources/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,23 @@
Starship,
)

class MetaSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
abstract=True

meta = serializers.SerializerMethodField()

def get_meta(self, obj):
return { "created": obj.created, "edited": obj.edited }

class PeopleSerializer(serializers.HyperlinkedModelSerializer):
class PeopleSerializer(MetaSerializer):

homeworld = serializers.HyperlinkedRelatedField(
read_only=True,
view_name="planet-detail"
)


class Meta:
model = People
fields = (
Expand All @@ -38,10 +47,12 @@ class Meta:
"created",
"edited",
"url",
"meta"
)


class PlanetSerializer(serializers.HyperlinkedModelSerializer):

class PlanetSerializer(MetaSerializer):

class Meta:
model = Planet
Expand All @@ -59,11 +70,12 @@ class Meta:
"films",
"created",
"edited",
"url"
"url",
"meta"
)


class FilmSerializer(serializers.HyperlinkedModelSerializer):
class FilmSerializer(MetaSerializer):

class Meta:
model = Film
Expand All @@ -81,11 +93,12 @@ class Meta:
"species",
"created",
"edited",
"url"
"url",
"meta"
)


class SpeciesSerializer(serializers.HyperlinkedModelSerializer):
class SpeciesSerializer(MetaSerializer):

homeworld = serializers.HyperlinkedRelatedField(
read_only=True,
Expand All @@ -109,11 +122,12 @@ class Meta:
"films",
"created",
"edited",
"url"
"url",
"meta"
)


class VehicleSerializer(serializers.HyperlinkedModelSerializer):
class VehicleSerializer(MetaSerializer):

pilots = serializers.HyperlinkedRelatedField(
many=True,
Expand All @@ -139,11 +153,12 @@ class Meta:
"films",
"created",
"edited",
"url"
"url",
"meta"
)


class StarshipSerializer(serializers.HyperlinkedModelSerializer):
class StarshipSerializer(MetaSerializer):

pilots = serializers.HyperlinkedRelatedField(
many=True,
Expand Down Expand Up @@ -171,6 +186,7 @@ class Meta:
"films",
"created",
"edited",
"url"
"url",
"meta"
)

55 changes: 55 additions & 0 deletions resources/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
)

from .renderers import WookieeRenderer
from datetime import datetime
from django.utils import timezone


import json

Expand Down Expand Up @@ -82,48 +85,99 @@ def test_species_schema(self):
self.assertEqual(
self.get_query("/api/species/schema").status_code, 200)

def get_timezone_aware_datetime(self, date_string):
return timezone.make_aware(datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S.%fZ'), timezone.get_current_timezone())

def test_people_detail(self):
response = self.get_query("/api/people/1/")
json_data = json.loads(response.content)
person = People.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(person.name, json_data["name"])

def test_people_meta_detail(self):
response = self.get_query("/api/people/1/")
json_data = json.loads(response.content)
person = People.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(person.created, self.get_timezone_aware_datetime(json_data["meta"]["created"]))
self.assertEqual(person.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"]))

def test_planets_detail(self):
response = self.get_query("/api/planets/1/")
json_data = json.loads(response.content)
planet = Planet.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(planet.name, json_data["name"])

def test_planet_meta_detail(self):
response = self.get_query("/api/planets/1/")
json_data = json.loads(response.content)
planet = Planet.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(planet.created, self.get_timezone_aware_datetime(json_data["meta"]["created"]))
self.assertEqual(planet.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"]))

def test_films_detail(self):
response = self.get_query("/api/films/1/")
json_data = json.loads(response.content)
film = Film.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(film.title, json_data["title"])

def test_film_meta_detail(self):
response = self.get_query("/api/films/1/")
json_data = json.loads(response.content)
film = Film.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(film.created, self.get_timezone_aware_datetime(json_data["meta"]["created"]))
self.assertEqual(film.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"]))

def test_starships_detail(self):
response = self.get_query("/api/starships/2/")
json_data = json.loads(response.content)
starship = Starship.objects.get(pk=2)
self.assertEqual(response.status_code, 200)
self.assertEqual(starship.name, json_data["name"])

def test_starship_meta_detail(self):
response = self.get_query("/api/starships/2/")
json_data = json.loads(response.content)
starship = Starship.objects.get(pk=2)
self.assertEqual(response.status_code, 200)
self.assertEqual(starship.created, self.get_timezone_aware_datetime(json_data["meta"]["created"]))
self.assertEqual(starship.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"]))

def test_vehicles_detail(self):
response = self.get_query("/api/vehicles/4/")
json_data = json.loads(response.content)
vehicle = Vehicle.objects.get(pk=4)
self.assertEqual(response.status_code, 200)
self.assertEqual(vehicle.name, json_data["name"])

def test_vehicle_meta_detail(self):
response = self.get_query("/api/vehicles/4/")
json_data = json.loads(response.content)
vehicle = Vehicle.objects.get(pk=4)
self.assertEqual(response.status_code, 200)
self.assertEqual(vehicle.created, self.get_timezone_aware_datetime(json_data["meta"]["created"]))
self.assertEqual(vehicle.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"]))

def test_species_detail(self):
response = self.get_query("/api/species/1/")
json_data = json.loads(response.content)
specie = Species.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(specie.name, json_data["name"])

def test_species_meta_detail(self):
response = self.get_query("/api/species/1/")
json_data = json.loads(response.content)
species = Species.objects.get(pk=1)
self.assertEqual(response.status_code, 200)
self.assertEqual(species.created, self.get_timezone_aware_datetime(json_data["meta"]["created"]))
self.assertEqual(species.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"]))

def test_etag(self):
valid_etag = self.get_query("/api/")["ETag"]
self.client.defaults['HTTP_IF_NONE_MATCH'] = valid_etag
Expand All @@ -147,3 +201,4 @@ def test_wookie_format(self):
wr.translate_to_wookie(specie.name),
json_data[wr.translate_to_wookie("name")]
)