diff -r a525a55833f1 -r 0ede2f3adbc1 app/taggable/taggable_tests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/taggable/taggable_tests.py Sat Jul 25 01:09:46 2009 +0530 @@ -0,0 +1,243 @@ +#!/usr/bin/env python + +#Copyright 2008 Adam A. Crossland +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +#http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import sys +import os.path + +APPENGINE_PATH = '../../thirdparty/google_appengine' + +# Add app-engine related libraries to your path +paths = [ + APPENGINE_PATH, + os.path.join(APPENGINE_PATH, 'lib', 'django'), + os.path.join(APPENGINE_PATH, 'lib', 'webob'), + os.path.join(APPENGINE_PATH, 'lib', 'yaml', 'lib') +] +for path in paths: + if not os.path.exists(path): + raise 'Path does not exist: %s' % path +sys.path = paths + sys.path + +import unittest +from google.appengine.api import apiproxy_stub_map +from google.appengine.api import datastore_file_stub +from google.appengine.api import mail_stub +from google.appengine.api import user_service_stub +from google.appengine.ext import webapp +from google.appengine.ext import db +from google.appengine.api.memcache import memcache_stub +from taggable import * + +APP_ID = u'taggable' +AUTH_DOMAIN = 'gmail.com' +LOGGED_IN_USER = 'me@example.com' # set to '' for no logged in user + +BLOG_NAME='test_blog' + +class BlogIndex(db.Model): + "A global counter used to provide the index of the next blog post." + index = db.IntegerProperty(required=True, default=0) + "The next available index for a Post." + +class Post(Taggable, db.Model): + index = db.IntegerProperty(required=True, default=0) + body = db.TextProperty(required = True) + title = db.StringProperty() + added = db.DateTimeProperty(auto_now_add=True) + added_month = db.IntegerProperty() + added_year = db.IntegerProperty() + edited = db.DateTimeProperty() + + def __init__(self, parent=None, key_name=None, app=None, **entity_values): + db.Model.__init__(self, parent, key_name, app, **entity_values) + Taggable.__init__(self) + + def get_all_posts(): + return db.GqlQuery("SELECT * from Post ORDER BY added DESC") + Get_All_Posts = staticmethod(get_all_posts) + + @classmethod + def get_posts(cls, start_index=0, count=10): + start_index = int(start_index) # Just make sure that we have an int + posts = Post.gql('WHERE index <= :1 ORDER BY index DESC', start_index).fetch(count + 1) + if len(posts) > count: + posts = posts[:count] + + return posts + + @classmethod + def new_post(cls, new_title=None, new_body=None, new_tags=[]): + new_post = None + if new_title is not None and new_body is not None: + def txn(): + blog_index = BlogIndex.get_by_key_name(BLOG_NAME) + if blog_index is None: + blog_index = BlogIndex(key_name=BLOG_NAME) + new_index = blog_index.index + blog_index.index += 1 + blog_index.put() + + new_post_key_name = BLOG_NAME + str(new_index) + new_post = Post(key_name=new_post_key_name, parent=blog_index, + index = new_index, title = new_title, + body = new_body) + new_post.put() + + return new_post + new_post = db.run_in_transaction(txn) + + new_post.tags = new_tags + new_post.put() + else: + raise Exception("Must supply both new_title and new_body when creating a new Post.") + + return new_post + + def delete(self): + # Perform any actions that are required to maintain data integrity + # when this Post is delete. + # Disassociate this Post from any Tag + self.set_tags([]) + + # Finally, call the real delete + db.Model.delete(self) + +class MyTest(unittest.TestCase): + + def setUp(self): + # Start with a fresh api proxy. + apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap() + + # Use a fresh stub datastore. + stub = datastore_file_stub.DatastoreFileStub(APP_ID, '/dev/null', '/dev/null') + apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub) + + # Use a fresh memcache stub. + apiproxy_stub_map.apiproxy.RegisterStub('memcache', memcache_stub.MemcacheServiceStub()) + + # Use a fresh stub UserService. + apiproxy_stub_map.apiproxy.RegisterStub( + 'user', user_service_stub.UserServiceStub()) + os.environ['AUTH_DOMAIN'] = AUTH_DOMAIN + os.environ['USER_EMAIL'] = LOGGED_IN_USER + os.environ['APPLICATION_ID'] = APP_ID + + def testSimpleTagAdding(self): + new_post = Post.new_post(new_title='test post 1', new_body='This is a test post. Please ignore.') + assert new_post is not None + + new_post.tags = "test, testing, tests" + self.assertEqual(len(new_post.tags), 3) + + def testComplexTagAdding(self): + new_post = Post.new_post(new_title='test post 1', new_body='This is a test post. Please ignore.') + assert new_post is not None + + new_post.tags = " test, testing, tests,,,tag with spaces" + self.assertEqual(len(new_post.tags), 4) + + tag = new_post.tags[3] + assert tag is not None + self.assertEqual(tag.tag, 'tag with spaces') + self.assertEqual(tag.tagged_count, 1) + + tag2 = Tag.get_by_name('tag with spaces') + assert tag2 is not None + self.assertEqual(tag.tag, 'tag with spaces') + self.assertEqual(tag.tagged_count, 1) + + def testTagDeletion(self): + new_post = Post.new_post(new_title='test post 2', new_body='This is a test post. Please continue to ignore.') + assert new_post is not None + + new_post.tags = "test, testing, tests" + self.assertEqual(len(new_post.tags), 3) + + new_post.tags = "test" + self.assertEqual(len(new_post.tags), 1) + + def testTagCounts(self): + new_post3 = Post.new_post(new_title='test post 3', new_body='This is a test post. Please continue to ignore.') + assert new_post3 is not None + new_post3.tags = "foo, bar, baz" + new_post4 = Post.new_post(new_title='test post 4', new_body='This is a test post. Please continue to ignore.') + assert new_post4 is not None + new_post4.tags = "bar, baz, bletch" + new_post5 = Post.new_post(new_title='test post 5', new_body='This is a test post. Please continue to ignore.') + assert new_post5 is not None + new_post5.tags = "baz, bletch, quux" + + foo_tag = Tag.get_by_name('foo') + assert foo_tag is not None + self.assertEqual(foo_tag.tagged_count, 1) + + bar_tag = Tag.get_by_name('bar') + assert bar_tag is not None + self.assertEqual(bar_tag.tagged_count, 2) + + baz_tag = Tag.get_by_name('baz') + assert baz_tag is not None + self.assertEqual(baz_tag.tagged_count, 3) + + bletch_tag = Tag.get_by_name('bletch') + assert bletch_tag is not None + self.assertEqual(bletch_tag.tagged_count, 2) + + quux_tag = Tag.get_by_name('quux') + assert quux_tag is not None + self.assertEqual(quux_tag.tagged_count, 1) + + new_post3.tags = 'bar, baz' + foo_tag = Tag.get_by_name('foo') + assert foo_tag is not None + self.assertEqual(len(new_post3.tags), 2) + self.assertEqual(foo_tag.tagged_count, 0) + + def testTagGetTagsForKey(self): + new_post = Post.new_post(new_title='test post 6', new_body='This is a test post. Please continue to ignore.', new_tags='foo,bar,bletch,quux') + assert new_post is not None + + tags = Tag.get_tags_for_key(new_post.key()) + assert tags is not None + self.assertEqual(type(tags), type([])) + self.assertEqual(len(tags), 4) + + def testTagGetByName(self): + new_post = Post.new_post(new_title='test post 6', new_body='This is a test post. Please continue to ignore.', new_tags='foo,bar,bletch,quux') + assert new_post is not None + + quux_tag = Tag.get_by_name('quux') + assert quux_tag is not None + + zizzle_tag = Tag.get_by_name('zizzle') + assert zizzle_tag is None + + def testTagsString(self): + new_post = Post.new_post(new_title='test post 6', new_body='This is a test post. Please continue to ignore.', new_tags=' pal,poll ,,pip,pony') + assert new_post is not None + self.assertEqual(new_post.tags_string(), "pal,poll,pip,pony") + new_post.tag_separator = "|" + self.assertEqual(new_post.tags_string(), "pal|poll|pip|pony") + new_post.tag_separator = " , " + self.assertEqual(new_post.tags_string(), "pal , poll , pip , pony") + + new_post.tag_separator = ", " + new_post.tags = "pal, pill, pip" + self.assertEqual(len(new_post.tags), 3) + self.assertEqual(new_post.tags_string(), "pal, pill, pip") + +if __name__ == '__main__': + unittest.main()