diff options
author | Florian Apolloner <florian@apolloner.eu> | 2013-02-26 09:53:47 +0100 |
---|---|---|
committer | Florian Apolloner <florian@apolloner.eu> | 2013-02-26 14:36:57 +0100 |
commit | 89f40e36246100df6a11316c31a76712ebc6c501 (patch) | |
tree | 6e65639683ddaf2027908d1ecb1739e0e2ff853b /tests/get_object_or_404 | |
parent | b3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff) | |
download | django-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz |
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/get_object_or_404')
-rw-r--r-- | tests/get_object_or_404/__init__.py | 0 | ||||
-rw-r--r-- | tests/get_object_or_404/models.py | 36 | ||||
-rw-r--r-- | tests/get_object_or_404/tests.py | 107 |
3 files changed, 143 insertions, 0 deletions
diff --git a/tests/get_object_or_404/__init__.py b/tests/get_object_or_404/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/get_object_or_404/__init__.py diff --git a/tests/get_object_or_404/models.py b/tests/get_object_or_404/models.py new file mode 100644 index 0000000000..bda060569e --- /dev/null +++ b/tests/get_object_or_404/models.py @@ -0,0 +1,36 @@ +""" +35. DB-API Shortcuts + +``get_object_or_404()`` is a shortcut function to be used in view functions for +performing a ``get()`` lookup and raising a ``Http404`` exception if a +``DoesNotExist`` exception was raised during the ``get()`` call. + +``get_list_or_404()`` is a shortcut function to be used in view functions for +performing a ``filter()`` lookup and raising a ``Http404`` exception if a +``DoesNotExist`` exception was raised during the ``filter()`` call. +""" + +from django.db import models +from django.utils.encoding import python_2_unicode_compatible + + +@python_2_unicode_compatible +class Author(models.Model): + name = models.CharField(max_length=50) + + def __str__(self): + return self.name + +class ArticleManager(models.Manager): + def get_query_set(self): + return super(ArticleManager, self).get_query_set().filter(authors__name__icontains='sir') + +@python_2_unicode_compatible +class Article(models.Model): + authors = models.ManyToManyField(Author) + title = models.CharField(max_length=50) + objects = models.Manager() + by_a_sir = ArticleManager() + + def __str__(self): + return self.title diff --git a/tests/get_object_or_404/tests.py b/tests/get_object_or_404/tests.py new file mode 100644 index 0000000000..38ebeb4f8c --- /dev/null +++ b/tests/get_object_or_404/tests.py @@ -0,0 +1,107 @@ +from __future__ import absolute_import + +from django.http import Http404 +from django.shortcuts import get_object_or_404, get_list_or_404 +from django.test import TestCase + +from .models import Author, Article + + +class GetObjectOr404Tests(TestCase): + def test_get_object_or_404(self): + a1 = Author.objects.create(name="Brave Sir Robin") + a2 = Author.objects.create(name="Patsy") + + # No Articles yet, so we should get a Http404 error. + self.assertRaises(Http404, get_object_or_404, Article, title="Foo") + + article = Article.objects.create(title="Run away!") + article.authors = [a1, a2] + # get_object_or_404 can be passed a Model to query. + self.assertEqual( + get_object_or_404(Article, title__contains="Run"), + article + ) + + # We can also use the Article manager through an Author object. + self.assertEqual( + get_object_or_404(a1.article_set, title__contains="Run"), + article + ) + + # No articles containing "Camelot". This should raise a Http404 error. + self.assertRaises(Http404, + get_object_or_404, a1.article_set, title__contains="Camelot" + ) + + # Custom managers can be used too. + self.assertEqual( + get_object_or_404(Article.by_a_sir, title="Run away!"), + article + ) + + # QuerySets can be used too. + self.assertEqual( + get_object_or_404(Article.objects.all(), title__contains="Run"), + article + ) + + # Just as when using a get() lookup, you will get an error if more than + # one object is returned. + + self.assertRaises(Author.MultipleObjectsReturned, + get_object_or_404, Author.objects.all() + ) + + # Using an empty QuerySet raises a Http404 error. + self.assertRaises(Http404, + get_object_or_404, Article.objects.none(), title__contains="Run" + ) + + # get_list_or_404 can be used to get lists of objects + self.assertEqual( + get_list_or_404(a1.article_set, title__icontains="Run"), + [article] + ) + + # Http404 is returned if the list is empty. + self.assertRaises(Http404, + get_list_or_404, a1.article_set, title__icontains="Shrubbery" + ) + + # Custom managers can be used too. + self.assertEqual( + get_list_or_404(Article.by_a_sir, title__icontains="Run"), + [article] + ) + + # QuerySets can be used too. + self.assertEqual( + get_list_or_404(Article.objects.all(), title__icontains="Run"), + [article] + ) + + def test_bad_class(self): + # Given an argument klass that is not a Model, Manager, or Queryset + # raises a helpful ValueError message + self.assertRaisesMessage(ValueError, + "Object is of type 'str', but must be a Django Model, Manager, " + "or QuerySet", + get_object_or_404, "Article", title__icontains="Run" + ) + + class CustomClass(object): + pass + + self.assertRaisesMessage(ValueError, + "Object is of type 'CustomClass', but must be a Django Model, " + "Manager, or QuerySet", + get_object_or_404, CustomClass, title__icontains="Run" + ) + + # Works for lists too + self.assertRaisesMessage(ValueError, + "Object is of type 'list', but must be a Django Model, Manager, " + "or QuerySet", + get_list_or_404, [Article], title__icontains="Run" + ) |