Skip to content

Commit 6b976dd

Browse files
committed
Add unit tests for edit feature
1 parent 6ae780b commit 6b976dd

File tree

3 files changed

+163
-3
lines changed

3 files changed

+163
-3
lines changed

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from setuptools import setup
22
import simple_history
33

4-
tests_require = ["Django>=1.4", "webtest==2.0.6", "django-webtest==1.7"]
4+
tests_require = [
5+
"Django>=1.4", "webtest==2.0.6", "django-webtest==1.7", "mock==1.2.0"
6+
]
57
try:
68
from unittest import skipUnless
79
except ImportError: # Python 2.6 compatibility

simple_history/admin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.core.exceptions import PermissionDenied
44
from django.conf.urls import patterns, url
55
from django.contrib import admin
6-
from django.contrib.admin import helpers
6+
from django.contrib.admin import helpers, ModelAdmin
77
from django.contrib.contenttypes.models import ContentType
88
from django.core.urlresolvers import reverse
99
from django.http import HttpResponseRedirect
@@ -26,7 +26,7 @@
2626
USER_NATURAL_KEY = tuple(key.lower() for key in USER_NATURAL_KEY.split('.', 1))
2727

2828

29-
class SimpleHistoryAdmin(admin.ModelAdmin):
29+
class SimpleHistoryAdmin(ModelAdmin):
3030
object_history_template = "simple_history/object_history.html"
3131
object_history_form_template = "simple_history/object_history_form.html"
3232

simple_history/tests/tests/test_admin.py

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
from datetime import datetime, timedelta
22

3+
from mock import patch, MagicMock, PropertyMock, ANY
34
from django_webtest import WebTest
5+
from django.contrib.admin import AdminSite
6+
from django.contrib.contenttypes.models import ContentType
7+
from django.contrib.messages.storage.fallback import FallbackStorage
48
from django.test.utils import override_settings
9+
from django.test.client import RequestFactory
510
from django import VERSION
611
from django.core.urlresolvers import reverse
712
from django.conf import settings
13+
from django.utils.encoding import force_text
814

915
try:
1016
from django.contrib.auth import get_user_model
@@ -17,6 +23,7 @@
1723
from django.contrib.admin.util import quote
1824

1925
from simple_history.models import HistoricalRecords
26+
from simple_history.admin import SimpleHistoryAdmin
2027
from ..models import Book, Person, Poll, State, Employee
2128

2229

