1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More;
7use Test::Moose;
8
9BEGIN { plan skip_all => 'Form::Sensible is broken at the moment' }
10
11use Test::Requires { 'Form::Sensible' => '0.11220' };
12
13use Bread::Board;
14
15{
16    package My::Model;
17    use Moose;
18
19    sub get_all_access_levels {
20        return (
21            { id => 'standard', name => 'Standard User' },
22            { id => 'admin',    name => 'Administrator' },
23            { id => 'super',    name => 'Super User'    },
24        )
25    }
26}
27
28my $FormBuilder = container 'FormBuilder' => [ 'Fields' ] => as {
29    service 'Form' => (
30        class => 'Form::Sensible',
31        block => sub {
32            my $s      = shift;
33            my $c      = $s->parent;
34            my $fields = $c->get_sub_container('Fields');
35            my $form   = Form::Sensible::Form->new( name => $s->param('name') );
36            foreach my $name ( $fields->get_service_list ) {
37                $form->add_field(
38                    $fields->get_service( $name )->get
39                );
40            }
41
42            if ( my $state = $s->param('state') ) {
43                $form->set_values( $state );
44            }
45
46            $form;
47        },
48        parameters => {
49            name  => { isa => 'Str'                    },
50            state => { isa => 'HashRef', optional => 1 },
51        }
52    );
53};
54
55my $Fields = container 'Fields' => [ 'Model' ] => as {
56
57    service 'Username' => (
58        class => 'Form::Sensible::Field::Text',
59        block => sub {
60            Form::Sensible::Field::Text->new(
61                name       => 'username',
62                validation => { regex => qr/^[0-9a-z]*$/ }
63            );
64        }
65    );
66
67    service 'Password' => (
68        class => 'Form::Sensible::Field::Text',
69        block => sub {
70            Form::Sensible::Field::Text->new(
71                name         => 'password',
72                render_hints => {
73                    'HTML' => {
74                        field_type => 'password'
75                    }
76                }
77            );
78        }
79    );
80
81    service 'Submit' => (
82        class => 'Form::Sensible::Field::Trigger',
83        block => sub {
84            Form::Sensible::Field::Trigger->new(
85                name => 'submit'
86            );
87        }
88    );
89
90    service 'AccessLevel' => (
91        class => 'Form::Sensible::Field::Select',
92        block => sub {
93            my $s = shift;
94            my $select = Form::Sensible::Field::Select->new(
95                 name => 'access_level',
96            );
97            foreach my $access_level ( $s->param('schema')->get_all_access_levels ) {
98                $select->add_option(
99                    $access_level->{id},
100                    $access_level->{name}
101                );
102            }
103            $select;
104        },
105        dependencies => {
106            schema => depends_on('Model/schema') ,
107        },
108    );
109
110};
111
112# this would actually wrap the
113# $c->model('DBIC') or something
114# in order to get the DBIC schema
115# object
116my $Model = container 'Model' => as { service 'schema' => My::Model->new };
117
118# perhaps create this in a early part
119# of a catalyst dispatch chain
120my $Form = $FormBuilder->create(
121    Fields => $Fields->create(
122        Model => $Model
123    )
124);
125
126# then in the actual action code
127# you would create the form instance
128# and pass the state (which is
129# basically $c->req->parameters)
130my $f = $Form->resolve(
131    service    => 'Form',
132    parameters => {
133        name  => 'test',
134        state => {
135            username     => 'stevan',
136            password     => '****',
137            access_level => [ 'admin' ]
138        }
139    }
140);
141isa_ok($f, 'Form::Sensible::Form');
142
143my $result = $f->validate;
144
145ok( $result->is_valid, '... our form validated' );
146
147
148done_testing;
149