The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl -T

use strict;
use warnings;

use Test::More;
use Test::Exception;

BEGIN {
    use_ok 'WebService::XING::Function';
    use_ok 'WebService::XING::Function::Parameter';
}

my @required = qw(name method resource params_in);
my $f;

dies_ok { $f = WebService::XING::Function->new } 'missing required attributes';

for my $attr (@required) {
    dies_ok {
        $f = WebService::XING::Response->new(map { $_ => 1 } grep { $attr ne $_ } @required)
    } "missing attribute $attr";
}

lives_ok {
    $f = WebService::XING::Function->new(
        name => 'create_foo_bar',
        method => 'POST',
        resource => '/v1/foo/:id/bar',
        params_in => ['!mumble', '@bumble', '@!dumble', '?rumble=1'],
    );
} 'create a WebService::XING::Function object';

is "$f", 'create_foo_bar', 'stringifies correctly';

# is_deeply failed miserably here
my @expect = (
    [
        name => 'id', is_required => 1, is_placeholder => 1, is_list => 0,
        is_boolean => 0, default => undef,
    ],
    [
        name => 'mumble', is_required => 1, is_placeholder => 0, is_list => 0,
        is_boolean => 0, default => undef,
    ],
    [
        name => 'bumble', is_required => 0, is_placeholder => 0, is_list => 1,
        is_boolean => 0, default => undef,
    ],
    [
        name => 'dumble', is_required => 1, is_placeholder => 0, is_list => 1,
        is_boolean => 0, default => undef,
    ],
    [
        name => 'rumble', is_required => 0, is_placeholder => 0, is_list => 0,
        is_boolean => 1, default => 1,
    ],
);

for my $i (0 .. $#{$f->params}) {
    my $c = ($i + 1) . '. parameter';
    isa_ok $f->params->[$i], 'WebService::XING::Function::Parameter', $c;
    while (my ($key, $val) = splice @{$expect[$i]}, 0, 2) {
        if ($key =~ /^is_/) {
            if ($val eq "1") {
                ok $f->params->[$i]->$key, "$c $key";
            }
            elsif ($val eq "0") {
                ok !$f->params->[$i]->$key, "$c not $key";
            }
        }
        else {
            if (defined $val) {
                is $f->params->[$i]->$key, $val, qq{$c $key is "$val"};
            }
            else {
                is $f->params->[$i]->$key, $val, qq{$c does not have a $key};
            }
        }
    }
}

isa_ok $f->code, 'CODE', 'function code';

done_testing;