Test a custom filter in admin.py
Thanks to karthikr and lots of reading I've came up with the following solution (using Django's Pool example):
The filter method is defined as follows:
class WasPublishedRecentlyFilter(admin.SimpleListFilter): title = 'Was published recently' parameter_name = 'published_recently' def lookups(self, request, model_admin): return ( ('yes', 'Yes',), ('no', 'No',), ) def queryset(self, request, queryset): if self.value() == 'yes': #filter logic elif self.value() == 'no': #filter logic elif self.value(): return queryset.none()
And the test for the filter:
def test_filter(self): Poll.objects.create(question='Sup?', pub_date=timezone.now()) Poll.objects.create(question='How you doing?', pub_date=timezone.now() - datetime.timedelta(days=1)) filter = admin.WasPublishedRecentlyFilter(None, {'published_recently':'yes'}, Poll, admin.PollAdmin) poll = filter.queryset(None, Poll.objects.all())[0] self.assertEqual(poll.question, 'Sup?') filter = admin.WasPublishedRecentlyFilter(None, {'published_recently':'no'}, Poll, admin.PollAdmin) poll = filter.queryset(None, Poll.objects.all())[0] self.assertEqual(poll.question, 'How you doing?')
And the output:
Creating test database for alias 'default'....----------------------------------------------------------------------Ran 1 test in 0.124sOKDestroying test database for alias 'default'...
The 5 parameters that __init__
needs is from admin.SimpleListFilter
whose __init__
is defined as: (Source)
def __init__(self, request, params, model, model_admin):
You can pass in those parameters to test your filter