Skip to content

Commit

Permalink
Functional tests for simple buttons and collection form added
Browse files Browse the repository at this point in the history
  • Loading branch information
boekkooi committed Sep 23, 2014
1 parent f0dc71c commit b62458a
Show file tree
Hide file tree
Showing 6 changed files with 266 additions and 4 deletions.
98 changes: 97 additions & 1 deletion tests/Functional/SimpleFormTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,106 @@ public function it_should_render_valid_data_form_javascript()
);
}

protected function fetch_application_page_javascript($url)
/**
* @test
*/
public function it_should_render_valid_javascript_for_a_form_with_buttons()
{
$javascript = $this->fetch_application_page_javascript('/buttons');
$this->assertEqualJs(
'(function ($) {
var form = $("form[name=\"buttons\"]");
var groups = {"main": false, "Default": false};
form.find("*[name=\"buttons\x5BdefaultValidation\x5D\"]").click(function () {
groups = {"main": false, "Default": true};
});
form.find("*[name=\"buttons\x5BmainValidation\x5D\"]").click(function () {
groups = {"main": true, "Default": false};
});
form.find("*[name=\"buttons\x5BnoValidation\x5D\"]").addClass("cancel");
form.validate({
rules: {
"buttons\x5Btitle\x5D": {
"required": {
depends: function () {
return groups["main"] || groups["Default"];
}
}, "minlength": {
param: 8, depends: function () {
return groups["main"];
}
}, "maxlength": {
param: 200, depends: function () {
return groups["main"];
}
}
}, "buttons\x5Bcontent\x5D": {
"required": {
depends: function () {
return groups["Default"];
}
}
}
},
messages: {
"buttons\x5Btitle\x5D": {
"required": "This\x20value\x20should\x20not\x20be\x20blank.",
"minlength": "This\x20value\x20is\x20too\x20short.\x20It\x20should\x20have\x208\x20characters\x20or\x20more.",
"maxlength": "This\x20value\x20is\x20too\x20long.\x20It\x20should\x20have\x20200\x20characters\x20or\x20less."
}, "buttons\x5Bcontent\x5D": {"required": "This\x20value\x20should\x20not\x20be\x20blank."}
}
});
})(jQuery);',
$javascript
);
}

/**
* @test
*/
public function it_should_render_collection_row_javascript()
{
$client = self::createClient();

$javascript = $this->fetch_application_page_javascript('/collection', $client);

$this->assertEqualJs(
'(function ($) {
var form = $("form[name=\"collection\"]");
form.validate({rules: {"collection\x5Btitle\x5D": {"required": true, "minlength": 8, "maxlength": 200}},
messages: {
"collection\x5Btitle\x5D": {
"required": "This\x20value\x20should\x20not\x20be\x20blank.",
"minlength": "This\x20value\x20is\x20too\x20short.\x20It\x20should\x20have\x208\x20characters\x20or\x20more.",
"maxlength": "This\x20value\x20is\x20too\x20long.\x20It\x20should\x20have\x20200\x20characters\x20or\x20less."
}
}
});
})(jQuery);',
$javascript
);

$elt = $client->getCrawler()->filterXPath('//div/@data-prototype-js');
$javascriptPrototype = $elt->html();

$this->assertEqualJs(
'(function ($) {
var form = $("form[name=\"collection\"]");
form.find("*[name=\"collection\x5Btags\x5D\x5Btag__name__\x5D\"]").rules("add", {
"required": true,
"messages": {"required": "This\x20value\x20should\x20not\x20be\x20blank."}
});
})(jQuery);',
$javascriptPrototype
);
}

