You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

97 lines
3.4 KiB

<?php
declare(strict_types=1);
namespace App\Tests\Service;
use App\Service\NostrKeyHelper;
use App\Service\NostrWireEventMerge;
use PHPUnit\Framework\TestCase;
final class NostrWireEventMergeTest extends TestCase
{
private NostrWireEventMerge $m;
protected function setUp(): void
{
$this->m = new NostrWireEventMerge(new NostrKeyHelper());
}
public function testAuthorIdentToHexLowerAcceptsHex(): void
{
$h = str_repeat('a', 64);
$this->assertSame($h, $this->m->authorIdentToHexLower($h));
}
public function testWireEventSupersedesByCreatedAt(): void
{
$older = (object) ['kind' => 1, 'id' => str_repeat('1', 64), 'created_at' => 100, 'pubkey' => str_repeat('b', 64)];
$newer = (object) ['kind' => 1, 'id' => str_repeat('2', 64), 'created_at' => 200, 'pubkey' => str_repeat('b', 64)];
$this->assertTrue($this->m->wireEventSupersedes($newer, $older));
$this->assertFalse($this->m->wireEventSupersedes($older, $newer));
}
public function testWireEventSupersedesTieBreakByIdWhenSameCreatedAt(): void
{
$t = 50;
$a = (object) ['kind' => 1, 'id' => str_repeat('a', 64), 'created_at' => $t, 'pubkey' => str_repeat('b', 64)];
$b = (object) ['kind' => 1, 'id' => str_repeat('b', 64), 'created_at' => $t, 'pubkey' => str_repeat('b', 64)];
$this->assertTrue($this->m->wireEventSupersedes($a, $b), 'a < b lexicographically so a supersedes when created_at equal');
$this->assertFalse($this->m->wireEventSupersedes($b, $a));
}
public function testMergeNip33ParameterizedWireEventsKeepsNewerByAddress(): void
{
$k = 30_040;
$pk = str_repeat('c', 64);
$d = 'my-article';
$tags = [['d', $d]];
$old = (object) [
'kind' => $k,
'id' => str_repeat('1', 64),
'pubkey' => $pk,
'created_at' => 10,
'tags' => $tags,
];
$new = (object) [
'kind' => $k,
'id' => str_repeat('2', 64),
'pubkey' => $pk,
'created_at' => 20,
'tags' => $tags,
];
$merged = $this->m->mergeNip33ParameterizedWireEvents([$old, $new]);
$this->assertCount(1, $merged);
$this->assertSame(20, (int) $merged[0]->created_at);
}
public function testMergeKind0ByReplaceableAddress(): void
{
$pk = str_repeat('d', 64);
$a = (object) ['kind' => 0, 'id' => str_repeat('1', 64), 'pubkey' => $pk, 'created_at' => 1];
$b = (object) ['kind' => 0, 'id' => str_repeat('2', 64), 'pubkey' => $pk, 'created_at' => 2];
$out = $this->m->mergeKind0EventsByReplaceableAddress([$a, $b]);
$this->assertCount(1, $out);
$this->assertSame(2, (int) array_values($out)[0]->created_at);
}
public function testIsReplaceableByKindAndPubkeyNip(): void
{
$this->assertTrue($this->m->isReplaceableByKindAndPubkeyNip(0));
$this->assertTrue($this->m->isReplaceableByKindAndPubkeyNip(10_000));
$this->assertFalse($this->m->isReplaceableByKindAndPubkeyNip(1));
}
public function testIsNip33ParameterizedKindRange(): void
{
$this->assertTrue($this->m->isNip33ParameterizedKind(30_000));
$this->assertTrue($this->m->isNip33ParameterizedKind(39_999));
$this->assertFalse($this->m->isNip33ParameterizedKind(29_999));
$this->assertFalse($this->m->isNip33ParameterizedKind(40_000));
}
}