[Zope-CVS] SVN: messageboard/trunk/step02/ Add updated step 2 of
message board application.
Stephan Richter
srichter at cosmos.phy.tufts.edu
Sat May 15 17:36:46 EDT 2004
Log message for revision 24728:
Add updated step 2 of message board application.
-=-
Added: messageboard/trunk/step02/__init__.py
===================================================================
--- messageboard/trunk/step02/__init__.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/__init__.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1 @@
+# Make it a Python package
Added: messageboard/trunk/step02/browser/__init__.py
===================================================================
--- messageboard/trunk/step02/browser/__init__.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/__init__.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1 @@
+# Make it a Python package
Added: messageboard/trunk/step02/browser/configure.zcml
===================================================================
--- messageboard/trunk/step02/browser/configure.zcml 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/configure.zcml 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,113 @@
+<configure
+ xmlns="http://namespaces.zope.org/browser">
+
+ <addform
+ label="Add Message Board"
+ name="AddMessageBoard.html"
+ schema="book.messageboard.interfaces.IMessageBoard"
+ content_factory="book.messageboard.messageboard.MessageBoard"
+ fields="description"
+ permission="zope.ManageContent"
+ />
+
+ <addMenuItem
+ class="book.messageboard.messageboard.MessageBoard"
+ title="Message Board"
+ description="A Message Board"
+ permission="zope.ManageContent"
+ view="AddMessageBoard.html"
+ />
+
+ <editform
+ schema="book.messageboard.interfaces.IMessageBoard"
+ for="book.messageboard.interfaces.IMessageBoard"
+ label="Change Message Board"
+ name="edit.html"
+ permission="zope.ManageContent"
+ menu="zmi_views" title="Edit"
+ />
+
+ <containerViews
+ for="book.messageboard.interfaces.IMessageBoard"
+ index="zope.View"
+ contents="zope.View"
+ add="zope.ManageContent"
+ />
+
+ <page
+ name="thread.html"
+ for="book.messageboard.interfaces.IMessageBoard"
+ class=".thread.Thread"
+ template="thread.pt"
+ permission="zope.View"
+ menu="zmi_views" title="Thread"/>
+
+ <defaultView
+ for="book.messageboard.interfaces.IMessageBoard"
+ name="thread.html"/>
+
+ <icon
+ name="zmi_icon"
+ for="book.messageboard.interfaces.IMessageBoard"
+ file="messageboard.png" />
+
+ <addform
+ label="Add Message"
+ name="AddMessage.html"
+ schema="book.messageboard.interfaces.IMessage"
+ content_factory="book.messageboard.message.Message"
+ fields="title body"
+ permission="zope.ManageContent"
+ />
+
+ <addMenuItem
+ class="book.messageboard.message.Message"
+ title="Message"
+ description="A Message"
+ permission="zope.ManageContent"
+ view="AddMessage.html"
+ />
+
+ <editform
+ schema="book.messageboard.interfaces.IMessage"
+ for="book.messageboard.interfaces.IMessage"
+ label="Change Message"
+ fields="title body"
+ name="edit.html"
+ permission="zope.ManageContent"
+ menu="zmi_views" title="Edit"
+ />
+
+ <containerViews
+ for="book.messageboard.interfaces.IMessage"
+ index="zope.View"
+ contents="zope.View"
+ add="zope.ManageContent"
+ />
+
+ <page
+ name="details.html"
+ for="book.messageboard.interfaces.IMessage"
+ class=".message.MessageDetails"
+ template="details.pt"
+ permission="zope.Public"
+ menu="zmi_views" title="Preview"/>
+
+ <defaultView
+ for="book.messageboard.interfaces.IMessage"
+ name="details.html"/>
+
+ <page
+ name="thread.html"
+ for="book.messageboard.interfaces.IMessage"
+ class=".thread.Thread"
+ template="thread.pt"
+ permission="zope.View"
+ menu="zmi_views" title="Thread"/>
+
+ <icon
+ name="zmi_icon"
+ for="book.messageboard.interfaces.IMessage"
+ file="message.png" />
+
+</configure>
Added: messageboard/trunk/step02/browser/details.pt
===================================================================
--- messageboard/trunk/step02/browser/details.pt 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/details.pt 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,38 @@
+<html metal:use-macro="views/standard_macros/view">
+ <body>
+ <div metal:fill-slot="body">
+
+ <h1>Message Details</h1>
+
+ <div class="row">
+ <div class="label">Title</div>
+ <div class="field" tal:content="context/title" />
+ </div>
+
+ <div class="row">
+ <div class="label">Author</div>
+ <div class="field" tal:content="view/author"/>
+ </div>
+
+ <div class="row">
+ <div class="label">Date/Time</div>
+ <div class="field" tal:content="view/modified"/>
+ </div>
+
+ <div class="row">
+ <div class="label">Parent</div>
+ <div class="field" tal:define="info view/parent_info">
+ <a href="../details.html"
+ tal:condition="info"
+ tal:content="info/title" />
+ </div>
+ </div>
+
+ <div class="row">
+ <div class="label">Body</div>
+ <div class="field" tal:content="context/body"/>
+ </div>
+
+ </div>
+ </body>
+</html>
Added: messageboard/trunk/step02/browser/ftests/__init__.py
===================================================================
--- messageboard/trunk/step02/browser/ftests/__init__.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/ftests/__init__.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1 @@
+# Make it a Python package
Added: messageboard/trunk/step02/browser/ftests/test_message.py
===================================================================
--- messageboard/trunk/step02/browser/ftests/test_message.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/ftests/test_message.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,61 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Message Functional Tests
+
+$Id$
+"""
+import unittest
+from zope.app.tests.functional import BrowserTestCase
+
+class MessageTest(BrowserTestCase):
+
+ def testAddMessage(self):
+ response = self.publish(
+ '/+/AddMessageBoard.html=board',
+ basic='mgr:mgrpw',
+ form={'field.description': u'Message Board',
+ 'UPDATE_SUBMIT': 'Add'})
+ self.assertEqual(response.getStatus(), 302)
+ self.assertEqual(response.getHeader('Location'),
+ 'http://localhost/@@contents.html')
+ response = self.publish(
+ '/board/+/AddMessage.html=msg1',
+ basic='mgr:mgrpw',
+ form={'field.title': u'Message 1',
+ 'field.body': u'Body',
+ 'UPDATE_SUBMIT': 'Add'})
+ self.assertEqual(response.getStatus(), 302)
+ self.assertEqual(response.getHeader('Location'),
+ 'http://localhost/board/@@contents.html')
+
+ def testMessageDetails(self):
+ self.testAddMessage()
+ response = self.publish('/board/msg1/@@details.html',
+ basic='mgr:mgrpw')
+ body = response.getBody()
+ self.checkForBrokenLinks(body, '/board/msg1/@@details.html',
+ basic='mgr:mgrpw')
+
+ self.assert_(body.find('Message Details') > 0)
+ self.assert_(body.find('Message 1') > 0)
+ self.assert_(body.find('Body') > 0)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(MessageTest),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Added: messageboard/trunk/step02/browser/message.png
===================================================================
(Binary files differ)
Property changes on: messageboard/trunk/step02/browser/message.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: messageboard/trunk/step02/browser/message.py
===================================================================
--- messageboard/trunk/step02/browser/message.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/message.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,47 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Browser Views for IMessage
+
+$Id: message.py,v 1.3 2003/12/13 17:24:36 srichter Exp $
+"""
+from zope.app import zapi
+from zope.app.dublincore.interfaces import ICMFDublinCore
+
+from book.messageboard.interfaces import IMessage
+
+
+class MessageDetails:
+
+ def author(self):
+ """Get user who last modified the Message."""
+ creators = zapi.getAdapter(self.context, ICMFDublinCore).creators
+ if not creators:
+ return 'unknown'
+ return creators[0]
+
+ def modified(self):
+ """Get last modification date."""
+ date = zapi.getAdapter(self.context, ICMFDublinCore).modified
+ if date is None:
+ date = zapi.getAdapter(self.context, ICMFDublinCore).created
+ if date is None:
+ return ''
+ return date.strftime('%d/%m/%Y %H:%M:%S')
+
+ def parent_info(self):
+ """Get the parent of the message"""
+ parent = zapi.getParent(self.context)
+ if not IMessage.providedBy(parent):
+ return None
+ return {'name': zapi.name(parent), 'title': parent.title}
Added: messageboard/trunk/step02/browser/messageboard.png
===================================================================
(Binary files differ)
Property changes on: messageboard/trunk/step02/browser/messageboard.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: messageboard/trunk/step02/browser/subthread.pt
===================================================================
--- messageboard/trunk/step02/browser/subthread.pt 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/subthread.pt 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,8 @@
+<ul>
+ <li tal:repeat="item view/listContentInfo">
+ <a href=""
+ tal:attributes="href item/url"
+ tal:content="item/title">Message 1</a>
+ <div tal:replace="structure item/thread"/>
+ </li>
+</ul>
\ No newline at end of file
Added: messageboard/trunk/step02/browser/thread.pt
===================================================================
--- messageboard/trunk/step02/browser/thread.pt 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/thread.pt 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,11 @@
+<html metal:use-macro="views/standard_macros/view">
+ <body>
+ <div metal:fill-slot="body">
+
+ <h1>Discussion Thread</h1>
+
+ <div tal:replace="structure view/subthread" />
+
+ </div>
+ </body>
+</html>
Added: messageboard/trunk/step02/browser/thread.py
===================================================================
--- messageboard/trunk/step02/browser/thread.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/browser/thread.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,42 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Browser View for the sub-thread of a Message or MessageBoard
+
+$Id$
+"""
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from book.messageboard.interfaces import IMessage
+
+class Thread:
+
+ def __init__(self, context, request, base_url=''):
+ self.context = context
+ self.request = request
+ self.base_url = base_url
+
+ def listContentInfo(self):
+ children = []
+ for name, child in self.context.items():
+ if IMessage.providedBy(child):
+ info = {}
+ info['title'] = child.title
+ url = self.base_url + name + '/'
+ info['url'] = url + '@@thread.html'
+ thread = Thread(child, self.request, url)
+ info['thread'] = thread.subthread()
+ children.append(info)
+ return children
+
+ subthread = ViewPageTemplateFile('subthread.pt')
+
Added: messageboard/trunk/step02/configure.zcml
===================================================================
--- messageboard/trunk/step02/configure.zcml 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/configure.zcml 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,54 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope">
+
+ <interface
+ interface=".interfaces.IMessageBoard"
+ type="zope.app.content.interfaces.IContentType"
+ />
+
+ <content class=".messageboard.MessageBoard">
+ <implements
+ interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
+ />
+ <implements
+ interface="zope.app.container.interfaces.IContentContainer"
+ />
+ <factory
+ id="book.messageboard.MessageBoard"
+ description="Message Board"
+ />
+ <require
+ permission="zope.ManageContent"
+ interface=".interfaces.IMessageBoard"
+ />
+ <require
+ permission="zope.ManageContent"
+ set_schema=".interfaces.IMessageBoard"
+ />
+ </content>
+
+ <interface
+ interface=".interfaces.IMessage"
+ type="zope.app.content.interfaces.IContentType"
+ />
+
+ <content class=".message.Message">
+ <implements
+ interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
+ />
+ <implements
+ interface="zope.app.container.interfaces.IContentContainer"
+ />
+ <require
+ permission="zope.ManageContent"
+ interface=".interfaces.IMessage"
+ />
+ <require
+ permission="zope.ManageContent"
+ set_schema=".interfaces.IMessage"
+ />
+ </content>
+
+ <include package=".browser" />
+
+</configure>
Added: messageboard/trunk/step02/interfaces.py
===================================================================
--- messageboard/trunk/step02/interfaces.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/interfaces.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,46 @@
+from zope.schema import Text, TextLine, Field
+
+from zope.app.container.constraints import ContainerTypesConstraint
+from zope.app.container.constraints import ItemTypePrecondition
+from zope.app.container.interfaces import IContainer
+
+
+class IMessage(IContainer):
+ """A message object. It can contain its own responses."""
+
+ def __setitem__(name, object):
+ """Add a IMessage object."""
+
+ title = TextLine(
+ title=u"Title/Subject",
+ description=u"Title and/or subject of the message.",
+ default=u"",
+ required=True)
+
+ body = Text(
+ title=u"Message Body",
+ description=u"This is the actual message. Type whatever you wish.",
+ default=u"",
+ required=False)
+
+
+class IMessageBoard(IContainer):
+ """The message board is the base object for our package. It can only
+ contain IMessage objects."""
+
+ def __setitem__(name, object):
+ """Add a IMessage object."""
+
+ __setitem__.precondition = ItemTypePrecondition(IMessage)
+
+ description = Text(
+ title=u"Description",
+ description=u"A detailed description of the content of the board.",
+ default=u"",
+ required=False)
+
+
+IMessage['__setitem__'].setTaggedValue('precondition',
+ ItemTypePrecondition(IMessage))
+IMessage.setTaggedValue('__parent__', Field(
+ constraint=ContainerTypesConstraint(IMessageBoard, IMessage)))
Added: messageboard/trunk/step02/message.py
===================================================================
--- messageboard/trunk/step02/message.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/message.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,54 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Message Implementation
+
+An implementation of the Message using BTreeContainers as base.
+
+$Id: message.py,v 1.1 2003/06/07 11:24:48 srichter Exp $
+"""
+from zope.interface import implements
+from zope.app.container.btree import BTreeContainer
+
+from book.messageboard.interfaces import IMessage
+
+class Message(BTreeContainer):
+ """A simple implementation of a message.
+
+ Make sure that the ``Message`` implements the ``IMessage`` interface:
+
+ >>> from zope.interface.verify import verifyClass
+ >>> verifyClass(IMessage, Message)
+ True
+
+ Here is an example of changing the title and description of the message:
+
+ >>> message = Message()
+ >>> message.title
+ u''
+ >>> message.body
+ u''
+ >>> message.title = u'Message Title'
+ >>> message.body = u'Message Body'
+ >>> message.title
+ u'Message Title'
+ >>> message.body
+ u'Message Body'
+ """
+ implements(IMessage)
+
+ # See book.messageboard.interfaces.IMessage
+ title = u''
+
+ # See book.messageboard.interfaces.IMessage
+ body = u''
Added: messageboard/trunk/step02/messageboard.py
===================================================================
--- messageboard/trunk/step02/messageboard.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/messageboard.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,47 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Message Board Implementation
+
+An implementation of the Message Board using BTreeContainers as base.
+
+$Id$
+"""
+from zope.interface import implements
+from zope.app.container.btree import BTreeContainer
+
+from book.messageboard.interfaces import IMessageBoard
+
+class MessageBoard(BTreeContainer):
+ """A very simple implementation of a message board using B-Tree Containers
+
+ Make sure that the ``MessageBoard`` implements the ``IMessageBoard``
+ interface:
+
+ >>> from zope.interface.verify import verifyClass
+ >>> verifyClass(IMessageBoard, MessageBoard)
+ True
+
+ Here is an example of changing the description of the board:
+
+ >>> board = MessageBoard()
+ >>> board.description
+ u''
+ >>> board.description = u'Message Board Description'
+ >>> board.description
+ u'Message Board Description'
+ """
+ implements(IMessageBoard)
+
+ # See book.messageboard.interfaces.IMessageBoard
+ description = u''
Added: messageboard/trunk/step02/tests/__init__.py
===================================================================
--- messageboard/trunk/step02/tests/__init__.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/tests/__init__.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1 @@
+# Make it a Python package
Added: messageboard/trunk/step02/tests/test_message.py
===================================================================
--- messageboard/trunk/step02/tests/test_message.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/tests/test_message.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,38 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Message Board Tests
+
+$Id: test_message.py,v 1.2 2003/08/20 17:07:46 srichter Exp $
+"""
+import unittest
+from zope.testing.doctestunit import DocTestSuite
+
+from zope.app.container.tests.test_icontainer import TestSampleContainer
+
+from book.messageboard.message import Message
+
+
+class Test(TestSampleContainer):
+
+ def makeTestObject(self):
+ return Message()
+
+def test_suite():
+ return unittest.TestSuite((
+ DocTestSuite('book.messageboard.message'),
+ unittest.makeSuite(Test),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Added: messageboard/trunk/step02/tests/test_messageboard.py
===================================================================
--- messageboard/trunk/step02/tests/test_messageboard.py 2004-05-15 20:59:14 UTC (rev 24727)
+++ messageboard/trunk/step02/tests/test_messageboard.py 2004-05-15 21:36:45 UTC (rev 24728)
@@ -0,0 +1,38 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Message Board Tests
+
+$Id: test_messageboard.py,v 1.2 2003/08/20 17:07:46 srichter Exp $
+"""
+import unittest
+from zope.testing.doctestunit import DocTestSuite
+
+from zope.app.container.tests.test_icontainer import TestSampleContainer
+
+from book.messageboard.messageboard import MessageBoard
+
+
+class Test(TestSampleContainer):
+
+ def makeTestObject(self):
+ return MessageBoard()
+
+def test_suite():
+ return unittest.TestSuite((
+ DocTestSuite('book.messageboard.messageboard'),
+ unittest.makeSuite(Test),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
More information about the Zope-CVS
mailing list