@@ -250,3 +257,154 @@ def test_missing_one_to_one(self):
250257
manager.delete()
251258
response = self.app.get(get_history_url(employee, 0))
252259
self.assertEqual(response.status_code, 200)
260+
261+
def test_response_change(self):
262+
request = RequestFactory().post('/')
263+
request.POST = {'_change_history': True}
264+
request.session = 'session'
265+
request._messages = FallbackStorage(request)
266+
request.path = '/awesome/url/'
267+
268+
poll = Poll.objects.create(question="why?", pub_date=today)
269+
poll.question = "how?"
270+
poll.save()
271+
272+
admin = SimpleHistoryAdmin(Poll, 'admin')
273+
274+
response = admin.response_change(request, poll)
275+
276+
self.assertEqual(response.url, '/awesome/url/')
277+
278+
def test_response_change_no_change_history(self):
279+
request = RequestFactory().post('/')
280+
request.session = 'session'
281+
request._messages = FallbackStorage(request)
282+
request.user = self.user
283+
284+
poll = Poll.objects.create(question="why?", pub_date=today)
285+
poll.question = "how?"
286+
poll.save()
287+
288+
admin = SimpleHistoryAdmin(Poll, 'admin')
289+
290+
with patch(
291+
'simple_history.admin.ModelAdmin.response_change') as mock_admin:
292+
mock_admin.return_value = 'it was called'
293+
response = admin.response_change(request, poll)
294+
295+
self.assertEqual(response, 'it was called')
296+
297+
def test_history_form_view_without_getting_history(self):
298+
request = RequestFactory().post('/')
299+
request.session = 'session'
300+
request._messages = FallbackStorage(request)
301+
request.user = self.user
302+
303+
poll = Poll.objects.create(question="why?", pub_date=today)
304+
poll.question = "how?"
305+
poll.save()
306+
history = poll.history.all()[0]
307+
308+
309+
admin_site = AdminSite()
310+
admin = SimpleHistoryAdmin(Poll, admin_site)
311+
312+
with patch('simple_history.admin.render') as mock_render:
313+
admin.history_form_view(request, poll.id, history.pk)
314+
315+
context = {
316+
# Verify this is set for original object
317+
'original': poll,
318+
319+
'title': 'Revert {}'.format(force_text(history)),
320+
'adminform': ANY,
321+
'object_id': poll.id,
322+
'is_popup': False,
323+
'media': ANY,
324+
'errors': [
325+
'<ul class="errorlist"><li>This field is required.</li></ul>',
326+
'<ul class="errorlist"><li>This field is required.</li></ul>'
327+
],
328+
'app_label': 'tests',
329+
'original_opts': ANY,
330+
'changelist_url': '/admin/tests/poll/',
331+
'change_url': '/admin/tests/poll/1/',
332+
'history_url': '/admin/tests/poll/1/history/',
333+
'add': False,
334+
'change': True,
335+
'has_add_permission': admin.has_add_permission(request),
336+
'has_change_permission': admin.has_change_permission(
337+
request, poll),
338+
'has_delete_permission': admin.has_delete_permission(
339+
request, poll),
340+
'has_file_field': True,
341+
'has_absolute_url': False,
342+
'form_url': '',
343+
'opts': ANY,
344+
'content_type_id': ANY,
345+
'save_as': admin.save_as,
346+
'save_on_top': admin.save_on_top,
347+
'root_path': getattr(admin_site, 'root_path', None),
348+
}
349+
350+
mock_render.assert_called_once_with(
351+
request, template_name=admin.object_history_form_template,
352+
dictionary=context, current_app=admin_site.name)
353+
354+
def test_history_form_view_getting_history(self):
355+
request = RequestFactory().post('/')
356+
request.session = 'session'
357+
request._messages = FallbackStorage(request)
358+
request.user = self.user
359+
request.POST = {'_change_history': True}
360+
361+
poll = Poll.objects.create(question="why?", pub_date=today)
362+
poll.question = "how?"
363+
poll.save()
364+
history = poll.history.all()[0]
365+
366+
367+
admin_site = AdminSite()
368+
admin = SimpleHistoryAdmin(Poll, admin_site)
369+
370+
with patch('simple_history.admin.render') as mock_render:
371+
admin.history_form_view(request, poll.id, history.pk)
372+
373+
context = {
374+
# Verify this is set for history object not poll object
375+
'original': history,
376+
377+
'title': 'Revert {}'.format(force_text(history)),
378+
'adminform': ANY,
379+
'object_id': poll.id,
380+
'is_popup': False,
381+
'media': ANY,
382+
'errors': [
383+
'<ul class="errorlist"><li>This field is required.</li></ul>',
384+
'<ul class="errorlist"><li>This field is required.</li></ul>'
385+
],
386+
'app_label': 'tests',
387+
'original_opts': ANY,
388+
'changelist_url': '/admin/tests/poll/',
389+
'change_url': '/admin/tests/poll/2/',
390+
'history_url': '/admin/tests/poll/2/history/',
391+
'add': False,
392+
'change': True,
393+
'has_add_permission': admin.has_add_permission(request),
394+
'has_change_permission': admin.has_change_permission(
395+
request, poll),
396+
'has_delete_permission': admin.has_delete_permission(
397+
request, poll),
398+
'has_file_field': True,
399+
'has_absolute_url': False,
400+
'form_url': '',
401+
'opts': ANY,
402+
'content_type_id': ANY,
403+
'save_as': admin.save_as,
404+
'save_on_top': admin.save_on_top,
405+
'root_path': getattr(admin_site, 'root_path', None),
406+
}
407+
408+
mock_render.assert_called_once_with(
409+
request, template_name=admin.object_history_form_template,
410+
dictionary=context, current_app=admin_site.name)

0 commit comments

Comments
 (0)