BarefootJS

 view release on metacpan or  search on metacpan

t/manifest_components.t  view on Meta::CPAN

    is $backend->calls->[-1]{vars}{open}, 0,
        'omitted prop falls back to the component default';

    # Caller-supplied prop wins.
    $bf->render_child('toast', open => 1);
    is $backend->calls->[-1]{vars}{open}, 1, 'caller prop overrides the default';
};

subtest 'signal_init override applies per component key' => sub {
    my ($bf, $backend) = new_bf();
    $bf->register_components_from_manifest(
        { 'ui/toast/index' => $TOAST_ENTRY },
        signal_init => { toast => sub { (open => 'forced') } },
    );

    $bf->render_child('toast');
    is $backend->calls->[-1]{vars}{open}, 'forced',
        'signal_init keyed by the snake_case component name wins over ssrDefaults';

    $bf->render_child('toast_title');
    is $backend->calls->[-1]{template}, 'ui/toast/ToastTitle',
        'sibling components without an override still render';
};

subtest 'manifests without a components map keep the dir-name registration' => sub {
    # Older builds emit no `components` map; the single-component
    # convention (dir name == snake_cased component name) must keep working.
    my ($bf, $backend) = new_bf();
    $bf->register_components_from_manifest({
        'ui/button/index' => {
            markedTemplate => 'templates/ui/button/index.html.ep',
            ssrDefaults    => { variant => { propName => 'variant', value => 'default' } },
        },
    });

    my $html = $bf->render_child('button');
    is $html, '<rendered:ui/button/index>', 'dir-name key still renders';
    is $backend->calls->[-1]{vars}{variant}, 'default', 'entry ssrDefaults still seed';
};

subtest 'a components row without a markedTemplate is skipped, siblings survive' => sub {
    my ($bf, $backend) = new_bf();
    my $entry = {
        %$TOAST_ENTRY,
        components => {
            %{ $TOAST_ENTRY->{components} },
            Broken => {},    # no markedTemplate
        },
    };
    $bf->register_components_from_manifest({ 'ui/toast/index' => $entry });

    like dies { $bf->render_child('broken') }, qr/No renderer registered/,
        'template-less row registers nothing';
    is $bf->render_child('toast_title'), '<rendered:ui/toast/ToastTitle>',
        'sibling components still registered';
};

subtest '_snake_case mirrors the Mojo adapter toTemplateName' => sub {
    is BarefootJS::_snake_case('Toast'),         'toast',          'single word';
    is BarefootJS::_snake_case('ToastProvider'), 'toast_provider', 'two words';
    is BarefootJS::_snake_case('DropdownMenu'),  'dropdown_menu',  'kebab-dir module component';
    is BarefootJS::_snake_case('InputOTP'),      'input_o_t_p',    'acronym splits per capital';
};

done_testing;



( run in 2.271 seconds using v1.01-cache-2.11-cpan-0b5f733616e )