Convert-Pheno
view release on metacpan or search on metacpan
t/25-json-bridge.t view on Meta::CPAN
use strict;
use warnings;
use FindBin qw($Bin);
use File::Spec::Functions qw(catfile);
use IPC::Open3;
use JSON::XS;
use Symbol qw(gensym);
use Test::More;
my $script = catfile( $Bin, '..', 'api', 'perl', 'json_bridge.pl' );
my $json = JSON::XS->new->canonical;
sub run_bridge {
my ($payload) = @_;
my $stderr = gensym;
my $pid = open3( my $in, my $out, $stderr, $^X, $script );
print {$in} $payload if defined $payload;
close $in;
local $/;
my $stdout = <$out>;
my $err = <$stderr>;
waitpid( $pid, 0 );
return ( $? >> 8, $stdout // q{}, $err // q{} );
}
my ( $exit_ok, $stdout_ok, $stderr_ok ) = run_bridge(
$json->encode(
{
method => 'pxf2bff',
data => {
phenopacket => {
id => 'P0007500',
subject => {
id => 'P0007500',
dateOfBirth => 'unknown-01-01T00:00:00Z',
sex => 'FEMALE'
}
}
}
}
)
);
is( $exit_ok, 0, 'bridge exits successfully for valid payload' );
is( $stderr_ok, q{}, 'bridge keeps stderr empty on success' );
my $decoded = eval { $json->decode($stdout_ok) };
ok( !$@, 'bridge returns valid JSON on success' );
is( $decoded->{id}, 'P0007500', 'bridge returns converted BFF payload' );
my ( $exit_missing_method, undef, $stderr_missing_method ) =
run_bridge( $json->encode( { data => {} } ) );
isnt( $exit_missing_method, 0, 'bridge fails when method is missing' );
like(
$stderr_missing_method,
qr/Payload must include string field 'method'/,
'bridge reports missing method clearly'
);
my ( $exit_invalid_method, undef, $stderr_invalid_method ) =
run_bridge( $json->encode( { method => 'not_a_method', data => {} } ) );
isnt( $exit_invalid_method, 0, 'bridge fails for invalid method name' );
like( $stderr_invalid_method, qr/not_a_method/, 'invalid method is reported' );
my ( $exit_bad_json, undef, $stderr_bad_json ) = run_bridge('{');
isnt( $exit_bad_json, 0, 'bridge fails for malformed JSON input' );
like( $stderr_bad_json, qr/Invalid JSON payload:/, 'malformed JSON is reported' );
done_testing;
( run in 0.622 second using v1.01-cache-2.11-cpan-59e3e3084b8 )