Example #1
0
def test_fuzzy(web_fixture, fuzzy_text_input_fixture):
    """A TextInput can be created as fuzzy=True. Doing this results in the possibly imprecise
       input that was typed by the user to be interpreted server-side and changed to the
       more exact representation in the client browser.  This happens upon the input losing focus."""
    fixture = fuzzy_text_input_fixture

    model_object = fixture.model_object

    class MyForm(Form):
        def __init__(self, view, name):
            super().__init__(view, name)
            self.add_child(
                TextInput(self, model_object.fields.an_attribute, fuzzy=True))
            self.define_event_handler(model_object.events.an_event)
            self.add_child(ButtonInput(self, model_object.events.an_event))

    wsgi_app = web_fixture.new_wsgi_app(child_factory=MyForm.factory('myform'),
                                        enable_js=True)
    web_fixture.reahl_server.set_app(wsgi_app)
    browser = web_fixture.driver_browser
    browser.open('/')

    browser.type(XPath.input_named('myform-an_attribute'), '20 November 2012')
    browser.press_tab()
    browser.wait_for(browser.is_element_value,
                     XPath.input_named('myform-an_attribute'), '20 Nov 2012')
Example #2
0
def test_nested_forms(web_fixture):
    """HTML disallows nesting of forms. A NestedForm can be used to simulate
       a form which is visually part of another Form. A NestedForm provides a
       form attribute which should be used when creating an Inputs for it.
    """

    fixture = web_fixture

    class NestedModelObject(object):
        handled_event = False

        def handle_event(self):
            self.handled_event = True

        @exposed
        def events(self, events):
            events.nested_event = Event(label='click nested',
                                        action=Action(self.handle_event))

        @exposed
        def fields(self, fields):
            fields.nested_field = Field(label='input nested')

    nested_model_object = NestedModelObject()

    class MyNestedForm(NestedForm):
        def __init__(self, view, name):
            super(MyNestedForm, self).__init__(view, name)
            self.define_event_handler(nested_model_object.events.nested_event)
            self.add_child(
                ButtonInput(self.form,
                            nested_model_object.events.nested_event))
            self.add_child(
                TextInput(self.form, nested_model_object.fields.nested_field))

    class OuterModelObject(object):
        handled_event = False

        def handle_event(self):
            self.handled_event = True

        @exposed
        def events(self, events):
            events.outer_event = Event(label='click outer',
                                       action=Action(self.handle_event))

    outer_model_object = OuterModelObject()

    class OuterForm(Form):
        def __init__(self, view, name):
            super(OuterForm, self).__init__(view, name)
            self.add_child(MyNestedForm(view, 'my_nested_form'))
            self.define_event_handler(outer_model_object.events.outer_event)
            self.add_child(
                ButtonInput(self, outer_model_object.events.outer_event))

    wsgi_app = fixture.new_wsgi_app(
        child_factory=OuterForm.factory('outer_form'))
    fixture.reahl_server.set_app(wsgi_app)
    browser = fixture.driver_browser

    browser.open('/')
    browser.type(XPath.input_named('my_nested_form-nested_field'),
                 'some nested input')

    browser.click(XPath.button_labelled('click nested'))

    assert nested_model_object.handled_event
    assert not outer_model_object.handled_event

    assert nested_model_object.nested_field == 'some nested input'