From ddd847602c73868544d6b90110233633cdae4997 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Mon, 17 Feb 2014 13:33:28 +0000 Subject: [PATCH 1/4] Docs: Added some tests for admin interface --- wagtail/wagtaildocs/tests.py | 146 +++++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 13 deletions(-) diff --git a/wagtail/wagtaildocs/tests.py b/wagtail/wagtaildocs/tests.py index 501deb776..43111789e 100644 --- a/wagtail/wagtaildocs/tests.py +++ b/wagtail/wagtaildocs/tests.py @@ -1,16 +1,136 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - from django.test import TestCase +from wagtail.wagtaildocs import models -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) +class TestDocument(TestCase): + pass # TODO: Write some tests + + +from wagtail.wagtailcore.models import Site +from django.contrib.auth.models import User + + +def get_default_host(): + return Site.objects.filter(is_default_site=True).first().root_url.split('://')[1] + + +def login(client): + # Create a user + User.objects.create_superuser(username='test', email='test@email.com', password='password') + + # Login + client.login(username='test', password='password') + + +class TestDocumentIndexView(TestCase): + def setUp(self): + login(self.client) + + def get(self, params={}): + return self.client.get('/admin/documents/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) + + def test_search(self): + response = self.get({'q': "Hello"}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['search_query'], "Hello") + + def test_pagination(self): + pages = ['0', '1', '-1', '9999', 'Not a page'] + for page in pages: + response = self.get({'p': page}) + self.assertEqual(response.status_code, 200) + + def test_ordering(self): + orderings = ['title', '-created_at'] + for ordering in orderings: + response = self.get({'ordering': ordering}) + self.assertEqual(response.status_code, 200) + + +class TestDocumentAddView(TestCase): + def setUp(self): + login(self.client) + + def get(self, params={}): + return self.client.get('/admin/documents/add/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) + + +class TestDocumentEditView(TestCase): + def setUp(self): + login(self.client) + + # Create a document to edit + self.document = models.Document.objects.create(title="Test document") + + def get(self, params={}): + return self.client.get('/admin/documents/edit/' + str(self.document.id) + '/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) + + +class TestDocumentDeleteView(TestCase): + def setUp(self): + login(self.client) + + # Create a document to delete + self.document = models.Document.objects.create(title="Test document") + + def get(self, params={}): + return self.client.get('/admin/documents/delete/' + str(self.document.id) + '/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) + + +class TestDocumentChooserView(TestCase): + def setUp(self): + login(self.client) + + def get(self, params={}): + return self.client.get('/admin/documents/chooser/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) + + def test_search(self): + response = self.get({'q': "Hello"}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['search_query'], "Hello") + + def test_pagination(self): + pages = ['0', '1', '-1', '9999', 'Not a page'] + for page in pages: + response = self.get({'p': page}) + self.assertEqual(response.status_code, 200) + + +class TestDocumentChooserChosenView(TestCase): + def setUp(self): + login(self.client) + + # Create a document to choose + self.document = models.Document.objects.create(title="Test document") + + def get(self, params={}): + return self.client.get('/admin/documents/chooser/' + str(self.document.id) + '/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) + + +class TestDocumentChooserUploadView(TestCase): + def setUp(self): + login(self.client) + + def get(self, params={}): + return self.client.get('/admin/documents/chooser/upload/', params, HTTP_HOST=get_default_host()) + + def test_status_code(self): + self.assertEqual(self.get().status_code, 200) From d79d2f3174263c518a98433a558405df80b47b50 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Mon, 17 Feb 2014 13:58:06 +0000 Subject: [PATCH 2/4] Added document permissions tester --- wagtail/wagtaildocs/tests.py | 40 +++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/wagtail/wagtaildocs/tests.py b/wagtail/wagtaildocs/tests.py index 43111789e..3b2995f2c 100644 --- a/wagtail/wagtaildocs/tests.py +++ b/wagtail/wagtaildocs/tests.py @@ -1,14 +1,40 @@ from django.test import TestCase from wagtail.wagtaildocs import models - - -class TestDocument(TestCase): - pass # TODO: Write some tests - - from wagtail.wagtailcore.models import Site -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group, Permission +# TODO: Test serve view + + +class TestDocumentPermissions(TestCase): + def setUp(self): + # Create some user accounts for testing permissions + self.user = User.objects.create_user(username='user', email='user@email.com', password='password') + self.owner = User.objects.create_user(username='owner', email='owner@email.com', password='password') + self.editor = User.objects.create_user(username='editor', email='editor@email.com', password='password') + self.editor.groups.add(Group.objects.get(name='Editors')) + self.administrator = User.objects.create_superuser(username='administrator', email='administrator@email.com', password='password') + + # Owner user must have the add_document permission + self.owner.user_permissions.add(Permission.objects.get(codename='add_document')) + + # Create a document for running tests on + self.document = models.Document.objects.create(title="Test document", uploaded_by_user=self.owner) + + def test_administrator_can_edit(self): + self.assertTrue(self.document.is_editable_by_user(self.administrator)) + + def test_editor_can_edit(self): + self.assertTrue(self.document.is_editable_by_user(self.editor)) + + def test_owner_can_edit(self): + self.assertTrue(self.document.is_editable_by_user(self.owner)) + + def test_user_cant_edit(self): + self.assertFalse(self.document.is_editable_by_user(self.user)) + + +## ===== ADMIN VIEWS ===== def get_default_host(): return Site.objects.filter(is_default_site=True).first().root_url.split('://')[1] From d90966c2f3ff1a705168886fbb23f2424dd9ca1f Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Tue, 18 Feb 2014 09:18:08 +0000 Subject: [PATCH 3/4] Docs: Don't use hard coded urls in tests --- wagtail/wagtaildocs/tests.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/wagtail/wagtaildocs/tests.py b/wagtail/wagtaildocs/tests.py index 3b2995f2c..7208352f0 100644 --- a/wagtail/wagtaildocs/tests.py +++ b/wagtail/wagtaildocs/tests.py @@ -2,6 +2,7 @@ from django.test import TestCase from wagtail.wagtaildocs import models from wagtail.wagtailcore.models import Site from django.contrib.auth.models import User, Group, Permission +from django.core.urlresolvers import reverse # TODO: Test serve view @@ -53,7 +54,7 @@ class TestDocumentIndexView(TestCase): login(self.client) def get(self, params={}): - return self.client.get('/admin/documents/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_index'), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) @@ -81,7 +82,7 @@ class TestDocumentAddView(TestCase): login(self.client) def get(self, params={}): - return self.client.get('/admin/documents/add/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_add_document'), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) @@ -95,7 +96,7 @@ class TestDocumentEditView(TestCase): self.document = models.Document.objects.create(title="Test document") def get(self, params={}): - return self.client.get('/admin/documents/edit/' + str(self.document.id) + '/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_edit_document', args=(self.document.id,)), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) @@ -109,7 +110,7 @@ class TestDocumentDeleteView(TestCase): self.document = models.Document.objects.create(title="Test document") def get(self, params={}): - return self.client.get('/admin/documents/delete/' + str(self.document.id) + '/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_delete_document', args=(self.document.id,)), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) @@ -120,7 +121,7 @@ class TestDocumentChooserView(TestCase): login(self.client) def get(self, params={}): - return self.client.get('/admin/documents/chooser/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_chooser'), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) @@ -145,7 +146,7 @@ class TestDocumentChooserChosenView(TestCase): self.document = models.Document.objects.create(title="Test document") def get(self, params={}): - return self.client.get('/admin/documents/chooser/' + str(self.document.id) + '/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_document_chosen', args=(self.document.id,)), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) @@ -156,7 +157,7 @@ class TestDocumentChooserUploadView(TestCase): login(self.client) def get(self, params={}): - return self.client.get('/admin/documents/chooser/upload/', params, HTTP_HOST=get_default_host()) + return self.client.get(reverse('wagtaildocs_chooser_upload'), params, HTTP_HOST=get_default_host()) def test_status_code(self): self.assertEqual(self.get().status_code, 200) From fa8d0041d6c9a7b299293af7049b247fe42caadb Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Tue, 18 Feb 2014 09:35:24 +0000 Subject: [PATCH 4/4] Docs tests now check 'query_string' instead of 'search_query' --- wagtail/wagtaildocs/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wagtail/wagtaildocs/tests.py b/wagtail/wagtaildocs/tests.py index 7208352f0..1a8079aad 100644 --- a/wagtail/wagtaildocs/tests.py +++ b/wagtail/wagtaildocs/tests.py @@ -62,7 +62,7 @@ class TestDocumentIndexView(TestCase): def test_search(self): response = self.get({'q': "Hello"}) self.assertEqual(response.status_code, 200) - self.assertEqual(response.context['search_query'], "Hello") + self.assertEqual(response.context['query_string'], "Hello") def test_pagination(self): pages = ['0', '1', '-1', '9999', 'Not a page']