Chandra

 view release on metacpan or  search on metacpan

t/59_form.t  view on Meta::CPAN

{
    my $f = Chandra::Form->new(id => 'f9');
    $f->range('vol', { label => 'Volume', min => 0, max => 100, value => 75 });
    my $html = $f->render;
    like($html, qr/type="range"/, 'range type');
    like($html, qr/min="0"/, 'min');
    like($html, qr/max="100"/, 'max');
    like($html, qr/value="75"/, 'value');
}

# ---- hidden() ----
{
    my $f = Chandra::Form->new(id => 'f10');
    $f->hidden('token', { value => 'abc123' });
    my $html = $f->render;
    like($html, qr/type="hidden"/, 'hidden type');
    like($html, qr/value="abc123"/, 'hidden value');
    unlike($html, qr/<label[^>]*for="f10-token"/, 'no label for hidden');
}

# ---- submit() ----
{
    my $f = Chandra::Form->new(id => 'f11');
    $f->text('name', { label => 'Name' });
    $f->submit('Save');
    my $html = $f->render;
    like($html, qr/<button type="submit"[^>]*>Save<\/button>/, 'submit button');
    like($html, qr/chandra-submit/, 'submit class');
}

# ---- Default submit label ----
{
    my $f = Chandra::Form->new(id => 'f12');
    $f->text('x', {});
    my $html = $f->render;
    like($html, qr/>Submit<\/button>/, 'default submit label');
}

# ---- Chaining ----
{
    my $f = Chandra::Form->new(id => 'chain');
    my $result = $f->text('a', {})->password('b', {})->email('c', {})->submit('Go');
    is($result, $f, 'all methods chain');
    is($f->field_count, 3, '3 fields after chain');
}

# ---- group() ----
{
    my $f = Chandra::Form->new(id => 'grp');
    $f->text('name', { label => 'Name' });
    $f->group('Appearance' => sub {
        $f->select('theme', {
            label => 'Theme',
            options => [{ value => 'dark', label => 'Dark' }],
        });
        $f->number('font', { label => 'Font Size' });
    });
    $f->text('other', { label => 'Other' });
    my $html = $f->render;
    like($html, qr/<fieldset class="chandra-group">/, 'fieldset rendered');
    like($html, qr/<legend>Appearance<\/legend>/, 'legend rendered');
    like($html, qr/<\/fieldset>/, 'fieldset closed');
}

# ---- bind_js() ----
{
    my $f = Chandra::Form->new(id => 'js-test');
    my $js = $f->bind_js;
    like($js, qr/js-test/, 'JS contains form id');
    like($js, qr/addEventListener/, 'JS has event listener');
    like($js, qr/submit/, 'JS handles submit');
    like($js, qr/change/, 'JS handles change');
    like($js, qr/_form_submit/, 'JS invokes _form_submit');
}

# ---- set_values_js() ----
{
    my $f = Chandra::Form->new(id => 'sv-test');
    my $js = $f->set_values_js({ name => 'bob', age => 30 });
    like($js, qr/sv-test/, 'set_values JS has form id');
    like($js, qr/bob/, 'JS contains value');
}

# ---- get_values_js() ----
{
    my $f = Chandra::Form->new(id => 'gv-test');
    my $js = $f->get_values_js;
    like($js, qr/gv-test/, 'get_values JS has form id');
    like($js, qr/_form_values/, 'JS invokes _form_values');
}

# ---- show_errors_js() ----
{
    my $f = Chandra::Form->new(id => 'err-test');
    $f->text('username', {});
    my $js = $f->show_errors_js({ username => 'Required' });
    like($js, qr/err-test-username/, 'error JS has field id');
    like($js, qr/Required/, 'error message in JS');
}

# ---- clear_errors_js() ----
{
    my $f = Chandra::Form->new(id => 'clr-test');
    my $js = $f->clear_errors_js;
    like($js, qr/clr-test/, 'clear JS has form id');
    like($js, qr/chandra-error/, 'targets error spans');
}

# ---- on_change() global ----
{
    my $f = Chandra::Form->new(id => 'oc1');
    my @changes;
    $f->on_change(sub { push @changes, [@_] });
    ok(1, 'global on_change registered');
}

# ---- on_change() field-specific ----
{
    my $f = Chandra::Form->new(id => 'oc2');
    my $theme_val;
    $f->on_change('theme', sub { $theme_val = $_[0] });



( run in 1.471 second using v1.01-cache-2.11-cpan-2398b32b56e )