App-Test-Generator
view release on metacpan or search on metacpan
t/Generator.t view on Meta::CPAN
# ------------------------------------------------------------------
# Import additional private functions under test
# ------------------------------------------------------------------
{
no warnings 'once';
*_validate_input_semantics = \&App::Test::Generator::_validate_input_semantics;
*_validate_transform_properties = \&App::Test::Generator::_validate_transform_properties;
*_validate_module = \&App::Test::Generator::_validate_module;
*_generate_transform_properties = \&App::Test::Generator::_generate_transform_properties;
*_process_custom_properties = \&App::Test::Generator::_process_custom_properties;
}
# ==================================================================
# _validate_input_semantics
# ==================================================================
subtest '_validate_input_semantics() passes for known semantic type' => sub {
lives_ok(
sub {
_validate_input_semantics({
input => {
email => { type => 'string', semantic => 'email' },
}
})
},
'known semantic type lives',
);
};
subtest '_validate_input_semantics() carps for unknown semantic type' => sub {
my @warnings;
local $SIG{__WARN__} = sub { push @warnings, @_ };
_validate_input_semantics({
input => { x => { type => 'string', semantic => 'banana' } }
});
ok((grep { /Unknown semantic type/ } @warnings),
'unknown semantic type carps');
};
subtest '_validate_input_semantics() croaks when both enum and memberof present' => sub {
throws_ok(
sub {
_validate_input_semantics({
input => {
status => {
type => 'string',
enum => ['a', 'b'],
memberof => ['a', 'b'],
},
}
})
},
qr/enum.*memberof|memberof.*enum/,
'both enum and memberof croaks',
);
};
subtest '_validate_input_semantics() croaks when enum is not an arrayref' => sub {
throws_ok(
sub {
_validate_input_semantics({
input => { x => { type => 'string', enum => 'not_array' } }
})
},
qr/enum must be an arrayref/,
'non-arrayref enum croaks',
);
};
subtest '_validate_input_semantics() croaks when memberof is not an arrayref' => sub {
throws_ok(
sub {
_validate_input_semantics({
input => { x => { type => 'string', memberof => 'not_array' } }
})
},
qr/memberof must be an arrayref/,
'non-arrayref memberof croaks',
);
};
subtest '_validate_input_semantics() passes for valid enum arrayref' => sub {
lives_ok(
sub {
_validate_input_semantics({
input => {
status => { type => 'string', enum => ['ok', 'error'] }
}
})
},
'valid enum arrayref lives',
);
};
subtest '_validate_input_semantics() skips non-hashref field specs' => sub {
lives_ok(
sub {
_validate_input_semantics({
input => { x => 'string' }
})
},
'non-hashref field spec skipped without error',
);
};
# ==================================================================
# _validate_transform_properties
# ==================================================================
subtest '_validate_transform_properties() passes for valid builtin property name' => sub {
lives_ok(
sub {
_validate_transform_properties({
transforms => {
positive => {
properties => ['non_negative'],
}
}
})
},
'known builtin property name lives',
);
};
subtest '_validate_transform_properties() carps for unknown builtin name' => sub {
my @warnings;
local $SIG{__WARN__} = sub { push @warnings, @_ };
_validate_transform_properties({
transforms => {
my_transform => {
properties => ['banana_property'],
}
}
});
ok((grep { /unknown built-in property/i } @warnings),
'unknown builtin name carps');
};
subtest '_validate_transform_properties() passes for valid custom property hashref' => sub {
lives_ok(
sub {
_validate_transform_properties({
transforms => {
t => {
properties => [
{ name => 'my_prop', code => '$result > 0' }
]
}
}
})
},
'valid custom property hashref lives',
);
};
subtest '_validate_transform_properties() croaks when custom property missing code' => sub {
throws_ok(
sub {
_validate_transform_properties({
transforms => {
t => {
properties => [
{ name => 'bad_prop' }
]
}
}
})
},
qr/name.*code|code.*name/,
'custom property missing code croaks',
);
};
subtest '_validate_transform_properties() croaks when properties is not an arrayref' => sub {
throws_ok(
sub {
_validate_transform_properties({
transforms => {
t => { properties => 'not_array' }
}
})
},
qr/must be an array/,
'non-arrayref properties croaks',
);
};
subtest '_validate_transform_properties() skips transforms with no properties key' => sub {
lives_ok(
sub {
_validate_transform_properties({
transforms => {
t => { input => { x => { type => 'string' } } }
}
})
},
'transform without properties key lives',
);
};
subtest '_validate_transform_properties() croaks for invalid property definition type' => sub {
throws_ok(
sub {
_validate_transform_properties({
transforms => {
t => { properties => [ [1, 2, 3] ] }
}
})
},
qr/invalid property definition/i,
'invalid property definition type croaks',
);
};
# ==================================================================
# _validate_module
# ==================================================================
subtest '_validate_module() returns 1 for undef module' => sub {
is(_validate_module(undef, 'test.yml'), 1, 'undef module returns 1');
};
subtest '_validate_module() returns 1 for empty string module' => sub {
is(_validate_module('', 'test.yml'), 1, 'empty module returns 1');
};
subtest '_validate_module() returns 1 for core module in @INC' => sub {
# Scalar::Util is always available
is(_validate_module('Scalar::Util', 'test.yml'), 1,
'Scalar::Util found in @INC');
};
subtest '_validate_module() carps and returns 0 for unknown module' => sub {
my @warnings;
local $SIG{__WARN__} = sub { push @warnings, @_ };
my $result = _validate_module('No::Such::Module::XYZ', 'test.yml');
is($result, 0, 'unknown module returns 0');
ok((grep { /not found/i } @warnings), 'carps about module not found');
};
( run in 2.127 seconds using v1.01-cache-2.11-cpan-9581c071862 )