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/admin_ordering | |
parent | b3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff) | |
download | django-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz |
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/admin_ordering')
-rw-r--r-- | tests/admin_ordering/__init__.py | 0 | ||||
-rw-r--r-- | tests/admin_ordering/models.py | 35 | ||||
-rw-r--r-- | tests/admin_ordering/tests.py | 106 |
3 files changed, 141 insertions, 0 deletions
diff --git a/tests/admin_ordering/__init__.py b/tests/admin_ordering/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/admin_ordering/__init__.py diff --git a/tests/admin_ordering/models.py b/tests/admin_ordering/models.py new file mode 100644 index 0000000000..195b3c3694 --- /dev/null +++ b/tests/admin_ordering/models.py @@ -0,0 +1,35 @@ +# coding: utf-8 +from django.contrib import admin +from django.db import models + + +class Band(models.Model): + name = models.CharField(max_length=100) + bio = models.TextField() + rank = models.IntegerField() + + class Meta: + ordering = ('name',) + +class Song(models.Model): + band = models.ForeignKey(Band) + name = models.CharField(max_length=100) + duration = models.IntegerField() + + class Meta: + ordering = ('name',) + +class SongInlineDefaultOrdering(admin.StackedInline): + model = Song + +class SongInlineNewOrdering(admin.StackedInline): + model = Song + ordering = ('duration', ) + +class DynOrderingBandAdmin(admin.ModelAdmin): + + def get_ordering(self, request): + if request.user.is_superuser: + return ['rank'] + else: + return ['name'] diff --git a/tests/admin_ordering/tests.py b/tests/admin_ordering/tests.py new file mode 100644 index 0000000000..faae834f93 --- /dev/null +++ b/tests/admin_ordering/tests.py @@ -0,0 +1,106 @@ +from __future__ import absolute_import, unicode_literals + +from django.test import TestCase, RequestFactory +from django.contrib.admin.options import ModelAdmin +from django.contrib.auth.models import User + +from .models import (Band, Song, SongInlineDefaultOrdering, + SongInlineNewOrdering, DynOrderingBandAdmin) + + +class MockRequest(object): + pass + +class MockSuperUser(object): + def has_perm(self, perm): + return True + +request = MockRequest() +request.user = MockSuperUser() + + +class TestAdminOrdering(TestCase): + """ + Let's make sure that ModelAdmin.queryset uses the ordering we define in + ModelAdmin rather that ordering defined in the model's inner Meta + class. + """ + + def setUp(self): + self.request_factory = RequestFactory() + b1 = Band(name='Aerosmith', bio='', rank=3) + b1.save() + b2 = Band(name='Radiohead', bio='', rank=1) + b2.save() + b3 = Band(name='Van Halen', bio='', rank=2) + b3.save() + + def test_default_ordering(self): + """ + The default ordering should be by name, as specified in the inner Meta + class. + """ + ma = ModelAdmin(Band, None) + names = [b.name for b in ma.queryset(request)] + self.assertEqual(['Aerosmith', 'Radiohead', 'Van Halen'], names) + + def test_specified_ordering(self): + """ + Let's use a custom ModelAdmin that changes the ordering, and make sure + it actually changes. + """ + class BandAdmin(ModelAdmin): + ordering = ('rank',) # default ordering is ('name',) + ma = BandAdmin(Band, None) + names = [b.name for b in ma.queryset(request)] + self.assertEqual(['Radiohead', 'Van Halen', 'Aerosmith'], names) + + def test_dynamic_ordering(self): + """ + Let's use a custom ModelAdmin that changes the ordering dinamically. + """ + super_user = User.objects.create(username='admin', is_superuser=True) + other_user = User.objects.create(username='other') + request = self.request_factory.get('/') + request.user = super_user + ma = DynOrderingBandAdmin(Band, None) + names = [b.name for b in ma.queryset(request)] + self.assertEqual(['Radiohead', 'Van Halen', 'Aerosmith'], names) + request.user = other_user + names = [b.name for b in ma.queryset(request)] + self.assertEqual(['Aerosmith', 'Radiohead', 'Van Halen'], names) + + +class TestInlineModelAdminOrdering(TestCase): + """ + Let's make sure that InlineModelAdmin.queryset uses the ordering we define + in InlineModelAdmin. + """ + + def setUp(self): + b = Band(name='Aerosmith', bio='', rank=3) + b.save() + self.b = b + s1 = Song(band=b, name='Pink', duration=235) + s1.save() + s2 = Song(band=b, name='Dude (Looks Like a Lady)', duration=264) + s2.save() + s3 = Song(band=b, name='Jaded', duration=214) + s3.save() + + def test_default_ordering(self): + """ + The default ordering should be by name, as specified in the inner Meta + class. + """ + inline = SongInlineDefaultOrdering(self.b, None) + names = [s.name for s in inline.queryset(request)] + self.assertEqual(['Dude (Looks Like a Lady)', 'Jaded', 'Pink'], names) + + def test_specified_ordering(self): + """ + Let's check with ordering set to something different than the default. + """ + inline = SongInlineNewOrdering(self.b, None) + names = [s.name for s in inline.queryset(request)] + self.assertEqual(['Jaded', 'Pink', 'Dude (Looks Like a Lady)'], names) |