From 6b09e5f2bba9167404ec329fa12c7f0215ca51ac Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 8 Oct 2014 11:22:10 +0100 Subject: Tests for generic relationships --- tests/test_genericrelations.py | 255 +++++++++++++++++------------------------ 1 file changed, 104 insertions(+), 151 deletions(-) (limited to 'tests') diff --git a/tests/test_genericrelations.py b/tests/test_genericrelations.py index a87ea3fd..380ad91d 100644 --- a/tests/test_genericrelations.py +++ b/tests/test_genericrelations.py @@ -1,151 +1,104 @@ -# from __future__ import unicode_literals -# from django.contrib.contenttypes.models import ContentType -# from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey -# from django.db import models -# from django.test import TestCase -# from rest_framework import serializers -# from rest_framework.compat import python_2_unicode_compatible - - -# @python_2_unicode_compatible -# class Tag(models.Model): -# """ -# Tags have a descriptive slug, and are attached to an arbitrary object. -# """ -# tag = models.SlugField() -# content_type = models.ForeignKey(ContentType) -# object_id = models.PositiveIntegerField() -# tagged_item = GenericForeignKey('content_type', 'object_id') - -# def __str__(self): -# return self.tag - - -# @python_2_unicode_compatible -# class Bookmark(models.Model): -# """ -# A URL bookmark that may have multiple tags attached. -# """ -# url = models.URLField() -# tags = GenericRelation(Tag) - -# def __str__(self): -# return 'Bookmark: %s' % self.url - - -# @python_2_unicode_compatible -# class Note(models.Model): -# """ -# A textual note that may have multiple tags attached. -# """ -# text = models.TextField() -# tags = GenericRelation(Tag) - -# def __str__(self): -# return 'Note: %s' % self.text - - -# class TestGenericRelations(TestCase): -# def setUp(self): -# self.bookmark = Bookmark.objects.create(url='https://www.djangoproject.com/') -# Tag.objects.create(tagged_item=self.bookmark, tag='django') -# Tag.objects.create(tagged_item=self.bookmark, tag='python') -# self.note = Note.objects.create(text='Remember the milk') -# Tag.objects.create(tagged_item=self.note, tag='reminder') - -# def test_generic_relation(self): -# """ -# Test a relationship that spans a GenericRelation field. -# IE. A reverse generic relationship. -# """ - -# class BookmarkSerializer(serializers.ModelSerializer): -# tags = serializers.RelatedField(many=True) - -# class Meta: -# model = Bookmark -# exclude = ('id',) - -# serializer = BookmarkSerializer(self.bookmark) -# expected = { -# 'tags': ['django', 'python'], -# 'url': 'https://www.djangoproject.com/' -# } -# self.assertEqual(serializer.data, expected) - -# def test_generic_nested_relation(self): -# """ -# Test saving a GenericRelation field via a nested serializer. -# """ - -# class TagSerializer(serializers.ModelSerializer): -# class Meta: -# model = Tag -# exclude = ('content_type', 'object_id') - -# class BookmarkSerializer(serializers.ModelSerializer): -# tags = TagSerializer(many=True) - -# class Meta: -# model = Bookmark -# exclude = ('id',) - -# data = { -# 'url': 'https://docs.djangoproject.com/', -# 'tags': [ -# {'tag': 'contenttypes'}, -# {'tag': 'genericrelations'}, -# ] -# } -# serializer = BookmarkSerializer(data=data) -# self.assertTrue(serializer.is_valid()) -# serializer.save() -# self.assertEqual(serializer.object.tags.count(), 2) - -# def test_generic_fk(self): -# """ -# Test a relationship that spans a GenericForeignKey field. -# IE. A forward generic relationship. -# """ - -# class TagSerializer(serializers.ModelSerializer): -# tagged_item = serializers.RelatedField() - -# class Meta: -# model = Tag -# exclude = ('id', 'content_type', 'object_id') - -# serializer = TagSerializer(Tag.objects.all(), many=True) -# expected = [ -# { -# 'tag': 'django', -# 'tagged_item': 'Bookmark: https://www.djangoproject.com/' -# }, -# { -# 'tag': 'python', -# 'tagged_item': 'Bookmark: https://www.djangoproject.com/' -# }, -# { -# 'tag': 'reminder', -# 'tagged_item': 'Note: Remember the milk' -# } -# ] -# self.assertEqual(serializer.data, expected) - -# def test_restore_object_generic_fk(self): -# """ -# Ensure an object with a generic foreign key can be restored. -# """ - -# class TagSerializer(serializers.ModelSerializer): -# class Meta: -# model = Tag -# exclude = ('content_type', 'object_id') - -# serializer = TagSerializer() - -# bookmark = Bookmark(url='http://example.com') -# attrs = {'tagged_item': bookmark, 'tag': 'example'} - -# tag = serializer.restore_object(attrs) -# self.assertEqual(tag.tagged_item, bookmark) +from __future__ import unicode_literals +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey +from django.db import models +from django.test import TestCase +from rest_framework import serializers +from rest_framework.compat import python_2_unicode_compatible + + +@python_2_unicode_compatible +class Tag(models.Model): + """ + Tags have a descriptive slug, and are attached to an arbitrary object. + """ + tag = models.SlugField() + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + tagged_item = GenericForeignKey('content_type', 'object_id') + + def __str__(self): + return self.tag + + +@python_2_unicode_compatible +class Bookmark(models.Model): + """ + A URL bookmark that may have multiple tags attached. + """ + url = models.URLField() + tags = GenericRelation(Tag) + + def __str__(self): + return 'Bookmark: %s' % self.url + + +@python_2_unicode_compatible +class Note(models.Model): + """ + A textual note that may have multiple tags attached. + """ + text = models.TextField() + tags = GenericRelation(Tag) + + def __str__(self): + return 'Note: %s' % self.text + + +class TestGenericRelations(TestCase): + def setUp(self): + self.bookmark = Bookmark.objects.create(url='https://www.djangoproject.com/') + Tag.objects.create(tagged_item=self.bookmark, tag='django') + Tag.objects.create(tagged_item=self.bookmark, tag='python') + self.note = Note.objects.create(text='Remember the milk') + Tag.objects.create(tagged_item=self.note, tag='reminder') + + def test_generic_relation(self): + """ + Test a relationship that spans a GenericRelation field. + IE. A reverse generic relationship. + """ + + class BookmarkSerializer(serializers.ModelSerializer): + tags = serializers.StringRelatedField(many=True) + + class Meta: + model = Bookmark + fields = ('tags', 'url') + + serializer = BookmarkSerializer(self.bookmark) + expected = { + 'tags': ['django', 'python'], + 'url': 'https://www.djangoproject.com/' + } + self.assertEqual(serializer.data, expected) + + def test_generic_fk(self): + """ + Test a relationship that spans a GenericForeignKey field. + IE. A forward generic relationship. + """ + + class TagSerializer(serializers.ModelSerializer): + tagged_item = serializers.StringRelatedField() + + class Meta: + model = Tag + fields = ('tag', 'tagged_item') + + serializer = TagSerializer(Tag.objects.all(), many=True) + expected = [ + { + 'tag': 'django', + 'tagged_item': 'Bookmark: https://www.djangoproject.com/' + }, + { + 'tag': 'python', + 'tagged_item': 'Bookmark: https://www.djangoproject.com/' + }, + { + 'tag': 'reminder', + 'tagged_item': 'Note: Remember the milk' + } + ] + self.assertEqual(serializer.data, expected) -- cgit v1.2.3