Test a custom filter in admin.py Test a custom filter in admin.py django django

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