===============================================
Test of the Zeam Form widget with one reference
===============================================

You can create a schema with a reference field:

  >>> from Products.Silva.testing import TestRequest
  >>> from Products.Silva.Content import Content
  >>> from OFS.SimpleItem import SimpleItem

  >>> from silva.core.interfaces import IContent
  >>> from silva.core.references.reference import Reference
  >>> from zope.interface import Interface, implements
  >>> from zope.interface.verify import verifyObject

  >>> class IReferer(Interface):
  ...     content = Reference(IContent, title=u'Referer', required=False)

  >>> class Referer(Content, SimpleItem):
  ...     implements(IReferer)
  ...     referer = None

  >>> root = get_root()
  >>> _ = root._setObject('referer', Referer('referer'))
  >>> content = root._getOb('referer')
  >>> request = TestRequest()


Field
-----

You can have a zeam.form field for the reference, by asking all the
fields for the given interface:

  >>> from zeam.form.base.interfaces import IField, IWidget
  >>> from zeam.form.silva import Fields

  >>> fields = Fields(IReferer)
  >>> len(fields)
  1
  >>> reference_field = fields['content']
  >>> reference_field
  <ReferenceField Referer>
  >>> reference_field.identifier
  'content'
  >>> reference_field.title
  u'Referer'
  >>> reference_field.schemaName
  'silva.core.interfaces.content.IContent'

  >>> verifyObject(IField, reference_field)
  True

You can clone the field:

  >>> cloned_field = reference_field.clone('renamed')
  >>> cloned_field
  <ReferenceField Referer>
  >>> cloned_field.identifier
  'renamed'
  >>> cloned_field.title
  u'Referer'
  >>> cloned_field is reference_field
  False


Widget
------

You have an associated widget:

  >>> from zeam.form.base import Widgets, FormData, DISPLAY

  >>> form = FormData(content, request)
  >>> form.ignoreContent = False

  >>> widgets = Widgets(fields, form=form, request=request)
  >>> widgets.update()

  >>> reference_widget = widgets['form.field.content']
  >>> reference_widget
  <ReferenceWidgetInput Referer>

  >>> verifyObject(IWidget, reference_widget)
  True
