summaryrefslogtreecommitdiff
path: root/objectapp/tests/metaweblog.py
diff options
context:
space:
mode:
Diffstat (limited to 'objectapp/tests/metaweblog.py')
-rw-r--r--objectapp/tests/metaweblog.py343
1 files changed, 343 insertions, 0 deletions
diff --git a/objectapp/tests/metaweblog.py b/objectapp/tests/metaweblog.py
new file mode 100644
index 00000000..7ca0189f
--- /dev/null
+++ b/objectapp/tests/metaweblog.py
@@ -0,0 +1,343 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's MetaWeblog API"""
+from xmlrpclib import Binary
+from xmlrpclib import Fault
+from xmlrpclib import ServerProxy
+from datetime import datetime
+from tempfile import TemporaryFile
+
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.files.storage import default_storage
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import DRAFT
+from objectapp.managers import PUBLISHED
+from objectapp.settings import UPLOAD_TO
+from objectapp.xmlrpc.metaweblog import authenticate
+from objectapp.xmlrpc.metaweblog import post_structure
+from objectapp.tests.utils import TestTransport
+
+
+class MetaWeblogTestCase(TestCase):
+ """Test cases for MetaWeblog"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ # Create data
+ self.webmaster = User.objects.create_superuser(
+ username='webmaster',
+ email='webmaster@example.com',
+ password='password')
+ self.contributor = User.objects.create_user(
+ username='contributor',
+ email='contributor@example.com',
+ password='password')
+ self.site = Site.objects.get_current()
+ self.objecttypes = [
+ Objecttype.objects.create(title='Objecttype 1',
+ slug='Objecttype-1'),
+ Objecttype.objects.create(title='Objecttype 2',
+ slug='Objecttype-2')]
+ params = {'title': 'My gbobject 1', 'content': 'My content 1',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-1',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.gbobject_1 = Gbobject.objects.create(**params)
+ self.gbobject_1.authors.add(self.webmaster)
+ self.gbobject_1.objecttypes.add(*self.objecttypes)
+ self.gbobject_1.sites.add(self.site)
+
+ params = {'title': 'My gbobject 2', 'content': 'My content 2',
+ 'creation_date': datetime(2010, 3, 15),
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-2'}
+ self.gbobject_2 = Gbobject.objects.create(**params)
+ self.gbobject_2.authors.add(self.webmaster)
+ self.gbobject_2.objecttypes.add(self.objecttypes[0])
+ self.gbobject_2.sites.add(self.site)
+ # Instanciating the server proxy
+ self.server = ServerProxy('http://localhost:8000/xmlrpc/',
+ transport=TestTransport())
+
+ def test_authenticate(self):
+ self.assertRaises(Fault, authenticate, 'badcontributor', 'badpassword')
+ self.assertRaises(Fault, authenticate, 'contributor', 'badpassword')
+ self.assertRaises(Fault, authenticate, 'contributor', 'password')
+ self.contributor.is_staff = True
+ self.contributor.save()
+ self.assertEquals(authenticate('contributor', 'password'),
+ self.contributor)
+ self.assertRaises(Fault, authenticate, 'contributor',
+ 'password', 'objectapp.change_gbobject')
+ self.assertEquals(authenticate('webmaster', 'password'),
+ self.webmaster)
+ self.assertEquals(authenticate('webmaster', 'password',
+ 'objectapp.change_gbobject'),
+ self.webmaster)
+
+ def test_get_users_blogs(self):
+ self.assertRaises(Fault, self.server.blogger.getUsersBlogs,
+ 'apikey', 'contributor', 'password')
+ self.assertEquals(self.server.blogger.getUsersBlogs(
+ 'apikey', 'webmaster', 'password'),
+ [{'url': 'http://example.com/',
+ 'blogid': 1,
+ 'blogName': 'example.com'}])
+
+ def test_get_user_info(self):
+ self.assertRaises(Fault, self.server.blogger.getUserInfo,
+ 'apikey', 'contributor', 'password')
+ self.webmaster.first_name = 'John'
+ self.webmaster.last_name = 'Doe'
+ self.webmaster.save()
+ self.assertEquals(self.server.blogger.getUserInfo(
+ 'apikey', 'webmaster', 'password'),
+ {'firstname': 'John', 'lastname': 'Doe',
+ 'url': 'http://example.com/authors/webmaster/',
+ 'userid': self.webmaster.pk,
+ 'nickname': 'webmaster',
+ 'email': 'webmaster@example.com'})
+
+ def test_get_authors(self):
+ self.assertRaises(Fault, self.server.wp.getAuthors,
+ 'apikey', 'contributor', 'password')
+ self.assertEquals(self.server.wp.getAuthors(
+ 'apikey', 'webmaster', 'password'), [
+ {'user_login': 'webmaster',
+ 'user_id': self.webmaster.pk,
+ 'user_email': 'webmaster@example.com',
+ 'display_name': 'webmaster'}])
+
+ def test_get_objecttypes(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getObjecttypes,
+ 1, 'contributor', 'password')
+ self.assertEquals(
+ self.server.metaWeblog.getObjecttypes('apikey',
+ 'webmaster', 'password'),
+ [{'rssUrl': 'http://example.com/feeds/objecttypes/Objecttype-1/',
+ 'description': 'Objecttype 1',
+ 'htmlUrl': 'http://example.com/objecttypes/Objecttype-1/',
+ 'ObjecttypeId': 1, 'parentId': 0,
+ 'ObjecttypeName': 'Objecttype 1',
+ 'ObjecttypeDescription': ''},
+ {'rssUrl': 'http://example.com/feeds/objecttypes/Objecttype-2/',
+ 'description': 'Objecttype 2',
+ 'htmlUrl': 'http://example.com/objecttypes/Objecttype-2/',
+ 'ObjecttypeId': 2, 'parentId': 0,
+ 'ObjecttypeName': 'Objecttype 2',
+ 'ObjecttypeDescription': ''}])
+ self.objecttypes[1].parent = self.objecttypes[0]
+ self.objecttypes[1].description = 'Objecttype 2 description'
+ self.objecttypes[1].save()
+ self.assertEquals(
+ self.server.metaWeblog.getObjecttypes('apikey',
+ 'webmaster', 'password'),
+ [{'rssUrl': 'http://example.com/feeds/objecttypes/Objecttype-1/',
+ 'description': 'Objecttype 1',
+ 'htmlUrl': 'http://example.com/objecttypes/Objecttype-1/',
+ 'ObjecttypeId': 1, 'parentId': 0,
+ 'ObjecttypeName': 'Objecttype 1',
+ 'ObjecttypeDescription': ''},
+ {'rssUrl':
+ 'http://example.com/feeds/objecttypes/Objecttype-1/Objecttype-2/',
+ 'description': 'Objecttype 2',
+ 'htmlUrl':
+ 'http://example.com/objecttypes/Objecttype-1/Objecttype-2/',
+ 'ObjecttypeId': 2, 'parentId': 1,
+ 'ObjecttypeName': 'Objecttype 2',
+ 'ObjecttypeDescription': 'Objecttype 2 description'}])
+
+ def test_new_Objecttype(self):
+ Objecttype_struct = {'name': 'Objecttype 3', 'slug': 'Objecttype-3',
+ 'description': 'Objecttype 3 description',
+ 'parent_id': self.objecttypes[0].pk}
+ self.assertRaises(Fault, self.server.wp.newObjecttype,
+ 1, 'contributor', 'password', Objecttype_struct)
+ self.assertEquals(Objecttype.objects.count(), 2)
+ new_Objecttype_id = self.server.wp.newObjecttype(
+ 1, 'webmaster', 'password', Objecttype_struct)
+ self.assertEquals(Objecttype.objects.count(), 3)
+ Objecttype = Objecttype.objects.get(pk=new_Objecttype_id)
+ self.assertEquals(Objecttype.title, 'Objecttype 3')
+ self.assertEquals(Objecttype.description, 'Objecttype 3 description')
+ self.assertEquals(Objecttype.slug, 'Objecttype-3')
+ self.assertEquals(Objecttype.parent.pk, 1)
+
+ def test_get_recent_posts(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getRecentPosts,
+ 1, 'contributor', 'password', 10)
+ self.assertEquals(len(self.server.metaWeblog.getRecentPosts(
+ 1, 'webmaster', 'password', 10)), 2)
+
+ def test_delete_post(self):
+ self.assertRaises(Fault, self.server.blogger.deletePost,
+ 'apikey', 1, 'contributor', 'password', 'publish')
+ self.assertEquals(Gbobject.objects.count(), 2)
+ self.assertTrue(
+ self.server.blogger.deletePost(
+ 'apikey', self.gbobject_1.pk, 'webmaster', 'password', 'publish'))
+ self.assertEquals(Gbobject.objects.count(), 1)
+
+ def test_get_post(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getPost,
+ 1, 'contributor', 'password')
+ post = self.server.metaWeblog.getPost(
+ self.gbobject_1.pk, 'webmaster', 'password')
+ self.assertEquals(post['title'], self.gbobject_1.title)
+ self.assertEquals(post['description'], '<p>My content 1</p>')
+ self.assertEquals(post['objecttypes'], ['Objecttype 1', 'Objecttype 2'])
+ self.assertEquals(post['dateCreated'].value, '2010-01-01T00:00:00')
+ self.assertEquals(post['link'],
+ 'http://example.com/2010/01/01/my-gbobject-1/')
+ self.assertEquals(post['permaLink'],
+ 'http://example.com/2010/01/01/my-gbobject-1/')
+ self.assertEquals(post['postid'], self.gbobject_1.pk)
+ self.assertEquals(post['userid'], 'webmaster')
+ self.assertEquals(post['mt_excerpt'], '')
+ self.assertEquals(post['mt_allow_comments'], 1)
+ self.assertEquals(post['mt_allow_pings'], 1)
+ self.assertEquals(post['mt_keywords'], self.gbobject_1.tags)
+ self.assertEquals(post['wp_author'], 'webmaster')
+ self.assertEquals(post['wp_author_id'], self.webmaster.pk)
+ self.assertEquals(post['wp_author_display_name'], 'webmaster')
+ self.assertEquals(post['wp_password'], '')
+ self.assertEquals(post['wp_slug'], self.gbobject_1.slug)
+
+ def test_new_post(self):
+ post = post_structure(self.gbobject_2, self.site)
+ self.assertRaises(Fault, self.server.metaWeblog.newPost,
+ 1, 'contributor', 'password', post, 1)
+ self.assertEquals(Gbobject.objects.count(), 2)
+ self.assertEquals(Gbobject.published.count(), 1)
+ self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 1)
+ self.assertEquals(Gbobject.objects.count(), 3)
+ self.assertEquals(Gbobject.published.count(), 2)
+ del post['dateCreated']
+ post['wp_author_id'] = self.contributor.pk
+ self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 0)
+ self.assertEquals(Gbobject.objects.count(), 4)
+ self.assertEquals(Gbobject.published.count(), 2)
+
+ def test_edit_post(self):
+ post = post_structure(self.gbobject_2, self.site)
+ self.assertRaises(Fault, self.server.metaWeblog.editPost,
+ 1, 'contributor', 'password', post, 1)
+ new_post_id = self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 0)
+
+ gbobject = Gbobject.objects.get(pk=new_post_id)
+ self.assertEquals(gbobject.title, self.gbobject_2.title)
+ self.assertEquals(gbobject.content, self.gbobject_2.html_content)
+ self.assertEquals(gbobject.excerpt, self.gbobject_2.excerpt)
+ self.assertEquals(gbobject.slug, self.gbobject_2.slug)
+ self.assertEquals(gbobject.status, DRAFT)
+ self.assertEquals(gbobject.password, self.gbobject_2.password)
+ self.assertEquals(gbobject.comment_enabled, True)
+ self.assertEquals(gbobject.pingback_enabled, True)
+ self.assertEquals(gbobject.objecttypes.count(), 1)
+ self.assertEquals(gbobject.authors.count(), 1)
+ self.assertEquals(gbobject.authors.all()[0], self.webmaster)
+ self.assertEquals(gbobject.creation_date, self.gbobject_2.creation_date)
+
+ gbobject.title = 'Title edited'
+ gbobject.creation_date = datetime(2000, 1, 1)
+ post = post_structure(gbobject, self.site)
+ post['objecttypes'] = ''
+ post['description'] = 'Content edited'
+ post['mt_excerpt'] = 'Content edited'
+ post['wp_slug'] = 'slug-edited'
+ post['wp_password'] = 'password'
+ post['mt_allow_comments'] = 2
+ post['mt_allow_pings'] = 0
+
+ response = self.server.metaWeblog.editPost(
+ new_post_id, 'webmaster', 'password', post, 1)
+ self.assertEquals(response, True)
+ gbobject = Gbobject.objects.get(pk=new_post_id)
+ self.assertEquals(gbobject.title, post['title'])
+ self.assertEquals(gbobject.content, post['description'])
+ self.assertEquals(gbobject.excerpt, post['mt_excerpt'])
+ self.assertEquals(gbobject.slug, 'slug-edited')
+ self.assertEquals(gbobject.status, PUBLISHED)
+ self.assertEquals(gbobject.password, 'password')
+ self.assertEquals(gbobject.comment_enabled, False)
+ self.assertEquals(gbobject.pingback_enabled, False)
+ self.assertEquals(gbobject.objecttypes.count(), 0)
+ self.assertEquals(gbobject.creation_date, datetime(2000, 1, 1))
+
+ del post['dateCreated']
+ post['wp_author_id'] = self.contributor.pk
+
+ response = self.server.metaWeblog.editPost(
+ new_post_id, 'webmaster', 'password', post, 1)
+ gbobject = Gbobject.objects.get(pk=new_post_id)
+ self.assertEquals(gbobject.authors.count(), 1)
+ self.assertEquals(gbobject.authors.all()[0], self.contributor)
+ self.assertEquals(gbobject.creation_date, datetime(2000, 1, 1))
+
+ def test_new_media_object(self):
+ file_ = TemporaryFile()
+ file_.write('My test content')
+ file_.seek(0)
+ media = {'name': 'objectapp_test_file.txt',
+ 'type': 'text/plain',
+ 'bits': Binary(file_.read())}
+ file_.close()
+
+ self.assertRaises(Fault, self.server.metaWeblog.newMediaObject,
+ 1, 'contributor', 'password', media)
+ new_media = self.server.metaWeblog.newMediaObject(
+ 1, 'webmaster', 'password', media)
+ self.assertTrue('/objectapp_test_file' in new_media['url'])
+ default_storage.delete('/'.join([
+ UPLOAD_TO, new_media['url'].split('/')[-1]]))