Skip to content

Commit 3bac1ae

Browse files
committed
Added demonstrative tests for #43, moved admin tests into test_admin.py
1 parent 3937356 commit 3bac1ae

File tree

5 files changed

+170
-132
lines changed

5 files changed

+170
-132
lines changed

simple_history/tests/admin.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.contrib import admin
44

55
from simple_history.admin import SimpleHistoryAdmin
6-
from .models import Poll, Choice, Person, Book
6+
from .models import Poll, Choice, Person, Book, Document, Paper
77

88

99
class PersonAdmin(SimpleHistoryAdmin):
@@ -15,3 +15,5 @@ def has_change_permission(self, request, obj=None):
1515
admin.site.register(Choice, SimpleHistoryAdmin)
1616
admin.site.register(Person, PersonAdmin)
1717
admin.site.register(Book, SimpleHistoryAdmin)
18+
admin.site.register(Document, SimpleHistoryAdmin)
19+
admin.site.register(Paper, SimpleHistoryAdmin)

simple_history/tests/models.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,22 @@ class FileModel(models.Model):
8282

8383

8484
class Document(models.Model):
85-
changed_by = models.ForeignKey(User, null=True)
85+
changed_by = models.ForeignKey(User, null=True, blank=True)
8686
history = HistoricalRecords()
8787

8888
@property
8989
def _history_user(self):
9090
return self.changed_by
9191

9292

93+
class Paper(Document):
94+
history = HistoricalRecords()
95+
96+
@Document._history_user.setter
97+
def _history_user(self, value):
98+
self.changed_by = value
99+
100+
93101
class Profile(User):
94102
date_of_birth = models.DateField()
95103

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from .test_models import *
2+
from .test_admin import *
23
from .test_commands import *
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
from datetime import datetime, timedelta
2+
from django_webtest import WebTest
3+
from django import VERSION
4+
from django.core.urlresolvers import reverse
5+
try:
6+
from django.contrib.auth import get_user_model
7+
User = get_user_model()
8+
except ImportError: # django 1.4 compatibility
9+
from django.contrib.auth.models import User
10+
from django.contrib.admin.util import quote
11+
12+
from ..models import Book, Document, Person, Poll
13+
14+
15+
today = datetime(2021, 1, 1, 10, 0)
16+
tomorrow = today + timedelta(days=1)
17+
18+
19+
def get_history_url(model, history_index=None):
20+
try:
21+
info = model._meta.app_label, model._meta.module_name
22+
except AttributeError:
23+
info = model._meta.app_label, model._meta.model_name
24+
if history_index is not None:
25+
history = model.history.order_by('history_id')[history_index]
26+
return reverse('admin:%s_%s_simple_history' % info,
27+
args=[quote(model.pk), quote(history.history_id)])
28+
else:
29+
return reverse('admin:%s_%s_history' % info, args=[quote(model.pk)])
30+
31+
32+
class AdminSiteTest(WebTest):
33+
def setUp(self):
34+
self.user = User.objects.create_superuser('user_login',
35+
'[email protected]', 'pass')
36+
37+
def login(self, user=None):
38+
if user is None:
39+
user = self.user
40+
form = self.app.get(reverse('admin:index')).maybe_follow().form
41+
form['username'] = user.username
42+
form['password'] = 'pass'
43+
return form.submit()
44+
45+
def test_history_list(self):
46+
if VERSION >= (1, 5):
47+
try:
48+
module_name = self.user._meta.module_name
49+
except AttributeError:
50+
module_name = self.user._meta.model_name
51+
self.assertEqual(module_name, 'customuser')
52+
self.login()
53+
poll = Poll(question="why?", pub_date=today)
54+
poll._history_user = self.user
55+
poll.save()
56+
response = self.app.get(get_history_url(poll))
57+
self.assertIn(get_history_url(poll, 0), response.unicode_normal_body)
58+
self.assertIn("Poll object", response.unicode_normal_body)
59+
self.assertIn("Created", response.unicode_normal_body)
60+
self.assertIn(self.user.username, response.unicode_normal_body)
61+
62+
def test_history_form_permission(self):
63+
self.login(self.user)
64+
person = Person.objects.create(name='Sandra Hale')
65+
self.app.get(get_history_url(person, 0), status=403)
66+
67+
def test_invalid_history_form(self):
68+
self.login()
69+
poll = Poll.objects.create(question="why?", pub_date=today)
70+
response = self.app.get(get_history_url(poll, 0))
71+
response.form['question'] = ""
72+
response = response.form.submit()
73+
self.assertEqual(response.status_code, 200)
74+
self.assertIn("This field is required", response.unicode_normal_body)
75+
76+
def test_history_form(self):
77+
self.login()
78+
poll = Poll.objects.create(question="why?", pub_date=today)
79+
poll.question = "how?"
80+
poll.save()
81+
82+
# Make sure form for initial version is correct
83+
response = self.app.get(get_history_url(poll, 0))
84+
self.assertEqual(response.form['question'].value, "why?")
85+
self.assertEqual(response.form['pub_date_0'].value, "2021-01-01")
86+
self.assertEqual(response.form['pub_date_1'].value, "10:00:00")
87+
88+
# Create new version based on original version
89+
response.form['question'] = "what?"
90+
response.form['pub_date_0'] = "2021-01-02"
91+
response = response.form.submit()
92+
self.assertEqual(response.status_code, 302)
93+
if VERSION < (1, 4, 0):
94+
self.assertTrue(response.headers['location']
95+
.endswith(get_history_url(poll)))
96+
else:
97+
self.assertTrue(response.headers['location']
98+
.endswith(reverse('admin:tests_poll_changelist')))
99+
100+
# Ensure form for second version is correct
101+
response = self.app.get(get_history_url(poll, 1))
102+
self.assertEqual(response.form['question'].value, "how?")
103+
self.assertEqual(response.form['pub_date_0'].value, "2021-01-01")
104+
self.assertEqual(response.form['pub_date_1'].value, "10:00:00")
105+
106+
# Ensure form for new third version is correct
107+
response = self.app.get(get_history_url(poll, 2))
108+
self.assertEqual(response.form['question'].value, "what?")
109+
self.assertEqual(response.form['pub_date_0'].value, "2021-01-02")
110+
self.assertEqual(response.form['pub_date_1'].value, "10:00:00")
111+
112+
# Ensure current version of poll is correct
113+
poll = Poll.objects.get()
114+
self.assertEqual(poll.question, "what?")
115+
self.assertEqual(poll.pub_date, tomorrow)
116+
self.assertEqual([p.history_user for p in Poll.history.all()],
117+
[self.user, None, None])
118+
119+
def test_history_user_on_save_in_admin(self):
120+
self.login()
121+
122+
# Ensure polls created via admin interface save correct user
123+
add_page = self.app.get(reverse('admin:tests_poll_add'))
124+
add_page.form['question'] = "new poll?"
125+
add_page.form['pub_date_0'] = "2012-01-01"
126+
add_page.form['pub_date_1'] = "10:00:00"
127+
changelist_page = add_page.form.submit().follow()
128+
self.assertEqual(Poll.history.get().history_user, self.user)
129+
130+
# Ensure polls saved on edit page in admin interface save correct user
131+
change_page = changelist_page.click("Poll object")
132+
change_page.form.submit()
133+
self.assertEqual([p.history_user for p in Poll.history.all()],
134+
[self.user, self.user])
135+
136+
def test_underscore_in_pk(self):
137+
self.login()
138+
book = Book(isbn="9780147_513731")
139+
book._history_user = self.user
140+
book.save()
141+
response = self.app.get(get_history_url(book))
142+
self.assertIn(book.history.all()[0].revert_url(), response.unicode_normal_body)
143+
144+
def test_historical_user_no_setter(self):
145+
"""Demonstrate admin error without `_historical_user` setter.
146+
(Issue #43)
147+
148+
"""
149+
self.login()
150+
add_page = self.app.get(reverse('admin:tests_document_add'))
151+
self.assertRaises(AttributeError, add_page.form.submit)
152+
153+
def test_historical_user_with_setter(self):
154+
"""Documented work-around for #43"""
155+
self.login()
156+
add_page = self.app.get(reverse('admin:tests_paper_add'))
157+
add_page.form.submit()

