Net-Nostr-Core
view release on metacpan or search on metacpan
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 )