def test_validator_equalto_error_multiple(setup):
    """ Test EqualTo validator
    Multiple sets - Error situation.
    Note that only modile_2 and handy_2 are incorrect.
    """
    post = deepcopy(setup)
    post.add(u'mobile_1', '123456')
    post.add(u'handy_1', '123456')
    post.add(u'mobile_2', '456789')
    post.add(u'handy_2', '987654')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('mobile','Mobile', TextField)
    dynamic_form.add_validator('mobile', EqualTo, '%handy%', message='Please fill in the exact same data as %handy%.')
    dynamic_form.add_field('handy','Handy', TextField)
    dynamic_form.add_validator('handy', EqualTo, '%mobile%', message='Please fill in the exact same data as %mobile%.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == False
    assert form.errors['mobile_2'] == ['Please fill in the exact same data as handy_2.']
    assert form.errors['handy_2'] == ['Please fill in the exact same data as mobile_2.']
    assert form.mobile_1() == '<input id="mobile_1" name="mobile_1" type="text" value="123456">'
    assert form.handy_1() == '<input id="handy_1" name="handy_1" type="text" value="123456">'
    assert form.mobile_2() == '<input id="mobile_2" name="mobile_2" type="text" value="456789">'
    assert form.handy_2() == '<input id="handy_2" name="handy_2" type="text" value="987654">'
def test_sets_of_multiple_single_fields(setup):
    """ Test correct re-injection of multiple sets by WTForms
    Sets - No error situation.
    Fields email_x and telephone_x are valid and should be
    present in the form after validation.
    """
    post = deepcopy(setup)
    post.add(u'email_1', '*****@*****.**')
    post.add(u'email_2', '*****@*****.**')
    post.add(u'email_3', '*****@*****.**')
    post.add(u'telephone_1', '14564678')
    post.add(u'telephone_2', '64578952')
    post.add(u'telephone_3', '31794561')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email','Email', TextField)
    dynamic_form.add_field('telephone','Telephone', TextField)
    dynamic_form.add_validator('email', InputRequired)
    dynamic_form.add_validator('telephone', InputRequired)
    form = dynamic_form.process(SimpleForm,
                                post)

    assert form.validate() == True
    assert form.email_1.data == '*****@*****.**'
    assert form.email_2.data == '*****@*****.**'
    assert form.email_3.data == '*****@*****.**'
    assert form.email_1() == '<input id="email_1" name="email_1" type="text" value="*****@*****.**">'
    assert form.email_2() == '<input id="email_2" name="email_2" type="text" value="*****@*****.**">'
    assert form.email_3() == '<input id="email_3" name="email_3" type="text" value="*****@*****.**">'
    assert form.telephone_1.data == '14564678'
    assert form.telephone_2.data == '64578952'
    assert form.telephone_3.data == '31794561'
    assert form.telephone_1() == '<input id="telephone_1" name="telephone_1" type="text" value="14564678">'
    assert form.telephone_2() == '<input id="telephone_2" name="telephone_2" type="text" value="64578952">'
    assert form.telephone_3() == '<input id="telephone_3" name="telephone_3" type="text" value="31794561">'
def test_add_single_field_without_validation(setup):
    """ Test correct re-injection of single field by WTForms
    No sets - No error situation.
    Fields email has no validator and this is invalid.
    It should be present after validation.
    """
    post = deepcopy(setup)
    post.add(u'email', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email', 'Email', TextField)
    form = dynamic_form.process(SimpleForm, post)

    assert form.email(
    ) == '<input id="email" name="email" type="text" value="">'
    assert form.email.label.text == 'Email'
def test_add_single_field_without_validation(setup):
    """ Test correct re-injection of single field by WTForms
    No sets - No error situation.
    Fields email has no validator and this is invalid.
    It should be present after validation.
    """
    post = deepcopy(setup)
    post.add(u'email', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email','Email', TextField)
    form = dynamic_form.process(SimpleForm,
                                post)

    assert form.email() == '<input id="email" name="email" type="text" value="">'
    assert form.email.label.text == 'Email'
def test_sets_of_single_fields(setup):
    """ Test correct re-injection of multiple fields by WTForms
    Sets - No error situation.
    Fields email_x are valid and should be present in
    the form after validation.
    """
    post = deepcopy(setup)
    post.add(u'email_1', '*****@*****.**')
    post.add(u'email_2', '*****@*****.**')
    post.add(u'email_3', '*****@*****.**')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email', 'Email', TextField)
    dynamic_form.add_validator('email', InputRequired)
    form = dynamic_form.process(SimpleForm, post)

    assert form.validate() == True
    assert form.email_1.data == '*****@*****.**'
    assert form.email_2.data == '*****@*****.**'
    assert form.email_3.data == '*****@*****.**'
    assert form.email_1(
    ) == '<input id="email_1" name="email_1" type="text" value="*****@*****.**">'
    assert form.email_2(
    ) == '<input id="email_2" name="email_2" type="text" value="*****@*****.**">'
    assert form.email_3(
    ) == '<input id="email_3" name="email_3" type="text" value="*****@*****.**">'
def test_validator_length_error(setup):
    """ Test Length validator
    No set - Error situation.
    Field middle_name is too short.
    """
    post = deepcopy(setup)
    post.add(u'middle_name', 'foo')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('middle_name', 'Middle Name', TextField)
    dynamic_form.add_validator(
        'middle_name',
        Length,
        min=4,
        max=10,
        message='Please enter length between 4 and 10 characters.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == False
    assert form.errors['middle_name'] == [
        'Please enter length between 4 and 10 characters.'
    ]
    assert form.middle_name(
    ) == '<input id="middle_name" name="middle_name" type="text" value="foo">'
def test_validator_length_error_multiple(setup):
    """ Test Length validator
    Multiple sets - Error situation.
    Note that only middle_name_1 is correct.
    """
    post = deepcopy(setup)
    post.add(u'middle_name_1', 'foobar')
    post.add(u'middle_name_2', 'foo')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('middle_name', 'Middle Name', TextField)
    dynamic_form.add_validator(
        'middle_name',
        Length,
        min=4,
        max=10,
        message='Please enter length between 4 and 10 characters.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == False
    assert form.errors['middle_name_2'] == [
        'Please enter length between 4 and 10 characters.'
    ]
    assert form.middle_name_1(
    ) == '<input id="middle_name_1" name="middle_name_1" type="text" value="foobar">'
    assert form.middle_name_2(
    ) == '<input id="middle_name_2" name="middle_name_2" type="text" value="foo">'
def test_validator_numberrange_error_multiple(setup):
    """ Test NumberRange validator
    Sets - Error situation.
    Note, only age_3 is within range.
    """
    post = deepcopy(setup)
    post.add(u'age_1', '4')
    post.add(u'age_2', '12')
    post.add(u'age_3', '30')
    post.add(u'age_4', '42')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('age', 'Age', IntegerField)
    dynamic_form.add_validator(
        'age',
        NumberRange,
        min=30,
        max=40,
        message='Please enter an age between %(min)s to %(max)s.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == False
    assert form.errors['age_1'] == ['Please enter an age between 30 to 40.']
    assert form.errors['age_2'] == ['Please enter an age between 30 to 40.']
    assert form.errors['age_4'] == ['Please enter an age between 30 to 40.']
    assert form.age_1(
    ) == '<input id="age_1" name="age_1" type="text" value="4">'
    assert form.age_2(
    ) == '<input id="age_2" name="age_2" type="text" value="12">'
    assert form.age_3(
    ) == '<input id="age_3" name="age_3" type="text" value="30">'
    assert form.age_4(
    ) == '<input id="age_4" name="age_4" type="text" value="42">'
def test_validator_anyof_error_multiple(setup):
    """ Test AnyOf validator
    Sets - Error situation.
    Note, only hobby_3 has a valid hobby.
    """
    post = deepcopy(setup)
    post.add(u'hobby_1', 'sleeping')
    post.add(u'hobby_2', 'eating')
    post.add(u'hobby_3', 'swimming')
    post.add(u'hobby_4', 'gaming')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('hobby', 'Hobby', TextField)
    dynamic_form.add_validator('hobby',
                               AnyOf, ['cylcing', 'swimming', 'hacking'],
                               message='Please enter only allowed hobbies.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == False
    assert form.errors['hobby_1'] == ['Please enter only allowed hobbies.']
    assert form.errors['hobby_2'] == ['Please enter only allowed hobbies.']
    assert form.errors['hobby_4'] == ['Please enter only allowed hobbies.']
    assert form.hobby_1(
    ) == '<input id="hobby_1" name="hobby_1" type="text" value="sleeping">'
    assert form.hobby_2(
    ) == '<input id="hobby_2" name="hobby_2" type="text" value="eating">'
    assert form.hobby_3(
    ) == '<input id="hobby_3" name="hobby_3" type="text" value="swimming">'
    assert form.hobby_4(
    ) == '<input id="hobby_4" name="hobby_4" type="text" value="gaming">'
def test_dependend_automatic_label_suffix(setup):
    """ Test %% replacement with many fields
    Sets - Error situation.
    Fields email_x and telephone_x should not be blank.
    Merely inducing an error to assert for correct field name replacement.
    """
    post = deepcopy(setup)
    post.add(u'email_1', '')
    post.add(u'telephone_1', '')
    post.add(u'pager_1', '')
    post.add(u'email_2', '')
    post.add(u'telephone_2', '')
    post.add(u'pager_2', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email', 'Email', TextField)
    dynamic_form.add_validator(
        'email',
        InputRequired,
        message='Please fill in %telephone% or %pager%.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()

    assert form.errors['email_1'] == ['Please fill in telephone_1 or pager_1.']
    assert form.errors['email_2'] == ['Please fill in telephone_2 or pager_2.']
    assert form.email_1(
    ) == '<input id="email_1" name="email_1" type="text" value="">'
    assert form.email_2(
    ) == '<input id="email_2" name="email_2" type="text" value="">'
def test_validator_equalto_correct(setup):
    """ Test EqualTo validator
    No set - No error situation.
    Fields Mobile and Handy are equal.
    """
    post = deepcopy(setup)
    post.add(u'mobile', '123456')
    post.add(u'handy', '123456')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('mobile','Mobile', TextField)
    dynamic_form.add_validator('mobile', EqualTo, 'handy', message='Please fill in the exact same data as handy.')
    dynamic_form.add_field('handy','Handy', TextField)
    dynamic_form.add_validator('handy', EqualTo, 'mobile', message='Please fill in the exact same data as mobile.')
    form = dynamic_form.process(SimpleForm,
                                post)

    form.validate()
    assert form.validate() == True
    assert form.mobile() == '<input id="mobile" name="mobile" type="text" value="123456">'
    assert form.handy() == '<input id="handy" name="handy" type="text" value="123456">'
def test_validator_anyof_error_multiple(setup):
    """ Test AnyOf validator
    Sets - Error situation.
    Note, only hobby_3 has a valid hobby.
    """
    post = deepcopy(setup)
    post.add(u'hobby_1', 'sleeping')
    post.add(u'hobby_2', 'eating')
    post.add(u'hobby_3', 'swimming')
    post.add(u'hobby_4', 'gaming')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('hobby','Hobby', TextField)
    dynamic_form.add_validator('hobby', AnyOf, ['cylcing','swimming','hacking'], message='Please enter only allowed hobbies.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == False
    assert form.errors['hobby_1'] == ['Please enter only allowed hobbies.']
    assert form.errors['hobby_2'] == ['Please enter only allowed hobbies.']
    assert form.errors['hobby_4'] == ['Please enter only allowed hobbies.']
    assert form.hobby_1() == '<input id="hobby_1" name="hobby_1" type="text" value="sleeping">'
    assert form.hobby_2() == '<input id="hobby_2" name="hobby_2" type="text" value="eating">'
    assert form.hobby_3() == '<input id="hobby_3" name="hobby_3" type="text" value="swimming">'
    assert form.hobby_4() == '<input id="hobby_4" name="hobby_4" type="text" value="gaming">'
def test_validator_numberrange_error_multiple(setup):
    """ Test NumberRange validator
    Sets - Error situation.
    Note, only age_3 is within range.
    """
    post = deepcopy(setup)
    post.add(u'age_1', '4')
    post.add(u'age_2', '12')
    post.add(u'age_3', '30')
    post.add(u'age_4', '42')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('age','Age', IntegerField)
    dynamic_form.add_validator('age', NumberRange, min=30, max=40, message='Please enter an age between %(min)s to %(max)s.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == False
    assert form.errors['age_1'] == ['Please enter an age between 30 to 40.']
    assert form.errors['age_2'] == ['Please enter an age between 30 to 40.']
    assert form.errors['age_4'] == ['Please enter an age between 30 to 40.']
    assert form.age_1() == '<input id="age_1" name="age_1" type="text" value="4">'
    assert form.age_2() == '<input id="age_2" name="age_2" type="text" value="12">'
    assert form.age_3() == '<input id="age_3" name="age_3" type="text" value="30">'
    assert form.age_4() == '<input id="age_4" name="age_4" type="text" value="42">'
def test_dependend_automatic_label_suffix(setup):
    """ Test %% replacement with many fields
    Sets - Error situation.
    Fields email_x and telephone_x should not be blank.
    Merely inducing an error to assert for correct field name replacement.
    """
    post = deepcopy(setup)
    post.add(u'email_1', '')
    post.add(u'telephone_1', '')
    post.add(u'pager_1', '')
    post.add(u'email_2', '')
    post.add(u'telephone_2', '')
    post.add(u'pager_2', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email','Email', TextField)
    dynamic_form.add_validator('email', InputRequired, message='Please fill in %telephone% or %pager%.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()

    assert form.errors['email_1'] == ['Please fill in telephone_1 or pager_1.']
    assert form.errors['email_2'] == ['Please fill in telephone_2 or pager_2.']
    assert form.email_1() == '<input id="email_1" name="email_1" type="text" value="">'
    assert form.email_2() == '<input id="email_2" name="email_2" type="text" value="">'
def test_long_field_name_replacement(setup):

    """ Test %% replacement with many fields
    Sets - Error situation.
    See if fields with many underscores and digits still
    get picked up correctly by the %field_name% formatter.
    Merely inducing an error to assert for correct field name replacement.
    """
    post = deepcopy(setup)
    post.add(u'a_very_long_10_field_name_1', '')
    post.add(u'yet_another_34_long_2_name_10_1', '')
    post.add(u'a_very_long_10_field_name_2', '')
    post.add(u'yet_another_34_long_2_name_10_2', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('a_very_long_10_field_name',
                           'A very long field name', TextField)
    dynamic_form.add_validator('a_very_long_10_field_name',
                               InputRequired,
                               message='Please fill in %a_very_long_10_field_name% or %yet_another_34_long_2_name_10%.')
    dynamic_form.add_field('yet_another_34_long_2_name_10',
                           'A very long field name', TextField)
    dynamic_form.add_validator('yet_another_34_long_2_name_10',
                               InputRequired,
                               message='Please fill in %a_very_long_10_field_name% or %yet_another_34_long_2_name_10%.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()

    assert form.validate() == False
    print form.errors
    assert form.errors['a_very_long_10_field_name_1'] == ['Please fill in a_very_long_10_field_name_1 or yet_another_34_long_2_name_10_1.']
    assert form.errors['yet_another_34_long_2_name_10_1'] == ['Please fill in a_very_long_10_field_name_1 or yet_another_34_long_2_name_10_1.']
    assert form.errors['a_very_long_10_field_name_2'] == ['Please fill in a_very_long_10_field_name_2 or yet_another_34_long_2_name_10_2.']
    assert form.errors['yet_another_34_long_2_name_10_2'] == ['Please fill in a_very_long_10_field_name_2 or yet_another_34_long_2_name_10_2.']
    assert form.a_very_long_10_field_name_1() == '<input id="a_very_long_10_field_name_1" name="a_very_long_10_field_name_1" type="text" value="">'
    assert form.yet_another_34_long_2_name_10_1() == '<input id="yet_another_34_long_2_name_10_1" name="yet_another_34_long_2_name_10_1" type="text" value="">'
    assert form.a_very_long_10_field_name_2() == '<input id="a_very_long_10_field_name_2" name="a_very_long_10_field_name_2" type="text" value="">'
    assert form.yet_another_34_long_2_name_10_2() == '<input id="yet_another_34_long_2_name_10_2" name="yet_another_34_long_2_name_10_2" type="text" value="">'
def test_add_single_field_with_validation_error(setup):
    """ Test correct re-injection of single field by WTForms
    No sets - Error situation.
    Fields email is invalid thus should trigger an error
    after validation and be present in the form.
    """
    post = deepcopy(setup)
    post.add(u'email', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email', 'Email', TextField)
    dynamic_form.add_validator('email', InputRequired)
    form = dynamic_form.process(SimpleForm, post)

    assert form.validate() == False
    assert form.errors['email'] == ['This field is required.']
def test_add_single_field_with_validation_success(setup):
    """ Test correct re-injection of single field by WTForms
    No sets - No error situation.
    Fields email is valid and should be present in the form
    after validation.
    """
    post = deepcopy(setup)
    post.add(u'email', 'foo')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email', 'Email', TextField)
    dynamic_form.add_validator('email', InputRequired)
    form = dynamic_form.process(SimpleForm, post)

    assert form.validate() == True
    assert form.email(
    ) == '<input id="email" name="email" type="text" value="foo">'
def test_validator_anyof_success(setup):
    """ Test NumberRange validator
    No set - No error situation.
    Field hobby has a valid selection.
    """
    post = deepcopy(setup)
    post.add(u'hobby', 'swimming')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('hobby', 'Hobby', TextField)
    dynamic_form.add_validator('hobby',
                               AnyOf, ['cylcing', 'swimming', 'hacking'],
                               message='Please enter only allowed hobbies.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == True
    assert form.hobby(
    ) == '<input id="hobby" name="hobby" type="text" value="swimming">'
def test_add_single_field_with_validation_error(setup):
    """ Test correct re-injection of single field by WTForms
    No sets - Error situation.
    Fields email is invalid thus should trigger an error
    after validation and be present in the form.
    """
    post = deepcopy(setup)
    post.add(u'email', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email','Email', TextField)
    dynamic_form.add_validator('email', InputRequired)
    form = dynamic_form.process(SimpleForm,
                                post)
    
    assert form.validate() == False
    assert form.errors['email'] == ['This field is required.']
def test_add_single_field_with_validation_success(setup):
    """ Test correct re-injection of single field by WTForms
    No sets - No error situation.
    Fields email is valid and should be present in the form
    after validation.
    """
    post = deepcopy(setup)
    post.add(u'email', 'foo')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('email','Email', TextField)
    dynamic_form.add_validator('email', InputRequired)
    form = dynamic_form.process(SimpleForm,
                                post)
    
    assert form.validate() == True
    assert form.email() == '<input id="email" name="email" type="text" value="foo">'
def test_validator_length_correct(setup):
    """ Test Length validator
    No set - No error situation.
    Field middle_name is of correct length.
    """
    post = deepcopy(setup)
    post.add(u'middle_name', 'foobar')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('middle_name','Middle Name', TextField)
    dynamic_form.add_validator('middle_name', Length, min=4, max=10, message='Please enter length between 4 and 10 characters.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == True
    assert form.middle_name() == '<input id="middle_name" name="middle_name" type="text" value="foobar">'
def test_validator_numberrange_success(setup):
    """ Test NumberRange validator
    No set - No error situation.
    Field age is within range.
    """
    post = deepcopy(setup)
    post.add(u'age', '32')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('age','Age', IntegerField)
    dynamic_form.add_validator('age', NumberRange, min=30, max=40, message='Please enter an age between %(min)s to %(max)s.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == True
    assert form.age() == '<input id="age" name="age" type="text" value="32">'
def test_validator_anyof_success(setup):
    """ Test NumberRange validator
    No set - No error situation.
    Field hobby has a valid selection.
    """
    post = deepcopy(setup)
    post.add(u'hobby', 'swimming')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('hobby','Hobby', TextField)
    dynamic_form.add_validator('hobby', AnyOf, ['cylcing','swimming','hacking'], message='Please enter only allowed hobbies.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == True
    assert form.hobby() == '<input id="hobby" name="hobby" type="text" value="swimming">'
def test_validator_numberrange_success(setup):
    """ Test NumberRange validator
    No set - No error situation.
    Field age is within range.
    """
    post = deepcopy(setup)
    post.add(u'age', '32')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('age', 'Age', IntegerField)
    dynamic_form.add_validator(
        'age',
        NumberRange,
        min=30,
        max=40,
        message='Please enter an age between %(min)s to %(max)s.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == True
    assert form.age() == '<input id="age" name="age" type="text" value="32">'
def test_validator_numberrange_error(setup):
    """ Test NumberRange validator
    No set - Error situation.
    Field age is outside the range.
    """
    post = deepcopy(setup)
    post.add(u'age', '20')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('age','Age', IntegerField)
    dynamic_form.add_validator('age', NumberRange, min=30, max=40, message='Please enter an age between %(min)s to %(max)s.')
    form = dynamic_form.process(SimpleForm,
                                post)
    
    form.validate()
    assert form.validate() == False
    assert form.errors['age'] == ['Please enter an age between 30 to 40.']
    assert form.age() == '<input id="age" name="age" type="text" value="20">'
def test_validator_numberrange_error(setup):
    """ Test NumberRange validator
    No set - Error situation.
    Field age is outside the range.
    """
    post = deepcopy(setup)
    post.add(u'age', '20')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('age', 'Age', IntegerField)
    dynamic_form.add_validator(
        'age',
        NumberRange,
        min=30,
        max=40,
        message='Please enter an age between %(min)s to %(max)s.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == False
    assert form.errors['age'] == ['Please enter an age between 30 to 40.']
    assert form.age() == '<input id="age" name="age" type="text" value="20">'
def test_validator_length_error_multiple(setup):
    """ Test Length validator
    Multiple sets - Error situation.
    Note that only middle_name_1 is correct.
    """
    post = deepcopy(setup)
    post.add(u'middle_name_1', 'foobar')
    post.add(u'middle_name_2', 'foo')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('middle_name','Middle Name', TextField)
    dynamic_form.add_validator('middle_name', Length, min=4, max=10, message='Please enter length between 4 and 10 characters.')
    form = dynamic_form.process(SimpleForm,
                                post)
   
    form.validate()
    assert form.validate() == False
    assert form.errors['middle_name_2'] == ['Please enter length between 4 and 10 characters.']
    assert form.middle_name_1() == '<input id="middle_name_1" name="middle_name_1" type="text" value="foobar">'
    assert form.middle_name_2() == '<input id="middle_name_2" name="middle_name_2" type="text" value="foo">'
def test_validator_equalto_error_multiple(setup):
    """ Test EqualTo validator
    Multiple sets - Error situation.
    Note that only modile_2 and handy_2 are incorrect.
    """
    post = deepcopy(setup)
    post.add(u'mobile_1', '123456')
    post.add(u'handy_1', '123456')
    post.add(u'mobile_2', '456789')
    post.add(u'handy_2', '987654')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('mobile', 'Mobile', TextField)
    dynamic_form.add_validator(
        'mobile',
        EqualTo,
        '%handy%',
        message='Please fill in the exact same data as %handy%.')
    dynamic_form.add_field('handy', 'Handy', TextField)
    dynamic_form.add_validator(
        'handy',
        EqualTo,
        '%mobile%',
        message='Please fill in the exact same data as %mobile%.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == False
    assert form.errors['mobile_2'] == [
        'Please fill in the exact same data as handy_2.'
    ]
    assert form.errors['handy_2'] == [
        'Please fill in the exact same data as mobile_2.'
    ]
    assert form.mobile_1(
    ) == '<input id="mobile_1" name="mobile_1" type="text" value="123456">'
    assert form.handy_1(
    ) == '<input id="handy_1" name="handy_1" type="text" value="123456">'
    assert form.mobile_2(
    ) == '<input id="mobile_2" name="mobile_2" type="text" value="456789">'
    assert form.handy_2(
    ) == '<input id="handy_2" name="handy_2" type="text" value="987654">'
def test_validator_equalto_correct(setup):
    """ Test EqualTo validator
    No set - No error situation.
    Fields Mobile and Handy are equal.
    """
    post = deepcopy(setup)
    post.add(u'mobile', '123456')
    post.add(u'handy', '123456')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('mobile', 'Mobile', TextField)
    dynamic_form.add_validator(
        'mobile',
        EqualTo,
        'handy',
        message='Please fill in the exact same data as handy.')
    dynamic_form.add_field('handy', 'Handy', TextField)
    dynamic_form.add_validator(
        'handy',
        EqualTo,
        'mobile',
        message='Please fill in the exact same data as mobile.')
    form = dynamic_form.process(SimpleForm, post)

    form.validate()
    assert form.validate() == True
    assert form.mobile(
    ) == '<input id="mobile" name="mobile" type="text" value="123456">'
    assert form.handy(
    ) == '<input id="handy" name="handy" type="text" value="123456">'
def test_long_field_name_replacement(setup):
    """ Test %% replacement with many fields
    Sets - Error situation.
    See if fields with many underscores and digits still
    get picked up correctly by the %field_name% formatter.
    Merely inducing an error to assert for correct field name replacement.
    """
    post = deepcopy(setup)
    post.add(u'a_very_long_10_field_name_1', '')
    post.add(u'yet_another_34_long_2_name_10_1', '')
    post.add(u'a_very_long_10_field_name_2', '')
    post.add(u'yet_another_34_long_2_name_10_2', '')

    dynamic_form = WTFormsDynamicFields()
    dynamic_form.add_field('a_very_long_10_field_name',
                           'A very long field name', TextField)
    dynamic_form.add_validator(
        'a_very_long_10_field_name',
        InputRequired,
        message=
        'Please fill in %a_very_long_10_field_name% or %yet_another_34_long_2_name_10%.'
    )
    dynamic_form.add_field('yet_another_34_long_2_name_10',
                           'A very long field name', TextField)
    dynamic_form.add_validator(
        'yet_another_34_long_2_name_10',
        InputRequired,
        message=
        'Please fill in %a_very_long_10_field_name% or %yet_another_34_long_2_name_10%.'
    )
    form = dynamic_form.process(SimpleForm, post)

    form.validate()

    assert form.validate() == False
    print form.errors
    assert form.errors['a_very_long_10_field_name_1'] == [
        'Please fill in a_very_long_10_field_name_1 or yet_another_34_long_2_name_10_1.'
    ]
    assert form.errors['yet_another_34_long_2_name_10_1'] == [
        'Please fill in a_very_long_10_field_name_1 or yet_another_34_long_2_name_10_1.'
    ]
    assert form.errors['a_very_long_10_field_name_2'] == [
        'Please fill in a_very_long_10_field_name_2 or yet_another_34_long_2_name_10_2.'
    ]
    assert form.errors['yet_another_34_long_2_name_10_2'] == [
        'Please fill in a_very_long_10_field_name_2 or yet_another_34_long_2_name_10_2.'
    ]
    assert form.a_very_long_10_field_name_1(
    ) == '<input id="a_very_long_10_field_name_1" name="a_very_long_10_field_name_1" type="text" value="">'
    assert form.yet_another_34_long_2_name_10_1(
    ) == '<input id="yet_another_34_long_2_name_10_1" name="yet_another_34_long_2_name_10_1" type="text" value="">'
    assert form.a_very_long_10_field_name_2(
    ) == '<input id="a_very_long_10_field_name_2" name="a_very_long_10_field_name_2" type="text" value="">'
    assert form.yet_another_34_long_2_name_10_2(
    ) == '<input id="yet_another_34_long_2_name_10_2" name="yet_another_34_long_2_name_10_2" type="text" value="">'