protected function fetch_application_page_javascript($url, $client = null)
{
$client = $client ?: self::createClient();

$crawler = $client->request('GET', $url);
$this->assertEquals(200, $client->getResponse()->getStatusCode());

Expand Down
44 changes: 42 additions & 2 deletions tests/Functional/TestBundle/Controller/FormController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
namespace Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Form\Type\ButtonsFormType;
use Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Form\Type\CollectionFormType;
use Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Form\Type\SimpleDataFormType;
use Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Form\Type\SimpleFormType;

Expand All @@ -10,17 +14,53 @@
*/
class FormController extends Controller
{
public function simpleAction()
public function simpleAction(Request $request)
{
$form = $this->createForm(new SimpleFormType());
$this->handleForm($request, $form);

return $this->render('::form.html.twig', array('form' => $form->createView()));
}

public function simpleDataAction()
public function simpleDataAction(Request $request)
{
$form = $this->createForm(new SimpleDataFormType());
$this->handleForm($request, $form);

return $this->render('::form.html.twig', array('form' => $form->createView()));
}

public function buttonsAction(Request $request)
{
$form = $this->createForm(new ButtonsFormType());
$this->handleForm($request, $form);

return $this->render('::form.html.twig', array('form' => $form->createView(), 'button' => true));
}

public function collectionAction(Request $request)
{
$form = $this->createForm(new CollectionFormType());
$this->handleForm($request, $form);

return $this->render('::form.html.twig', array('form' => $form->createView()));
}

private function handleForm(Request $request, FormInterface $form)
{
$form->handleRequest($request);
if ($form->isValid()) {
$this->addNotice('Valid');
} elseif ($request->isMethod('POST')) {
$this->addNotice('Invalid');
}
}

private function addNotice($message)
{
$this->get('session')->getFlashBag()->add(
'notice',
$message
);
}
}
50 changes: 50 additions & 0 deletions tests/Functional/TestBundle/Form/Type/ButtonsFormType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php
namespace Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

/**
* @author Warnar Boekkooi <warnar@boekkooi.net>
*/
class ButtonsFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', null, array(
'constraints' => array(
new Constraints\NotBlank(array('groups' => array('main', 'Default'))),
new Constraints\Length(array(
'min' => 8,
'max' => 200,
'groups' => 'main'
))
)
))
->add('content', 'textarea', array(
'constraints' => array(
new Constraints\NotBlank(),
new Constraints\Length(array(
'min' => 8,
'max' => 200,
'groups' => 'never_used'
))
)
))
->add('defaultValidation', 'submit')
->add('mainValidation', 'submit', array(
'validation_groups' => 'main',
))
->add('noValidation', 'submit', array(
'validation_groups' => false,
))
;
}

public function getName()
{
return 'buttons';
}
}
53 changes: 53 additions & 0 deletions tests/Functional/TestBundle/Form/Type/CollectionFormType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php
namespace Tests\Boekkooi\Bundle\JqueryValidationBundle\Functional\TestBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints;

/**
* @author Warnar Boekkooi <warnar@boekkooi.net>
*/
class CollectionFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', null, array(
'constraints' => array(
new Constraints\NotBlank(),
new Constraints\Length(array(
'min' => 8,
'max' => 200,
))
)
))
->add('tags', 'collection', array(
'type' => 'text',
'constraints' => array(
new Constraints\Count(array(
'min' => 1,
'max' => 5
))
),

'allow_add' => true,
'allow_delete' => true,

'prototype' => true,
'prototype_name' => 'tag__name__',
'options' => array(
'constraints' => array(
new Constraints\NotBlank()
)
)
))
;
}

public function getName()
{
return 'collection';
}
}
16 changes: 15 additions & 1 deletion tests/Functional/app/Resources/views/form.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,29 @@
<ul>
<li><a href="{{ path('form_simple') }}">Simple Form</a></li>
<li><a href="{{ path('form_simple_data') }}">Simple Data Form</a></li>
<li><a href="{{ path('form_buttons') }}">Buttons Form</a></li>
<li><a href="{{ path('form_collection') }}">Collection Form</a></li>
</ul>

{% form_theme form _self %}

{{ form_start(form) }}
{{ form_widget(form) }}
<input type="submit">

{% if button is not defined or not button %}
<input type="submit">
{% endif %}
{{ form_end(form) }}

<script id="validation_script">
{{ form_jquery_validation(form) }}
</script>
</body>
</html>

{% block collection_widget -%}
{% if prototype is defined %}
{%- set attr = attr|merge({'data-prototype-js': form_jquery_validation(form)}) -%}
{% endif %}
{{- block('form_widget') -}}
{%- endblock collection_widget %}
9 changes: 9 additions & 0 deletions tests/Functional/app/config/routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,12 @@ form_simple_data:
defaults:
_controller: TestBundle:Form:simpleData

form_buttons:
path: '/buttons'
defaults:
_controller: TestBundle:Form:buttons

form_collection:
path: '/collection'
defaults:
_controller: TestBundle:Form:collection

0 comments on commit b62458a

Please sign in to comment.