Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

testing admin.ModelAdmin in django

I am trying to find out the best way for testing admin.ModelAdmin in admin.py. Specifically I am overriding the save_model() function which I want to test. From the research I have done, the only solution I have found was writing a request/response test and then query the database.

like image 538
instigator Avatar asked Jun 27 '11 20:06

instigator


People also ask

What is admin Modeladmin in Django?

One of the most powerful parts of Django is the automatic admin interface. It reads metadata from your models to provide a quick, model-centric interface where trusted users can manage content on your site. The admin's recommended use is limited to an organization's internal management tool.

Where is admin HTML Django?

To view the default admin template you can access it in the django/contrib/admin/templates/admin folder.


2 Answers

As suggested in Udi's answer, we can study Django's own ModelAdmin tests, to determine the basic ingredients for a ModelAdmin test. Here's a summary:

Basic ingredients

In addition to the Django TestCase stuff, the basic ingredients are:

  1. An instance of AdminSite:

     from django.contrib.admin.sites import AdminSite 
  2. Your model class and corresponding ModelAdmin (sub)class:

     from my_app.models import MyModel  from my_app.admin import MyModelAdmin 
  3. Optionally, depending on your needs, a (mock) request and/or form.

Recipe

The first two ingredients are required to create an instance of your (custom) ModelAdmin:

my_model_admin = MyModelAdmin(model=MyModel, admin_site=AdminSite()) 

Based on the ModelAdmin source, the default save_model implementation only requires an instance of your model, so it can be called, for example, as follows:

my_model_admin.save_model(obj=MyModel(), request=None, form=None, change=None) # some test assertions here 

It all depends on what your save_model does, and what you want to test. Suppose your save_model checks user permissions, then you would need to pass a request (i.e. the third ingredient) with a valid user, in addition to the model instance:

super_user = User.objects.create_superuser(username='super', email='[email protected]',                                            password='pass') my_model_admin.save_model(obj=MyModel(), request=MockRequest(user=super_user),                           form=None, change=None) # some test assertions here 

An example of the MockRequest is defined below. Based on the Django test source, a minimal request consists of a Python object with a user attribute. The user attribute may refer to a mock user, or an actual instance of your AUTH_USER_MODEL, depending on your needs. An alternative would be to use django.test.RequestFactory.

class MockRequest(object):     def __init__(self, user=None):         self.user = user 

This basic approach applies to the other ModelAdmin methods as well.

like image 162
djvg Avatar answered Sep 28 '22 08:09

djvg


Check out Django's ModelAdminTests for examples.

like image 45
Udi Avatar answered Sep 28 '22 09:09

Udi