Apertur-SDK

 view release on metacpan or  search on metacpan

t/01_client.t  view on Meta::CPAN

    # Test throw mechanism
    eval { Apertur::SDK::Error::NotFound->throw(message => 'Gone') };
    my $caught = $@;
    isa_ok($caught, 'Apertur::SDK::Error::NotFound');
    is($caught->message, 'Gone', 'thrown error message');
};

# --- Signature verification ---

subtest 'Signature verification' => sub {
    plan tests => 6;

    use Apertur::SDK::Signature qw(
        verify_webhook_signature
        verify_event_signature
        verify_svix_signature
    );

    # Webhook signature
    my $secret = 'my_secret';
    my $body   = '{"event":"test"}';

    use Digest::SHA qw(hmac_sha256_hex);
    my $sig_hex = hmac_sha256_hex($body, $secret);
    ok(
        verify_webhook_signature($body, "sha256=$sig_hex", $secret),
        'valid webhook signature accepted',
    );
    ok(
        !verify_webhook_signature($body, 'sha256=bad', $secret),
        'invalid webhook signature rejected',
    );

    # Event signature
    my $timestamp = '1700000000';
    my $event_sig = hmac_sha256_hex("${timestamp}.${body}", $secret);
    ok(
        verify_event_signature($body, $timestamp, "sha256=$event_sig", $secret),
        'valid event signature accepted',
    );
    ok(
        !verify_event_signature($body, $timestamp, 'sha256=bad', $secret),
        'invalid event signature rejected',
    );

    # Svix signature
    my $svix_id     = 'msg_abc123';
    my $svix_secret = 'deadbeef';
    my $svix_base   = "${svix_id}.${timestamp}.${body}";

    use MIME::Base64 qw(encode_base64);
    my $svix_expected = encode_base64(
        Digest::SHA::hmac_sha256($svix_base, pack('H*', $svix_secret)),
        '',
    );
    ok(
        verify_svix_signature($body, $svix_id, $timestamp, "v1,$svix_expected", $svix_secret),
        'valid svix signature accepted',
    );
    ok(
        !verify_svix_signature($body, $svix_id, $timestamp, 'v1,badsig==', $svix_secret),
        'invalid svix signature rejected',
    );
};

# --- Error stringification ---

subtest 'Error stringification' => sub {
    plan tests => 1;

    my $err = Apertur::SDK::Error->new(
        status_code => 500,
        code        => 'INTERNAL',
        message     => 'boom',
    );
    like("$err", qr/500.*INTERNAL.*boom/, 'error stringifies correctly');
};

done_testing();



( run in 0.688 second using v1.01-cache-2.11-cpan-71847e10f99 )