Net-Nostr

 view release on metacpan or  search on metacpan

t/nip/78.t  view on Meta::CPAN

use strictures 2;
use Test2::V0 -no_srand => 1;

use Net::Nostr::Event;
use Net::Nostr::AppData;

my $PK = 'a' x 64;

###############################################################################
# Kind 30078 addressable event
###############################################################################

subtest 'kind 30078 is addressable' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey => $PK,
        d_tag  => 'myapp-settings',
    );
    is($event->kind, 30078, 'kind is 30078');
    ok($event->is_addressable, 'kind 30078 is addressable');
};

###############################################################################
# d tag contains app name / context reference
###############################################################################

subtest 'd tag is app name / context' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey => $PK,
        d_tag  => 'myapp-settings',
    );
    is($event->d_tag, 'myapp-settings', 'd tag is app identifier');
};

subtest 'd tag can be any arbitrary string' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey => $PK,
        d_tag  => 'com.example.app/user-prefs/v2',
    );
    is($event->d_tag, 'com.example.app/user-prefs/v2', 'arbitrary d tag');
};

subtest 'd_tag is required' => sub {
    like(
        dies { Net::Nostr::AppData->to_event(pubkey => $PK) },
        qr/d_tag/i,
        'd_tag required'
    );
};

###############################################################################
# content can be anything
###############################################################################

subtest 'content can be arbitrary JSON' => sub {
    my $json = '{"theme":"dark","fontSize":14}';
    my $event = Net::Nostr::AppData->to_event(
        pubkey  => $PK,
        d_tag   => 'settings',
        content => $json,
    );
    is($event->content, $json, 'content is arbitrary JSON');
};

subtest 'content can be plain text' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey  => $PK,
        d_tag   => 'notes',
        content => 'just some text',
    );
    is($event->content, 'just some text', 'content is plain text');
};

subtest 'content defaults to empty string' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey => $PK,
        d_tag  => 'empty',
    );
    is($event->content, '', 'content defaults to empty');
};

###############################################################################
# tags can be anything
###############################################################################

subtest 'extra tags passed through' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey     => $PK,
        d_tag      => 'myapp',
        extra_tags => [['x', 'custom'], ['y', '1', '2']],
    );
    my @tags = @{$event->tags};
    # d tag + 2 extra
    is(scalar @tags, 3, '3 tags total');
    is($tags[1], ['x', 'custom'], 'first extra tag');
    is($tags[2], ['y', '1', '2'], 'second extra tag');
};

###############################################################################
# from_event round-trip



( run in 0.577 second using v1.01-cache-2.11-cpan-5735350b133 )