mirror of
https://github.com/jazzband/django-admin-sortable.git
synced 2026-03-17 06:20:33 +00:00
Refactored how the sortable_by properties get populated by looping over the model fields until we get to the SortableForeignKey, then grabbing properties from the field and its related data.
141 lines
6.1 KiB
Python
141 lines
6.1 KiB
Python
import httplib
|
|
import json
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.core.urlresolvers import reverse
|
|
from django.db import models
|
|
from django.test import TestCase
|
|
from django.test.client import Client, RequestFactory
|
|
|
|
from adminsortable.fields import SortableForeignKey
|
|
from adminsortable.models import Sortable, MultipleSortableForeignKeyException
|
|
from app.models import Category, Credit, Note
|
|
|
|
|
|
class BadSortableModel(models.Model):
|
|
note = SortableForeignKey(Note)
|
|
credit = SortableForeignKey(Credit)
|
|
|
|
|
|
class TestSortableModel(Sortable):
|
|
title = models.CharField(max_length=100)
|
|
|
|
def __unicode__(self):
|
|
return self.title
|
|
|
|
|
|
class SortableTestCase(TestCase):
|
|
def setUp(self):
|
|
self.client = Client()
|
|
self.factory = RequestFactory()
|
|
self.user_raw_password = 'admin'
|
|
self.user = User.objects.create_user('admin', 'admin@admin.com',
|
|
self.user_raw_password)
|
|
self.user.is_staff = True
|
|
self.user.is_superuser = True
|
|
self.user.save()
|
|
|
|
def create_category(self, title='Category 1'):
|
|
category = Category.objects.create(title=title)
|
|
return category
|
|
|
|
def test_new_user_is_authenticated(self):
|
|
self.assertEqual(self.user.is_authenticated(), True, 'User is not authenticated')
|
|
|
|
def test_new_user_is_staff(self):
|
|
self.assertEqual(self.user.is_staff, True, 'User is not staff')
|
|
|
|
def test_is_not_sortable(self):
|
|
"""
|
|
A model should only become sortable if it has more than
|
|
record to sort.
|
|
"""
|
|
category = self.create_category()
|
|
self.assertFalse(Category.is_sortable(),
|
|
'Category only has one record. It should not be sortable.')
|
|
|
|
def test_is_sortable(self):
|
|
category1 = self.create_category()
|
|
category2 = self.create_category(title='Category 2')
|
|
self.assertTrue(Category.is_sortable(),
|
|
'Category has more than one record. It should be sortable.')
|
|
|
|
def test_save_order_incremented(self):
|
|
category1 = self.create_category()
|
|
self.assertEqual(category1.order, 1, 'Category 1 order should be 1.')
|
|
|
|
category2 = self.create_category(title='Category 2')
|
|
self.assertEqual(category2.order, 2, 'Category 2 order should be 2.')
|
|
|
|
def test_adminsortable_change_list_view(self):
|
|
self.client.login(username=self.user.username, password=self.user_raw_password)
|
|
response = self.client.get('/admin/app/category/sort/')
|
|
self.assertEquals(response.status_code, httplib.OK, 'Unable to reach sort view.')
|
|
|
|
def make_test_categories(self):
|
|
category1 = self.create_category()
|
|
category2 = self.create_category(title='Category 2')
|
|
category3 = self.create_category(title='Category 3')
|
|
return category1, category2, category3
|
|
|
|
def get_sorting_url(self):
|
|
return reverse('admin:admin_do_sorting', args=(),
|
|
kwargs={'model_type_id' : Category.model_type_id()})
|
|
|
|
def get_category_indexes(self, *categories):
|
|
return {'indexes' : ','.join([str(c.id) for c in categories])}
|
|
|
|
def test_adminsortable_changelist_templates(self):
|
|
logged_in = self.client.login(username=self.user.username, password=self.user_raw_password)
|
|
self.assertTrue(logged_in, 'User is not logged in')
|
|
|
|
response = self.client.get(reverse('admin:admin_sort'))
|
|
self.assertEqual(response.status_code, httplib.OK, u'Admin sort request failed.')
|
|
|
|
#assert adminsortable change list templates are used
|
|
template_names = [t.name for t in response.templates]
|
|
self.assertTrue('adminsortable/change_list.html' in template_names,
|
|
u'adminsortable/change_list.html was not rendered')
|
|
self.assertTrue('adminsortable/shared/javascript_includes.html' in template_names,
|
|
u'JavaScript includes for adminsortable change list were not rendered')
|
|
|
|
def test_adminsortable_change_list_sorting_fails_if_not_ajax(self):
|
|
logged_in = self.client.login(username=self.user.username, password=self.user_raw_password)
|
|
self.assertTrue(logged_in, 'User is not logged in')
|
|
|
|
category1, category2, category3 = self.make_test_categories()
|
|
#make a normal POST
|
|
response = self.client.post(self.get_sorting_url(),
|
|
data=self.get_category_indexes(category1, category2, category3))
|
|
content = json.loads(response.content)
|
|
self.assertFalse(content.get('objects_sorted'), u'Objects should not have been sorted. An ajax post is required.')
|
|
|
|
def test_adminsortable_change_list_sorting_successful(self):
|
|
logged_in = self.client.login(username=self.user.username, password=self.user_raw_password)
|
|
self.assertTrue(logged_in, 'User is not logged in')
|
|
|
|
#make categories
|
|
category1, category2, category3 = self.make_test_categories()
|
|
|
|
#make an Ajax POST
|
|
response = self.client.post(self.get_sorting_url(),
|
|
data=self.get_category_indexes(category3, category2, category1),
|
|
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
|
|
content = json.loads(response.content)
|
|
self.assertTrue(content.get('objects_sorted'), u'Objects should have been sorted.')
|
|
|
|
#assert order is correct
|
|
categories = Category.objects.all()
|
|
cat1 = categories[0]
|
|
cat2 = categories[1]
|
|
cat3 = categories[2]
|
|
|
|
self.assertEqual(cat1.order, 1, u'First category returned should have order == 1')
|
|
self.assertEqual(cat1.pk, 3, u'Category ID 3 should have been first in queryset')
|
|
|
|
self.assertEqual(cat2.order, 2, u'Second category returned should have order == 2')
|
|
self.assertEqual(cat2.pk, 2, u'Category ID 2 should have been second in queryset')
|
|
|
|
self.assertEqual(cat3.order, 3, u'Third category returned should have order == 3')
|
|
self.assertEqual(cat3.pk, 1, u'Category ID 1 should have been third in queryset')
|
|
|