PHP Classes
elePHPant
Icontem

File: tests/unit/Del/DynamicFormTest.php

Recommend this page to a friend!
  Classes of Derek McLean  >  HTML Forms  >  tests/unit/Del/DynamicFormTest.php  >  Download  
File: tests/unit/Del/DynamicFormTest.php
Role: Class source
Content type: text/plain
Description: Class source
Class: HTML Forms
Generate and validate submitted HTML forms
Author: By
Last change:
Date: 1 year ago
Size: 7,408 bytes
 

 

Contents

Class file image Download
<?php

namespace DelTesting\Form;

use
Codeception\TestCase\Test;
use
Del\Form\Field\Radio;
use
Del\Form\Field\Submit;
use
Del\Form\Field\Text;
use
Del\Form\Form;
use
Del\Form\Renderer\HorizontalFormRenderer;

class
DynamicFormTest extends Test
{
    public function
testGetDynamicFormFieldThrowsException()
    {
       
$text = new Text('fail');
       
$this->expectException('Exception');
       
$text->getDynamicForms();
    }


    public function
testDynamicFormBeforePopulation()
    {
       
$form = $this->getForm();
       
$html = $form->render();
       
$this->assertContains('<form class="form-horizontal" name="dynamic" method="post" id="dynamic"><div class="form-group"><label for="" class="col-sm-2 control-label"><span class="text-danger">* </span>Name</label><div class="col-sm-10"><input name="name" type="text" class="form-control" placeholder="Type your name.."></div></div><div class="form-group"><label for="" class="col-sm-2 control-label"><span class="text-danger">* </span>Email Address</label><div class="col-sm-10"><input name="email" type="email" class="form-control" placeholder="Enter an email address.."></div></div><div class="form-group"><label for="" class="col-sm-2 control-label"><span class="text-danger">* </span>Please choose..</label><div class="col-sm-10"><div class="radio"><label for="" class="radio-inline"><input type="radio" name="choice" value="1">Food</label><label for="" class="radio-inline"><input type="radio" name="choice" value="2">Drink</label></div></div></div><div data-dynamic-form="choice" data-dynamic-form-trigger-value="1" class="dynamic-form-block triggerchoice" id="choice1" style="display: none;"><div class="form-group"><label for="" class="col-sm-2 control-label"><span class="text-danger">* </span>Choose your food.</label><div class="col-sm-10"><div class="radio"><div class="radio"><label for=""><input type="radio" name="foodchoice" value="1">Cheeseburger</label></div><div class="radio"><label for=""><input type="radio" name="foodchoice" value="2">Pizza</label></div><div class="radio"><label for=""><input type="radio" name="foodchoice" value="3">Steak</label></div></div></div></div></div><div data-dynamic-form="choice" data-dynamic-form-trigger-value="2" class="dynamic-form-block triggerchoice" id="choice2" style="display: none;"><div class="form-group"><label for="" class="col-sm-2 control-label"><span class="text-danger">* </span>Choose your drink.</label><div class="col-sm-10"><div class="radio"><div class="radio"><label for=""><input type="radio" name="drinkchoice" value="1">Beer</label></div><div class="radio"><label for=""><input type="radio" name="drinkchoice" value="2">Vodka</label></div><div class="radio"><label for=""><input type="radio" name="drinkchoice" value="3">Whisky</label></div></div></div></div><div class="form-group"><label for="" class="col-sm-2 control-label">whatever</label><div class="col-sm-10"><input name="moretext" type="text" class="form-control" placeholder="Another text field to fill in"></div></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><input name="submit" value="submit" type="submit" class="btn btn-primary"></div></div></form>', $html);
       
$this->assertContains("<script type=\"text/javascript\">
                $(document).ready(function(){
                    $('.dynamic-form-block').each(function(){
                        var Id = $(this).prop('id');
                        var parentField = $(this).attr('data-dynamic-form');
                        var parentValue = $(this).attr('data-dynamic-form-trigger-value');
           
                        $('input[name=\"'+parentField+'\"]').change(function(){
                            var val = $(this).val();
                            if (val == parentValue) {
                                $('.trigger'+parentField).each(function(){
                                    $(this).attr('style', 'display: none;');
                                });
                                $('#'+Id).attr('style', 'display: block;');
                            }
                        });
                    });
                });
            </script>"
, $html);
    }


    public function
testFormValidatesWithDynamicForms()
    {
       
$form = $this->getForm();
       
$data = [
           
'name' => 'Derek',
           
'email' => 'delboy1978uk@gmail.com',
           
'choice' => '1',
        ];
       
$form->populate($data);
       
$this->assertFalse($form->isValid());
       
$data['foodchoice'] = '1';
       
$form->populate($data);
       
$this->assertTrue($form->isValid());

    }


    public function
testGetValues()
    {
       
$form = $this->getForm();
       
$data = [
           
'name' => 'Derek',
           
'email' => 'delboy1978uk@gmail.com',
           
'choice' => '1',
           
'foodchoice' => '1',
        ];
       
$form->populate($data);
       
$data = $form->getValues();
       
$this->assertArrayHasKey('name', $data);
       
$this->assertArrayHasKey('email', $data);
       
$this->assertArrayHasKey('choice', $data);
       
$this->assertArrayHasKey('foodchoice', $data);
       
$this->assertArrayHasKey('submit', $data);
       
$this->assertEquals('Derek', $data['name']);
       
$this->assertEquals('delboy1978uk@gmail.com', $data['email']);
       
$this->assertEquals('1', $data['choice']);
       
$this->assertEquals('1', $data['foodchoice']);

    }


   
/**
     * @return Form
     */
   
private function getForm()
    {
       
$form = new Form('dynamic');
       
$form->setFormRenderer(new HorizontalFormRenderer());

       
$text = new Text('name');
       
$text->setLabel('Name');
       
$text->setPlaceholder('Type your name..');
       
$text->setRequired(true);

       
$email = new Text\EmailAddress('email');
       
$email->setLabel('Email Address');
       
$email->setRequired(true);
       
$email->setCustomErrorMessage('Please enter a valid email address.');

       
$radio = new Radio('choice');
       
$radio->setLabel('Please choose..');
       
$radio->setRenderInline(true);
       
$radio->setRequired(true);
       
$radio->setOptions([
           
1 => 'Food',
           
2 => 'Drink',
        ]);

       
$foodForm = new Form('food');
       
$foodRadio = new Radio('foodchoice');
       
$foodRadio->setLabel('Choose your food.');
       
$foodRadio->setRequired(true);
       
$foodRadio->setOptions([
           
1 => 'Cheeseburger',
           
2 => 'Pizza',
           
3 => 'Steak',
        ]);
       
$foodForm->addField($foodRadio);
       
$radio->addDynamicForm($foodForm, 1);

       
$drinkForm = new Form('drink');
       
$drinkRadio = new Radio('drinkchoice');
       
$drinkRadio->setRequired(true);
       
$drinkRadio->setLabel('Choose your drink.');
       
$drinkRadio->setOptions([
           
1 => 'Beer',
           
2 => 'Vodka',
           
3 => 'Whisky',
        ]);
       
$moreText = new Text('moretext');
       
$moreText->setLabel('whatever');
       
$moreText->setPlaceholder('Another text field to fill in');
       
$drinkForm->addField($drinkRadio);
       
$drinkForm->addField($moreText);
       
$radio->addDynamicForm($drinkForm, 2);

       
$submit = new Submit('submit');

       
$form->addField($text);
       
$form->addField($email);
       
$form->addField($radio);
       
$form->addField($submit);

        return
$form;
    }
}