From 5e6d22b76165d85963af75ece0b0b01ec9d01060 Mon Sep 17 00:00:00 2001 From: abdulhaq Date: Fri, 18 Sep 2015 23:27:54 +0200 Subject: [PATCH] added a factory with relations and basic tests --- example/factories/__init__.py | 29 +++++++++++++- example/models.py | 7 ++-- example/serializers.py | 3 +- example/tests/conftest.py | 5 ++- example/tests/test_factories.py | 17 ++++++++ example/tests/test_pagination.py | 68 ++++++++++++++++++++++++++++++++ example/views.py | 6 ++- 7 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 example/tests/test_pagination.py diff --git a/example/factories/__init__.py b/example/factories/__init__.py index 5577fda7..615920c3 100644 --- a/example/factories/__init__.py +++ b/example/factories/__init__.py @@ -3,7 +3,7 @@ import factory -from example.models import Blog +from example.models import Blog, Author, Entry class BlogFactory(factory.django.DjangoModelFactory): @@ -11,3 +11,30 @@ class Meta: model = Blog name = "Blog 1" + + +class AuthorFactory(factory.django.DjangoModelFactory): + class Meta: + model = Author + + name = "Author 1" + email = "author1@blog1.com" + + +class EntryFactory(factory.django.DjangoModelFactory): + class Meta: + model = Entry + + headline = "Headline 1" + body_text = "Here goes the body text" + + blog = factory.SubFactory(BlogFactory) + + @factory.post_generation + def authors(self, create, extracted, **kwargs): + if extracted: + if isinstance(extracted, (list, tuple)): + for author in extracted: + self.authors.add(author) + else: + self.authors.add(extracted) diff --git a/example/models.py b/example/models.py index f2719923..df0b2218 100644 --- a/example/models.py +++ b/example/models.py @@ -38,9 +38,9 @@ def __str__(self): class Entry(BaseModel): blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) - body_text = models.TextField() - pub_date = models.DateField() - mod_date = models.DateField() + body_text = models.TextField(null=True) + pub_date = models.DateField(null=True) + mod_date = models.DateField(null=True) authors = models.ManyToManyField(Author) n_comments = models.IntegerField(default=0) n_pingbacks = models.IntegerField(default=0) @@ -48,4 +48,3 @@ class Entry(BaseModel): def __str__(self): return self.headline - diff --git a/example/serializers.py b/example/serializers.py index 1f2c5965..0ed5d3f5 100644 --- a/example/serializers.py +++ b/example/serializers.py @@ -8,15 +8,16 @@ class Meta: model = Blog fields = ('name', ) + class EntrySerializer(serializers.ModelSerializer): class Meta: model = Entry fields = ('blog', 'headline', 'body_text', 'pub_date', 'mod_date', 'authors',) + class AuthorSerializer(serializers.ModelSerializer): class Meta: model = Author fields = ('name', 'email',) - diff --git a/example/tests/conftest.py b/example/tests/conftest.py index f4780d9f..5f50a20e 100644 --- a/example/tests/conftest.py +++ b/example/tests/conftest.py @@ -1,5 +1,8 @@ +import pytest from pytest_factoryboy import register -from example.factories import BlogFactory +from example.factories import BlogFactory, AuthorFactory, EntryFactory register(BlogFactory) +register(AuthorFactory) +register(EntryFactory) diff --git a/example/tests/test_factories.py b/example/tests/test_factories.py index d33df1cb..9d1ed2d2 100644 --- a/example/tests/test_factories.py +++ b/example/tests/test_factories.py @@ -26,3 +26,20 @@ def test_multiple_blog(blog_factory): assert another_blog.name == 'Cool Blog' assert new_blog.name == 'Awesome Blog' + + +def test_factories_with_relations(author_factory, entry_factory): + + author = author_factory(name="Joel Spolsky") + entry = entry_factory( + headline=("The Absolute Minimum Every Software Developer" + "Absolutely, Positively Must Know About Unicode " + "and Character Sets (No Excuses!)"), + blog__name='Joel on Software', authors=(author, )) + + assert entry.blog.name == 'Joel on Software' + assert entry.headline == ("The Absolute Minimum Every Software Developer" + "Absolutely, Positively Must Know About Unicode " + "and Character Sets (No Excuses!)") + assert entry.authors.all().count() == 1 + assert entry.authors.all()[0].name == 'Joel Spolsky' diff --git a/example/tests/test_pagination.py b/example/tests/test_pagination.py new file mode 100644 index 00000000..4f929287 --- /dev/null +++ b/example/tests/test_pagination.py @@ -0,0 +1,68 @@ +from django.core.urlresolvers import reverse + +import pytest +from example.tests.utils import dump_json, redump_json + +pytestmark = pytest.mark.django_db + + +@pytest.fixture +def single_entry(author_factory, entry_factory): + + author = author_factory(name="Joel Spolsky") + entry = entry_factory( + headline=("The Absolute Minimum Every Software Developer" + "Absolutely, Positively Must Know About Unicode " + "and Character Sets (No Excuses!)"), + blog__name='Joel on Software', + authors=(author, ) + ) + + +def test_pagination_with_single_entry(single_entry, client): + + expected = { + "data": [ + { + "type": "posts", + "id": "1", + "attributes": + { + "headline": "The Absolute Minimum Every Software DeveloperAbsolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)", + "body-text": "Here goes the body text", + "pub-date": None, + "mod-date": None + }, + "relationships": + { + "blog": { + "data": {"type": "blogs", "id": "1"} + }, + "authors": { + "meta": {"count": 1}, + "data": [{"type": "authors", "id": "1"}] + } + } + }], + "links": { + "first": "http://testserver/entries?page=1", + "last": "http://testserver/entries?page=1", + "next": None, + "prev": None, + }, + "meta": + { + "pagination": + { + "page": 1, + "pages": 1, + "count": 1 + } + } + } + + response = client.get(reverse("entry-list")) + content_dump = redump_json(response.content) + expected_dump = dump_json(expected) + + assert content_dump == expected_dump diff --git a/example/views.py b/example/views.py index 4a41f5d8..506a35b0 100644 --- a/example/views.py +++ b/example/views.py @@ -1,6 +1,7 @@ from rest_framework import viewsets from example.models import Blog, Entry, Author -from example.serializers import BlogSerializer, EntrySerializer, AuthorSerializer +from example.serializers import (BlogSerializer, EntrySerializer, + AuthorSerializer) class BlogViewSet(viewsets.ModelViewSet): @@ -8,14 +9,15 @@ class BlogViewSet(viewsets.ModelViewSet): queryset = Blog.objects.all() serializer_class = BlogSerializer + class EntryViewSet(viewsets.ModelViewSet): queryset = Entry.objects.all() serializer_class = EntrySerializer resource_name = 'posts' + class AuthorViewSet(viewsets.ModelViewSet): queryset = Author.objects.all() serializer_class = AuthorSerializer -