[Zope3-checkins] CVS: Zope3/lib/python/Zope/App/Forms/Browser/tests - test_add.py:1.1.2.1

Jim Fulton jim@zope.com
Thu, 12 Dec 2002 13:33:55 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/Forms/Browser/tests
In directory cvs.zope.org:/tmp/cvs-serv17714/lib/python/Zope/App/Forms/Browser/tests

Added Files:
      Tag: AdapterAndView-branch
	test_add.py 
Log Message:
Added a generic schema-driven add view.

We have unit tests, but we still need to test it in practice.



=== Added File Zope3/lib/python/Zope/App/Forms/Browser/tests/test_add.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 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.
#
##############################################################################
"""

$Id: test_add.py,v 1.1.2.1 2002/12/12 18:33:54 jim Exp $
"""

from unittest import TestCase, TestSuite, main, makeSuite
from Zope.App.Forms.Browser.add import add, AddViewFactory, AddView
from Interface import Interface
from Zope.Schema import TextLine
from Zope.App.OFS.Container.IAdding import IAdding
from Zope.App.Forms.Widget import CustomWidget
from Zope.App.Forms.Views.Browser.Widget import TextWidget as Text
from Zope.Publisher.Browser.BrowserRequest import TestRequest
from Zope.App.tests.PlacelessSetup import PlacelessSetup
from Zope.ComponentArchitecture import getView

class Context:

    def resolve(self, name):
        return globals()[name]

class I(Interface):
    
    name = TextLine()
    first = TextLine()
    last = TextLine()
    email = TextLine()
    address = TextLine()
    foo = TextLine()
    extra1 = TextLine()
    extra2 = TextLine()

class C:

    def __init__(self, *args, **kw):
        self.args = args
        self.kw = kw

class V:
    name = CustomWidget(Text)
    first = CustomWidget(Text)
    last = CustomWidget(Text)
    email = CustomWidget(Text)
    address = CustomWidget(Text)
    foo = CustomWidget(Text)
    extra1 = CustomWidget(Text)
    extra2 = CustomWidget(Text)

    
class SampleData:

    name = "foo"
    first = "bar"
    last = "baz"
    email = "baz@dot.com"
    address = "aa"
    foo = "foo"
    extra1 = "extra1"
    extra2 = "extra2"

class Test(PlacelessSetup, TestCase):

    def test_add_no_fields(self):

        result1 = add(
            Context(),
            schema="I",
            name="addthis",
            permission="Zope.Public",
            label="Add this",
            content_factory="C",
            arguments="first last",
            keyword_arguments="email",
            set_before_add="foo",
            set_after_add="extra1",
            )

        result2 = add(
            Context(),
            schema="I",
            name="addthis",
            permission="Zope.Public",
            label="Add this",
            content_factory="C",
            arguments="first last",
            keyword_arguments="email",
            set_before_add="foo",
            set_after_add="extra1",
            fields="name first last email address foo extra1 extra2",
            )

        self.assertEqual(result1, result2)

    def test_add(self):

        [(descriminator, callable, args, kw)] = add(
            Context(),
            schema="I",
            name="addthis",
            permission="Zope.Public",
            label="Add this",
            content_factory="C",
            class_="V",
            arguments="first last",
            keyword_arguments="email",
            set_before_add="foo",
            set_after_add="extra1",
            )


        self.assertEqual(descriminator,
                         ('http://namespaces.zope.org/form/add',
                          "addthis", "default"))
        self.assertEqual(callable, AddViewFactory)

        (name, schema, label, permission, layer, template,
         default_template, bases, for_, fields, content_factory,
         arguments, keyword_arguments, set_before_add,
         set_after_add)  = args

        self.assertEqual(name, 'addthis')
        self.assertEqual(schema, I)
        self.assertEqual(label, 'Add this')
        self.assertEqual(permission, 'Zope.Public')
        self.assertEqual(layer, 'default')
        self.assertEqual(template, 'add.pt')
        self.assertEqual(default_template, 'add.pt')
        self.assertEqual(bases, (V, AddView, ))
        self.assertEqual(for_, IAdding)
        self.assertEqual(" ".join(fields),
                         "name first last email address foo extra1 extra2")
        self.assertEqual(content_factory, C)
        self.assertEqual(" ".join(arguments), 
                         "first last")
        self.assertEqual(" ".join(keyword_arguments), 
                         "email")
        self.assertEqual(" ".join(set_before_add), 
                         "foo")
        self.assertEqual(" ".join(set_after_add), 
                         "extra1 name address extra2")
        self.failIf(kw)

        return args

    def test_apply_update(self):

        class Adding:

            __implements__ = IAdding

            def __init__(self, test):
                self.test = test
            
            def add(self, ob):
                self.ob = ob
                self.test.assertEqual(
                    ob.__dict__,
                    {'args': ("bar", "baz"),
                     'kw': {'email': 'baz@dot.com'},
                     'foo': 'foo',
                    })
                return ob
            def nextURL(self):
                return "."
            
        adding = Adding(self)
        args = self.test_add()
        factory = AddViewFactory(*args)
        request = TestRequest()
        request.form.update(SampleData.__dict__)
        view = getView(adding, 'addthis', request)
        view.apply_update(SampleData.__dict__)

        self.assertEqual(adding.ob.extra1, "extra1")
        self.assertEqual(adding.ob.extra2, "extra2")
        self.assertEqual(adding.ob.name, "foo")
        self.assertEqual(adding.ob.address, "aa")

def test_suite():
    return TestSuite((
        makeSuite(Test),
        ))

if __name__=='__main__':
    main(defaultTest='test_suite')