/t/rep_nest.t
text | 248 lines | 202 code | 46 blank | 0 comment | 0 complexity | a954cad855c4c54fb4b6485f5dbe5114 MD5 | raw file
- use strict;
- use warnings;
- use Test::More;
- # This test uses roles to create forms and fields
- # and nests the repeatables
- {
- package Test::Form::Role::Employee;
- use HTML::FormHandler::Moose::Role;
- has_field 'first_name';
- has_field 'last_name';
- has_field 'email';
- has_field 'password';
- }
- {
- package Test::Form::Employee;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler';
- with 'Test::Form::Role::Employee';
- }
- {
- package Test::Form::Field::Employee;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler::Field::Compound';
-
- has_field 'id' => ( type => 'PrimaryKey' );
- with 'Test::Form::Role::Employee';
- }
- {
- package Test::Form::Role::Office;
- use HTML::FormHandler::Moose::Role;
- has_field 'address';
- has_field 'city';
- has_field 'state';
- has_field 'zip';
- has_field 'phone';
- has_field 'fax';
- has_field 'employees' => ( type => 'Repeatable' );
- has_field 'employees.contains' => ( type => '+Test::Form::Field::Employee' );
-
- }
- {
- package Test::Form::Field::Office;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler::Field::Compound';
- has_field 'id' => ( type => 'PrimaryKey' );
- with 'Test::Form::Role::Office';
- }
- {
- package Test::Form::Office;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler';
- with 'Test::Form::Role::Office';
- }
- {
- package Test::Form::Company;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler';
- has '+item_class' => (
- default => 'Company'
- );
- has_field 'name';
- has_field 'username';
- has_field 'tier';
- has_field 'type';
- has_field 'offices' => ( type => 'Repeatable' );
- has_field 'offices.contains' => ( type => '+Test::Form::Field::Office' );
- }
- my $field = Test::Form::Field::Employee->new( name => 'test_employee' );
- ok( $field, 'field created' );
- is( $field->num_fields, 5, 'right number of fields' );
- my $form = Test::Form::Company->new;
- my $params = {
- name => 'my_name',
- username => 'a_user',
- tier => 1,
- type => 'simple',
- offices => [
- {
- id => 1,
- address => '101 Main St',
- city => 'Smallville',
- state => 'CA',
- employees => [
- {
- id => 1,
- first_name => 'John',
- last_name => 'Doe',
- email => 'jdoe@gmail.com',
- }
- ]
- },
- ]
- };
- $form->process( params => $params );
- ok( $form, 'form built' );
- my $fif = $form->fif;
- my $value = $form->value;
- my $expected = {
- 'name' => 'my_name',
- 'offices.0.address' => '101 Main St',
- 'offices.0.city' => 'Smallville',
- 'offices.0.employees.0.email' => 'jdoe@gmail.com',
- 'offices.0.employees.0.first_name' => 'John',
- 'offices.0.employees.0.id' => 1,
- 'offices.0.employees.0.last_name' => 'Doe',
- 'offices.0.employees.0.password' => '',
- 'offices.0.fax' => '',
- 'offices.0.id' => 1,
- 'offices.0.phone' => '',
- 'offices.0.state' => 'CA',
- 'offices.0.zip' => '',
- 'tier' => 1,
- 'type' => 'simple',
- 'username' => 'a_user',
- };
- is_deeply( $fif, $expected, 'fif is correct' );
- is_deeply( $value, $params, 'value is correct' );
- # following takes some pieces of above tests and tests using
- # a Repeatable subclass
- {
- {
- package Test::Form::Field::RepEmployee;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler::Field::Repeatable';
-
- has_field 'id' => ( type => 'PrimaryKey' );
- with 'Test::Form::Role::Employee';
- }
- {
- package Test::Form::Role::RepOffice;
- use HTML::FormHandler::Moose::Role;
- has_field 'address';
- has_field 'city';
- has_field 'state';
- has_field 'zip';
- has_field 'phone';
- has_field 'fax';
- has_field 'employees' => ( type => '+Test::Form::Field::RepEmployee' );
-
- }
- {
- package Test::Form::RepOffice;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler';
- with 'Test::Form::Role::RepOffice';
- }
- my $field = Test::Form::Field::RepEmployee->new( name => 'test_employee' );
- ok( $field, 'field created' );
- is( $field->num_fields, 5, 'right number of fields' );
- my $form = Test::Form::RepOffice->new;
- my $params = {
- address => '101 Main St',
- city => 'Smallville',
- state => 'CA',
- employees => [
- {
- id => 1,
- first_name => 'John',
- last_name => 'Doe',
- email => 'jdoe@gmail.com',
- }
- ]
- };
- $form->process( params => $params );
- ok( $form, 'form built' );
- my $fif = $form->fif;
- my $value = $form->value;
- my $expected = {
- 'address' => '101 Main St',
- 'city' => 'Smallville',
- 'employees.0.email' => 'jdoe@gmail.com',
- 'employees.0.first_name' => 'John',
- 'employees.0.id' => 1,
- 'employees.0.last_name' => 'Doe',
- 'employees.0.password' => '',
- 'fax' => '',
- 'phone' => '',
- 'state' => 'CA',
- 'zip' => '',
- };
- is_deeply( $fif, $expected, 'fif is correct' );
- is_deeply( $value, $params, 'value is correct' );
- }
- {
- package MyForm;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler';
- has_field 'name' => ( type => 'Text' );
- has_field 'args' => ( type => '+MyForm::Args' );
- package MyForm::Args;
- use HTML::FormHandler::Moose;
- use namespace::autoclean;
- extends 'HTML::FormHandler::Field::Compound';
- has_field 'id' => (type => 'Text');
- has_field 'data' => (type => 'Repeatable');
- has_field 'data.type' => (type => 'Text');
- has_field 'data.links' => (type => 'Repeatable');
- has_field 'data.links.title' => (type => 'Text');
- has_field 'data.links.url' => (type => 'Text');
- }
- $form = MyForm->new;
- ok( $form, 'form built' );
- $form->process( params => {} );
- my $rendered = $form->render;
- like( $rendered, qr/"args.data.0.links.0.title"/, 'form has args.data.link.title in Repeatable' );
- done_testing;