Resolve AT Protocol DIDs, handles, and schemas with intelligent caching for Laravel
at main 4.2 kB view raw
1<?php 2 3namespace SocialDept\AtpResolver\Tests\Unit; 4 5use PHPUnit\Framework\TestCase; 6use SocialDept\AtpResolver\Contracts\CacheStore; 7use SocialDept\AtpResolver\Contracts\DidResolver; 8use SocialDept\AtpResolver\Contracts\HandleResolver; 9use SocialDept\AtpResolver\Data\DidDocument; 10use SocialDept\AtpResolver\Resolver; 11 12class ResolverIdentityTest extends TestCase 13{ 14 public function test_it_can_convert_handle_to_did(): void 15 { 16 $didResolver = $this->createMock(DidResolver::class); 17 $handleResolver = $this->createMock(HandleResolver::class); 18 $cache = $this->createMock(CacheStore::class); 19 20 $handleResolver->expects($this->once()) 21 ->method('resolve') 22 ->with('user.bsky.social') 23 ->willReturn('did:plc:abc123'); 24 25 $cache->method('has')->willReturn(false); 26 $cache->expects($this->once()) 27 ->method('put') 28 ->with('handle:user.bsky.social', 'did:plc:abc123', $this->anything()); 29 30 $beacon = new Resolver($didResolver, $handleResolver, $cache); 31 $did = $beacon->handleToDid('user.bsky.social'); 32 33 $this->assertSame('did:plc:abc123', $did); 34 } 35 36 public function test_it_can_resolve_handle(): void 37 { 38 $didResolver = $this->createMock(DidResolver::class); 39 $handleResolver = $this->createMock(HandleResolver::class); 40 $cache = $this->createMock(CacheStore::class); 41 42 $handleResolver->expects($this->once()) 43 ->method('resolve') 44 ->with('user.bsky.social') 45 ->willReturn('did:plc:abc123'); 46 47 $didDocument = DidDocument::fromArray([ 48 'id' => 'did:plc:abc123', 49 'alsoKnownAs' => ['at://user.bsky.social'], 50 ]); 51 52 $didResolver->expects($this->once()) 53 ->method('resolve') 54 ->with('did:plc:abc123') 55 ->willReturn($didDocument); 56 57 $cache->method('has')->willReturn(false); 58 59 $beacon = new Resolver($didResolver, $handleResolver, $cache); 60 $document = $beacon->resolveHandle('user.bsky.social'); 61 62 $this->assertInstanceOf(DidDocument::class, $document); 63 $this->assertSame('did:plc:abc123', $document->id); 64 } 65 66 public function test_it_can_resolve_identity_with_did(): void 67 { 68 $didResolver = $this->createMock(DidResolver::class); 69 $handleResolver = $this->createMock(HandleResolver::class); 70 $cache = $this->createMock(CacheStore::class); 71 72 $didDocument = DidDocument::fromArray([ 73 'id' => 'did:plc:abc123', 74 ]); 75 76 $didResolver->expects($this->once()) 77 ->method('resolve') 78 ->with('did:plc:abc123') 79 ->willReturn($didDocument); 80 81 $cache->method('has')->willReturn(false); 82 $handleResolver->expects($this->never())->method('resolve'); 83 84 $beacon = new Resolver($didResolver, $handleResolver, $cache); 85 $document = $beacon->resolveIdentity('did:plc:abc123'); 86 87 $this->assertInstanceOf(DidDocument::class, $document); 88 $this->assertSame('did:plc:abc123', $document->id); 89 } 90 91 public function test_it_can_resolve_identity_with_handle(): void 92 { 93 $didResolver = $this->createMock(DidResolver::class); 94 $handleResolver = $this->createMock(HandleResolver::class); 95 $cache = $this->createMock(CacheStore::class); 96 97 $handleResolver->expects($this->once()) 98 ->method('resolve') 99 ->with('user.bsky.social') 100 ->willReturn('did:plc:abc123'); 101 102 $didDocument = DidDocument::fromArray([ 103 'id' => 'did:plc:abc123', 104 'alsoKnownAs' => ['at://user.bsky.social'], 105 ]); 106 107 $didResolver->expects($this->once()) 108 ->method('resolve') 109 ->with('did:plc:abc123') 110 ->willReturn($didDocument); 111 112 $cache->method('has')->willReturn(false); 113 114 $beacon = new Resolver($didResolver, $handleResolver, $cache); 115 $document = $beacon->resolveIdentity('user.bsky.social'); 116 117 $this->assertInstanceOf(DidDocument::class, $document); 118 $this->assertSame('did:plc:abc123', $document->id); 119 $this->assertSame('user.bsky.social', $document->getHandle()); 120 } 121}