an atproto pds written in F# (.NET 9) 馃
pds
fsharp
giraffe
dotnet
atproto
1module AtUriTests
2
3open Xunit
4open PDSharp.Core.AtUri
5
6[<Fact>]
7let ``Parse valid AT-URI`` () =
8 let uri = "at://did:plc:abcd1234/app.bsky.feed.post/3kbq5vk4beg2f"
9 let result = parse uri
10
11 match result with
12 | Ok parsed ->
13 Assert.Equal("did:plc:abcd1234", parsed.Did)
14 Assert.Equal("app.bsky.feed.post", parsed.Collection)
15 Assert.Equal("3kbq5vk4beg2f", parsed.Rkey)
16 | Error msg -> Assert.Fail(msg)
17
18[<Fact>]
19let ``Parse did:web AT-URI`` () =
20 let uri = "at://did:web:example.com/app.bsky.actor.profile/self"
21 let result = parse uri
22
23 match result with
24 | Ok parsed ->
25 Assert.Equal("did:web:example.com", parsed.Did)
26 Assert.Equal("app.bsky.actor.profile", parsed.Collection)
27 Assert.Equal("self", parsed.Rkey)
28 | Error msg -> Assert.Fail(msg)
29
30[<Fact>]
31let ``Parse fails without at:// prefix`` () =
32 let uri = "http://did:plc:abcd/app.bsky.feed.post/123"
33 let result = parse uri
34
35 Assert.True(Result.isError result)
36
37[<Fact>]
38let ``Parse fails with invalid DID`` () =
39 let uri = "at://not-a-did/app.bsky.feed.post/123"
40 let result = parse uri
41
42 Assert.True(Result.isError result)
43
44[<Fact>]
45let ``Parse fails with invalid collection`` () =
46 let uri = "at://did:plc:abcd/NotAnNsid/123"
47 let result = parse uri
48
49 Assert.True(Result.isError result)
50
51[<Fact>]
52let ``Parse fails with missing parts`` () =
53 let uri = "at://did:plc:abcd/app.bsky.feed.post"
54 let result = parse uri
55
56 Assert.True(Result.isError result)
57
58[<Fact>]
59let ``ToString roundtrip`` () =
60 let original = {
61 Did = "did:plc:abcd"
62 Collection = "app.bsky.feed.post"
63 Rkey = "123"
64 }
65
66 let str = toString original
67 let parsed = parse str
68
69 match parsed with
70 | Ok p ->
71 Assert.Equal(original.Did, p.Did)
72 Assert.Equal(original.Collection, p.Collection)
73 Assert.Equal(original.Rkey, p.Rkey)
74 | Error msg -> Assert.Fail(msg)