simple_history/tests/tests/test_models.py

Lines changed: 0 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,14 @@
22

33
from datetime import datetime, timedelta
44

5-
from django import VERSION
65
try:
76
from django.contrib.auth import get_user_model
87
User = get_user_model()
98
except ImportError: # django 1.4 compatibility
109
from django.contrib.auth.models import User
1110
from django.db.models.loading import get_model
1211
from django.test import TestCase
13-
from django_webtest import WebTest
1412
from django.core.files.base import ContentFile
15-
from django.core.urlresolvers import reverse
16-
from django.contrib.admin.util import quote
1713

1814
from simple_history.models import HistoricalRecords
1915
from simple_history import register
@@ -457,132 +453,6 @@ def test_foreignkey_field(self):
457453
self.assertEqual(poll_as_of(times[0]).pk, how_poll.pk)
458454
self.assertEqual(poll_as_of(times[1]).pk, why_poll.pk)
459455

460-
461-
def get_history_url(model, history_index=None):
462-
try:
463-
info = model._meta.app_label, model._meta.module_name
464-
except AttributeError:
465-
info = model._meta.app_label, model._meta.model_name
466-
if history_index is not None:
467-
history = model.history.order_by('history_id')[history_index]
468-
return reverse('admin:%s_%s_simple_history' % info,
469-
args=[quote(model.pk), quote(history.history_id)])
470-
else:
471-
return reverse('admin:%s_%s_history' % info, args=[quote(model.pk)])
472-
473-
474-
class AdminSiteTest(WebTest):
475-
def setUp(self):
476-
self.user = User.objects.create_superuser('user_login',
477-
'[email protected]', 'pass')
478-
479-
def login(self, user=None):
480-
if user is None:
481-
user = self.user
482-
form = self.app.get(reverse('admin:index')).maybe_follow().form
483-
form['username'] = user.username
484-
form['password'] = 'pass'
485-
return form.submit()
486-
487-
def test_history_list(self):
488-
if VERSION >= (1, 5):
489-
try:
490-
module_name = self.user._meta.module_name
491-
except AttributeError:
492-
module_name = self.user._meta.model_name
493-
self.assertEqual(module_name, 'customuser')
494-
self.login()
495-
poll = Poll(question="why?", pub_date=today)
496-
poll._history_user = self.user
497-
poll.save()
498-
response = self.app.get(get_history_url(poll))
499-
self.assertIn(get_history_url(poll, 0), response.unicode_normal_body)
500-
self.assertIn("Poll object", response.unicode_normal_body)
501-
self.assertIn("Created", response.unicode_normal_body)
502-
self.assertIn(self.user.username, response.unicode_normal_body)
503-
504-
def test_history_form_permission(self):
505-
self.login(self.user)
506-
person = Person.objects.create(name='Sandra Hale')
507-
self.app.get(get_history_url(person, 0), status=403)
508-
509-
def test_invalid_history_form(self):
510-
self.login()
511-
poll = Poll.objects.create(question="why?", pub_date=today)
512-
response = self.app.get(get_history_url(poll, 0))
513-
response.form['question'] = ""
514-
response = response.form.submit()
515-
self.assertEqual(response.status_code, 200)
516-
self.assertIn("This field is required", response.unicode_normal_body)
517-
518-
def test_history_form(self):
519-
self.login()
520-
poll = Poll.objects.create(question="why?", pub_date=today)
521-
poll.question = "how?"
522-
poll.save()
523-
524-
# Make sure form for initial version is correct
525-
response = self.app.get(get_history_url(poll, 0))
526-
self.assertEqual(response.form['question'].value, "why?")
527-
self.assertEqual(response.form['pub_date_0'].value, "2021-01-01")
528-
self.assertEqual(response.form['pub_date_1'].value, "10:00:00")
529-
530-
# Create new version based on original version
531-
response.form['question'] = "what?"
532-
response.form['pub_date_0'] = "2021-01-02"
533-
response = response.form.submit()
534-
self.assertEqual(response.status_code, 302)
535-
if VERSION < (1, 4, 0):
536-
self.assertTrue(response.headers['location']
537-
.endswith(get_history_url(poll)))
538-
else:
539-
self.assertTrue(response.headers['location']
540-
.endswith(reverse('admin:tests_poll_changelist')))
541-
542-
# Ensure form for second version is correct
543-
response = self.app.get(get_history_url(poll, 1))
544-
self.assertEqual(response.form['question'].value, "how?")
545-
self.assertEqual(response.form['pub_date_0'].value, "2021-01-01")
546-
self.assertEqual(response.form['pub_date_1'].value, "10:00:00")
547-
548-
# Ensure form for new third version is correct
549-
response = self.app.get(get_history_url(poll, 2))
550-
self.assertEqual(response.form['question'].value, "what?")
551-
self.assertEqual(response.form['pub_date_0'].value, "2021-01-02")
552-
self.assertEqual(response.form['pub_date_1'].value, "10:00:00")
553-
554-
# Ensure current version of poll is correct
555-
poll = Poll.objects.get()
556-
self.assertEqual(poll.question, "what?")
557-
self.assertEqual(poll.pub_date, tomorrow)
558-
self.assertEqual([p.history_user for p in Poll.history.all()],
559-
[self.user, None, None])
560-
561-
def test_history_user_on_save_in_admin(self):
562-
self.login()
563-
564-
# Ensure polls created via admin interface save correct user
565-
add_page = self.app.get(reverse('admin:tests_poll_add'))
566-
add_page.form['question'] = "new poll?"
567-
add_page.form['pub_date_0'] = "2012-01-01"
568-
add_page.form['pub_date_1'] = "10:00:00"
569-
changelist_page = add_page.form.submit().follow()
570-
self.assertEqual(Poll.history.get().history_user, self.user)
571-
572-
# Ensure polls saved on edit page in admin interface save correct user
573-
change_page = changelist_page.click("Poll object")
574-
change_page.form.submit()
575-
self.assertEqual([p.history_user for p in Poll.history.all()],
576-
[self.user, self.user])
577-
578-
def test_underscore_in_pk(self):
579-
self.login()
580-
book = Book(isbn="9780147_513731")
581-
book._history_user = self.user
582-
book.save()
583-
response = self.app.get(get_history_url(book))
584-
self.assertIn(book.history.all()[0].revert_url(), response.unicode_normal_body)
585-
586456
def test_abstract_inheritance(self):
587457
for klass in (ConcreteAttr, ConcreteUtil):
588458
obj = klass.objects.create()

0 commit comments

Comments
 (0)