an atproto pds written in F# (.NET 9) 馃
pds
fsharp
giraffe
dotnet
atproto
1module RepositoryTests
2
3open Xunit
4open PDSharp.Core
5open PDSharp.Core.Crypto
6open PDSharp.Core.Repository
7
8[<Fact>]
9let ``TID generation produces 13 character string`` () =
10 let tid = Tid.generate ()
11 Assert.Equal(13, tid.Length)
12
13[<Fact>]
14let ``TID generation is sortable by time`` () =
15 let tid1 = Tid.generate ()
16 System.Threading.Thread.Sleep(2)
17 let tid2 = Tid.generate ()
18 Assert.True(tid2 > tid1, $"Expected {tid2} > {tid1}")
19
20[<Fact>]
21let ``Commit signing produces valid signature`` () =
22 let keyPair = generateKey P256
23 let mstRoot = Cid.FromHash(sha256Str "mst-root")
24
25 let unsigned = {
26 Did = "did:plc:test1234"
27 Version = 3
28 Data = mstRoot
29 Rev = Tid.generate ()
30 Prev = None
31 }
32
33 let signed = signCommit keyPair unsigned
34
35 Assert.Equal(64, signed.Sig.Length)
36 Assert.Equal(unsigned.Did, signed.Did)
37 Assert.Equal(unsigned.Data, signed.Data)
38
39[<Fact>]
40let ``Commit verification succeeds for valid commit`` () =
41 let keyPair = generateKey P256
42 let mstRoot = Cid.FromHash(sha256Str "data")
43
44 let unsigned = {
45 Did = "did:plc:abc"
46 Version = 3
47 Data = mstRoot
48 Rev = Tid.generate ()
49 Prev = None
50 }
51
52 let signed = signCommit keyPair unsigned
53
54 Assert.True(verifyCommit keyPair signed)
55
56[<Fact>]
57let ``Commit verification fails for tampered data`` () =
58 let keyPair = generateKey P256
59 let mstRoot = Cid.FromHash(sha256Str "original")
60
61 let unsigned = {
62 Did = "did:plc:abc"
63 Version = 3
64 Data = mstRoot
65 Rev = Tid.generate ()
66 Prev = None
67 }
68
69 let signed = signCommit keyPair unsigned
70 let tampered = { signed with Did = "did:plc:different" }
71
72 Assert.False(verifyCommit keyPair tampered)
73
74[<Fact>]
75let ``Commit with prev CID`` () =
76 let keyPair = generateKey P256
77 let mstRoot = Cid.FromHash(sha256Str "new-data")
78 let prevCid = Cid.FromHash(sha256Str "prev-commit")
79
80 let unsigned = {
81 Did = "did:plc:abc"
82 Version = 3
83 Data = mstRoot
84 Rev = Tid.generate ()
85 Prev = Some prevCid
86 }
87
88 let signed = signCommit keyPair unsigned
89 Assert.True(verifyCommit keyPair signed)
90 Assert.True(Option.isSome signed.Prev)
91
92[<Fact>]
93let ``Commit CID is deterministic`` () =
94 let keyPair = generateKey P256
95 let mstRoot = Cid.FromHash(sha256Str "data")
96
97 let unsigned = {
98 Did = "did:plc:abc"
99 Version = 3
100 Data = mstRoot
101 Rev = "abcdefghijklm"
102 Prev = None
103 }
104
105 let signed = signCommit keyPair unsigned
106 let cid1 = commitCid signed
107 let cid2 = commitCid signed
108
109 Assert.Equal<byte[]>(cid1.Bytes, cid2.Bytes)
110
111[<Fact>]
112let ``Commit serialization produces valid DAG-CBOR`` () =
113 let keyPair = generateKey P256
114 let mstRoot = Cid.FromHash(sha256Str "test")
115
116 let unsigned = {
117 Did = "did:plc:test"
118 Version = 3
119 Data = mstRoot
120 Rev = Tid.generate ()
121 Prev = None
122 }
123
124 let signed = signCommit keyPair unsigned
125 let bytes = serializeCommit signed
126
127 Assert.True(bytes.Length > 0)
128 Assert.True(bytes.[0] >= 0xa0uy && bytes.[0] <= 0xbfuy)