Brannigan

 view release on metacpan or  search on metacpan

t/05-defaults.t  view on Meta::CPAN

    $b->process('dynamic_defaults', $params1);
    $b->process('dynamic_defaults', $params2);
    
    isnt($params1->{id}, $params2->{id}, 'Different random IDs generated');
    is($params1->{author}, $params2->{author}, 'Static defaults are same');
}

# Complex defaults (arrays and hashes)
$b->register_schema('complex_defaults', {
    params => {
        tags => {
            array => 1,
            default => ['untagged']
        },
        metadata => {
            hash => 1,
            default => { version => 1, type => 'default' }
        },
        options => {
            default => sub { { auto_save => 1, debug => 0 } }
        }
    }
});

{
    my $params = {};
    my $rejects = $b->process('complex_defaults', $params);
    is($rejects, undef, 'Processing with complex defaults succeeds');
    is($params->{tags}, ['untagged'], 'Array default applied');
    is($params->{metadata}, { version => 1, type => 'default' }, 'Hash default applied');
    is($params->{options}, { auto_save => 1, debug => 0 }, 'Dynamic hash default applied');
}

# Defaults should be validated
$b->register_schema('validated_defaults', {
    params => {
        status => {
            default => 'pending',
            one_of => ['pending', 'active', 'inactive']
        },
        count => {
            default => 10,
            integer => 1,
            min_value => 1
        }
    }
});

{
    my $params = {};
    my $rejects = $b->process('validated_defaults', $params);
    is($rejects, undef, 'Valid defaults pass validation');
    is($params->{status}, 'pending', 'Valid default applied');
    is($params->{count}, 10, 'Valid numeric default applied');
}

# Test that defaults don't apply to required parameters that fail
$b->register_schema('required_no_default', {
    params => {
        name => { required => 1 },
        backup_name => { default => 'unnamed' }
    }
});

{
    my $params = {}; # Missing required name
    my $rejects = $b->process('required_no_default', $params);
    is($rejects, { name => { required => 1 } }, 'Required parameter failure');
    is($params->{backup_name}, 'unnamed', 'Default still applied to non-required params');
}

# Edge case: empty string and zero values should not trigger defaults
$b->register_schema('edge_cases', {
    params => {
        description => { default => 'No description' },
        count => { default => 1, integer => 1 },
        flag => { default => 'true' }
    }
});

{
    my $params = { description => '', count => 0, flag => 'false' };
    my $rejects = $b->process('edge_cases', $params);
    is($rejects, undef, 'Edge case processing succeeds');
    is($params->{description}, '', 'Empty string preserved (not replaced with default)');
    is($params->{count}, 0, 'Zero value preserved (not replaced with default)');
    is($params->{flag}, 'false', 'False value preserved (not replaced with default)');
}

# =============================================================================
# ARRAY ITEM DEFAULTS TESTS
# =============================================================================

# Test array item defaults specifically
$b->register_schema('array_defaults_test', {
    params => {
        items => {
            array => 1,
            values => {
                hash => 1,
                keys => {
                    name => { required => 1 },
                    active => { default => 1 },
                    priority => { default => 3 },
                    created_at => { default => sub { 'test_time' } }
                }
            }
        }
    }
});

# Test with missing defaults
{
    my $params = {
        items => [
            { name => 'First' },
            { name => 'Second', active => 0 },
            { name => 'Third', priority => 5 }
        ]
    };
    
    my $rejects = $b->process('array_defaults_test', $params);
    is($rejects, undef, 'Array defaults validation succeeds');
    
    # Check defaults were applied
    is($params->{items}->[0]->{active}, 1, 'First item active default applied');
    is($params->{items}->[0]->{priority}, 3, 'First item priority default applied');
    is($params->{items}->[0]->{created_at}, 'test_time', 'First item function default applied');
    



( run in 1.115 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )