diff options
author | 2023-09-20 16:49:46 +0100 | |
---|---|---|
committer | 2023-09-20 16:49:46 +0100 | |
commit | fc11deeb83a76a0dbe550842ce6594602a9fb8bc (patch) | |
tree | c2d079d548218bda1113308e8ad7a0351308294d /internal/ap/activitystreams_test.go | |
parent | [chore]: Bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp... (diff) | |
download | gotosocial-fc11deeb83a76a0dbe550842ce6594602a9fb8bc.tar.xz |
[feature] add paging to AP following / followers endpoints (#2198)
Diffstat (limited to 'internal/ap/activitystreams_test.go')
-rw-r--r-- | internal/ap/activitystreams_test.go | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/internal/ap/activitystreams_test.go b/internal/ap/activitystreams_test.go new file mode 100644 index 000000000..ee03f9b0f --- /dev/null +++ b/internal/ap/activitystreams_test.go @@ -0,0 +1,221 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +package ap_test + +import ( + "encoding/json" + "net/url" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/superseriousbusiness/activity/streams/vocab" + "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +func TestASCollection(t *testing.T) { + const ( + proto = "https" + host = "zorg.flabormagorg.xyz" + path = "/users/itsa_me_mario" + + idURI = proto + "://" + host + path + total = 10 + ) + + // Create JSON string of expected output. + expect := toJSON(map[string]any{ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "Collection", + "id": idURI, + "first": idURI + "?limit=40", + "totalItems": total, + }) + + // Create new collection using builder function. + c := ap.NewASCollection(ap.CollectionParams{ + ID: parseURI(idURI), + Total: total, + }) + + // Serialize collection. + s := toJSON(c) + + // Ensure outputs are equal. + assert.Equal(t, s, expect) +} + +func TestASCollectionPage(t *testing.T) { + const ( + proto = "https" + host = "zorg.flabormagorg.xyz" + path = "/users/itsa_me_mario" + + idURI = proto + "://" + host + path + total = 10 + + minID = "minimum" + maxID = "maximum" + limit = 40 + count = 2 + ) + + // Create the current page. + currPg := &paging.Page{ + Limit: 40, + } + + // Create JSON string of expected output. + expect := toJSON(map[string]any{ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "CollectionPage", + "id": currPg.ToLink(proto, host, path, nil), + "partOf": idURI, + "next": currPg.Next(minID, maxID).ToLink(proto, host, path, nil), + "prev": currPg.Prev(minID, maxID).ToLink(proto, host, path, nil), + "items": []interface{}{}, + "totalItems": total, + }) + + // Create new collection page using builder function. + p := ap.NewASCollectionPage(ap.CollectionPageParams{ + CollectionParams: ap.CollectionParams{ + ID: parseURI(idURI), + Total: total, + }, + + Current: currPg, + Next: currPg.Next(minID, maxID), + Prev: currPg.Prev(minID, maxID), + + Append: func(i int, ipb ap.ItemsPropertyBuilder) {}, + Count: count, + }) + + // Serialize page. + s := toJSON(p) + + // Ensure outputs are equal. + assert.Equal(t, s, expect) +} + +func TestASOrderedCollection(t *testing.T) { + const ( + idURI = "https://zorg.flabormagorg.xyz/users/itsa_me_mario" + total = 10 + ) + + // Create JSON string of expected output. + expect := toJSON(map[string]any{ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "OrderedCollection", + "id": idURI, + "first": idURI + "?limit=40", + "totalItems": total, + }) + + // Create new collection using builder function. + c := ap.NewASOrderedCollection(ap.CollectionParams{ + ID: parseURI(idURI), + Total: total, + }) + + // Serialize collection. + s := toJSON(c) + + // Ensure outputs are equal. + assert.Equal(t, s, expect) +} + +func TestASOrderedCollectionPage(t *testing.T) { + const ( + proto = "https" + host = "zorg.flabormagorg.xyz" + path = "/users/itsa_me_mario" + + idURI = proto + "://" + host + path + total = 10 + + minID = "minimum" + maxID = "maximum" + limit = 40 + count = 2 + ) + + // Create the current page. + currPg := &paging.Page{ + Limit: 40, + } + + // Create JSON string of expected output. + expect := toJSON(map[string]any{ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "OrderedCollectionPage", + "id": currPg.ToLink(proto, host, path, nil), + "partOf": idURI, + "next": currPg.Next(minID, maxID).ToLink(proto, host, path, nil), + "prev": currPg.Prev(minID, maxID).ToLink(proto, host, path, nil), + "orderedItems": []interface{}{}, + "totalItems": total, + }) + + // Create new collection page using builder function. + p := ap.NewASOrderedCollectionPage(ap.CollectionPageParams{ + CollectionParams: ap.CollectionParams{ + ID: parseURI(idURI), + Total: total, + }, + + Current: currPg, + Next: currPg.Next(minID, maxID), + Prev: currPg.Prev(minID, maxID), + + Append: func(i int, ipb ap.ItemsPropertyBuilder) {}, + Count: count, + }) + + // Serialize page. + s := toJSON(p) + + // Ensure outputs are equal. + assert.Equal(t, s, expect) +} + +func parseURI(s string) *url.URL { + u, err := url.Parse(s) + if err != nil { + panic(err) + } + return u +} + +// toJSON will return indented JSON serialized form of 'a'. +func toJSON(a any) string { + v, ok := a.(vocab.Type) + if ok { + m, err := ap.Serialize(v) + if err != nil { + panic(err) + } + a = m + } + b, err := json.MarshalIndent(a, "", " ") + if err != nil { + panic(err) + } + return string(b) +} |