Resolve AT Protocol DIDs, handles, and schemas with intelligent caching for Laravel
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}