GoAT Site is library that implements Standard.site in Go.
atprotocol standard-site atproto library
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(lexicon): tests for custom URL representation

authored by

Anhgelus Morhtuuzh and committed by tangled.org 1b6f595d 2f10d5aa

+110 -42
-42
lexicons_test.go
··· 2 2 3 3 import ( 4 4 "context" 5 - "strings" 6 5 "time" 7 6 8 7 "github.com/bluesky-social/indigo/atproto/atclient" ··· 31 30 } 32 31 } 33 32 34 - func genURL(t *rapid.T, label string) string { 35 - scheme := "http" 36 - if rapid.Bool().Draw(t, label+"_secure?") { 37 - scheme += "s" 38 - } 39 - base := rapid.StringOfN(rapidLowerRunes, 1, -1, 64).Draw(t, label+"_base") 40 - tld := rapid.StringOfN(rapidLowerRunes, 2, -1, 10).Draw(t, label+"_tld") 41 - sub := rapid.StringOfN(rapidLowerRunes, -1, -1, 32).Draw(t, label+"_sub") 42 - var sb strings.Builder 43 - sb.Grow(len(base) + len(tld) + len(sub) + len(scheme) + 5) 44 - sb.WriteString(scheme) 45 - sb.WriteString("://") 46 - if sub != "" { 47 - sb.WriteString(sub) 48 - sb.WriteRune('.') 49 - } 50 - sb.WriteString(base) 51 - sb.WriteRune('.') 52 - sb.WriteString(tld) 53 - path := genPath(t, label+"_path") 54 - if path != "/" { 55 - sb.Grow(len(path)) 56 - sb.WriteString(path) 57 - } 58 - return sb.String() 59 - } 60 - 61 - func genPath(t *rapid.T, label string) string { 62 - valid := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")) 63 - return "/" + rapid.StringOfN(valid, -1, -1, 64).Draw(t, label) 64 - } 65 - 66 - func genRecordKey(t *rapid.T, label string) string { 67 - valid := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyz0123456789")) 68 - return rapid.StringOfN(valid, 1, -1, 128).Draw(t, label) 69 - } 70 - 71 33 func getClient(t rapid.TB, test string) (syntax.ATURI, *atclient.APIClient) { 72 34 dir := identity.DefaultDirectory() 73 35 uri, err := syntax.ParseATURI(test) ··· 83 45 client := atclient.NewAPIClient(id.PDSEndpoint()) 84 46 t.Log(uri.Authority().String(), uri.RecordKey()) 85 47 return uri, client 86 - } 87 - 88 - func genDid(t *rapid.T, label string) string { 89 - return "did:plc:" + rapid.StringOfN(rapidLowerRunes, 24, -1, 24).Draw(t, label) 90 48 } 91 49 92 50 func genTime(t *rapid.T, label string) time.Time {
+110
url_test.go
··· 1 + package site_test 2 + 3 + import ( 4 + "fmt" 5 + "strings" 6 + "testing" 7 + 8 + "pgregory.net/rapid" 9 + site "tangled.org/anhgelus.world/goat-site" 10 + ) 11 + 12 + func genDid(t *rapid.T, label string) string { 13 + return "did:plc:" + rapid.StringOfN(rapidLowerRunes, 24, -1, 24).Draw(t, label) 14 + } 15 + 16 + func genURL(t *rapid.T, label string) string { 17 + scheme := "http" 18 + if rapid.Bool().Draw(t, label+"_secure?") { 19 + scheme += "s" 20 + } 21 + base := rapid.StringOfN(rapidLowerRunes, 1, -1, 63).Draw(t, label+"_base") 22 + tld := rapid.StringOfN(rapidLowerRunes, 2, -1, 10).Draw(t, label+"_tld") 23 + sub := rapid.StringOfN(rapidLowerRunes, -1, -1, 32).Draw(t, label+"_sub") 24 + var sb strings.Builder 25 + sb.Grow(len(base) + len(tld) + len(sub) + len(scheme) + 5) 26 + sb.WriteString(scheme) 27 + sb.WriteString("://") 28 + if sub != "" { 29 + sb.WriteString(sub) 30 + sb.WriteRune('.') 31 + } 32 + sb.WriteString(base) 33 + sb.WriteRune('.') 34 + sb.WriteString(tld) 35 + path := genPath(t, label+"_path") 36 + if path != "/" { 37 + sb.Grow(len(path)) 38 + sb.WriteString(path) 39 + } 40 + return sb.String() 41 + } 42 + 43 + func genPath(t *rapid.T, label string) string { 44 + valid := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")) 45 + return "/" + rapid.StringOfN(valid, -1, -1, 64).Draw(t, label) 46 + } 47 + 48 + func genRecordKey(t *rapid.T, label string) string { 49 + valid := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyz0123456789")) 50 + return rapid.StringOfN(valid, 1, -1, 128).Draw(t, label) 51 + } 52 + 53 + func genNSID(t *rapid.T, label string) string { 54 + ascii := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")) 55 + asciiNums := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")) 56 + asciiNumsHyp := rapid.RuneFrom([]rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-")) 57 + authority := func(l string, gen *rapid.Generator[rune]) string { 58 + a := rapid.StringOfN(ascii, 1, -1, 1).Draw(t, l+"_first") 59 + if rapid.Bool().Draw(t, l+"_bigger") { 60 + a += rapid.StringOfN(gen, 0, -1, 61).Draw(t, l+"_second") + 61 + rapid.StringOfN(asciiNums, 1, -1, 1).Draw(t, l+"_final") 62 + } 63 + return strings.ToLower(a) 64 + } 65 + var sb strings.Builder 66 + sb.WriteString(authority(label+"_tld", asciiNumsHyp)) 67 + sb.WriteRune('.') 68 + sb.WriteString(authority(label+"_base", asciiNumsHyp)) 69 + sb.WriteRune('.') 70 + ok := true 71 + for i := 0; ok; i++ { 72 + sb.WriteString(authority(fmt.Sprintf("%s_sub_%d", label, i), asciiNumsHyp)) 73 + sb.WriteRune('.') 74 + ok = rapid.Bool().Draw(t, label+"_continue?") 75 + } 76 + sb.WriteString(authority(label+"_final", asciiNums)) 77 + return sb.String() 78 + } 79 + 80 + func TestParseURL(t *testing.T) { 81 + rapid.Check(t, func(t *rapid.T) { 82 + raw := genURL(t, "url") 83 + url, err := site.ParseURL(raw) 84 + if err != nil { 85 + t.Fatal(err) 86 + } 87 + if url.IsAT() { 88 + t.Errorf("invalid url kind: %s is AT", url) 89 + } 90 + if url.String() != raw { 91 + t.Errorf("invalid string: %s, wanted %s", url.String(), raw) 92 + } 93 + }) 94 + rapid.Check(t, func(t *rapid.T) { 95 + did := genDid(t, "did") 96 + collection := genNSID(t, "collection") 97 + rkey := genRecordKey(t, "record_key") 98 + raw := fmt.Sprintf("at://%s/%s/%s", did, collection, rkey) 99 + url, err := site.ParseURL(raw) 100 + if err != nil { 101 + t.Fatal(err) 102 + } 103 + if !url.IsAT() { 104 + t.Errorf("invalid url kind: %s is not AT", url) 105 + } 106 + if url.String() != raw { 107 + t.Errorf("invalid string: %s, wanted %s", url.String(), raw) 108 + } 109 + }) 110 + }