def form():
    '''
    Loads the form template or the success template. If post request data is
    validated if successful the success template is rendered if not the
    request data is returned to the form template. If get request the form
    template is rendered.
    '''
    if request.method == 'POST':

        validator = Validator(request.form.get('firstname', ''),
                              request.form.get('lastname', ''),
                              request.form.get('email', ''),
                              request.form.get('dob', ''),
                              request.form.get('tac', ''))

        result = validator.validate()

        if result['result'] is False:
            data = {'form': request.form, 'messages': result['messages']}
            return render_template('form.html', data=data)

        data = {'form': request.form}
        return render_template('success.html', data=data)

    data = {'form': '', 'messages': ''}
    return render_template('form.html', data=data)
    def test_validate(self):

        validator = Validator(
            'firstname',
            'lastname',
            '*****@*****.**',
            '18/11/2018',
            'on'
        )

        result = validator.validate()

        self.assertTrue(result['result'])
        self.assertEqual(len(result['messages']), 0)
    def test_validate_invalid_tscs(self):

        validator = Validator(
            'firstname',
            'lastname',
            '*****@*****.**',
            '18/11/2018',
            ''
        )

        result = validator.validate()

        self.assertFalse(result['result'])
        self.assertEqual(result['messages'][0], 'Please agree to our terms and conditions and privacy policy.')
        self.assertEqual(len(result['messages']), 1)
    def test_validate_invalid_dob(self):

        validator = Validator(
            'firstname',
            'lastname',
            '*****@*****.**',
            '2018/11/18',
            'on'
        )

        result = validator.validate()

        self.assertFalse(result['result'])
        self.assertEqual(result['messages'][0], 'Please fill in a valid date of birth, format day/month/year, after 1900 and before or equal to today.')
        self.assertEqual(len(result['messages']), 1)
    def test_validate_invalid_email(self):

        validator = Validator(
            'firstname',
            'lastname',
            'robtest.com',
            '18/11/2018',
            'on'
        )

        result = validator.validate()

        self.assertFalse(result['result'])
        self.assertEqual(result['messages'][0], 'Please fill in a valid email.')
        self.assertEqual(len(result['messages']), 1)
    def test_validate_invalid_lastname(self):

        validator = Validator(
            'firstname',
            'lastname!',
            '*****@*****.**',
            '18/11/2018',
            'on'
        )

        result = validator.validate()

        self.assertFalse(result['result'])
        self.assertEqual(result['messages'][0], 'Please fill in a valid last name only alpha numeric characters, spaces and dashes allowed.')
        self.assertEqual(len(result['messages']), 1)
    def test_validate_invalid_multiple(self):

        validator = Validator(
            'firstname',
            'lastname!',
            'robest.com',
            '18/11/2018',
            ''
        )

        result = validator.validate()

        self.assertFalse(result['result'])
        self.assertEqual(result['messages'][0], 'Please fill in a valid last name only alpha numeric characters, spaces and dashes allowed.')
        self.assertEqual(result['messages'][1], 'Please fill in a valid email.')
        self.assertEqual(result['messages'][2], 'Please agree to our terms and conditions and privacy policy.')
        self.assertEqual(len(result['messages']), 3)
    def test_validator(self):

        validator = Validator(
            'firstname',
            'lastname',
            'email',
            'dob',
            'on'
        )

        self.assertIsInstance(validator, Validator)