Net-Nostr-Core

 view release on metacpan or  search on metacpan

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


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');
};

###############################################################################
# Kind 78 normal event
###############################################################################

subtest 'kind 78 is normal app data' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey  => $PK,
        kind    => 78,
        content => '{"one":1}',
    );
    is($event->kind, 78, 'kind is 78');
    ok($event->is_regular, 'kind 78 is regular');
    my @d_tags = grep { $_->[0] eq 'd' } @{$event->tags};
    is(scalar @d_tags, 0, 'd tag not required for kind 78');
};

subtest 'kind 78 may use d tag for grouping' => sub {
    my $event = Net::Nostr::AppData->to_event(
        pubkey => $PK,
        kind   => 78,
        d_tag  => 'thread-1',
    );
    is($event->kind, 78, 'kind is 78');
    is($event->d_tag, 'thread-1', 'optional d tag included');
};

###############################################################################
# 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 for default kind 30078'
    );
};

###############################################################################
# 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 2.067 seconds using v1.01-cache-2.11-cpan-5fbc6bb55f2 )