diff options
Diffstat (limited to 'internal/ap/ap_test.go')
-rw-r--r-- | internal/ap/ap_test.go | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/internal/ap/ap_test.go b/internal/ap/ap_test.go new file mode 100644 index 000000000..105bc1fcf --- /dev/null +++ b/internal/ap/ap_test.go @@ -0,0 +1,237 @@ +// 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 ( + "context" + "encoding/json" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/activity/pub" + "github.com/superseriousbusiness/activity/streams" + "github.com/superseriousbusiness/activity/streams/vocab" + "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +func document1() vocab.ActivityStreamsDocument { + d := streams.NewActivityStreamsDocument() + + dMediaType := streams.NewActivityStreamsMediaTypeProperty() + dMediaType.Set("image/jpeg") + d.SetActivityStreamsMediaType(dMediaType) + + dURL := streams.NewActivityStreamsUrlProperty() + dURL.AppendIRI(testrig.URLMustParse("https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg")) + d.SetActivityStreamsUrl(dURL) + + dName := streams.NewActivityStreamsNameProperty() + dName.AppendXMLSchemaString("It's a cute plushie.") + d.SetActivityStreamsName(dName) + + dBlurhash := streams.NewTootBlurhashProperty() + dBlurhash.Set("UxQ0EkRP_4tRxtRjWBt7%hozM_ayV@oLf6WB") + d.SetTootBlurhash(dBlurhash) + + dSensitive := streams.NewActivityStreamsSensitiveProperty() + dSensitive.AppendXMLSchemaBoolean(true) + d.SetActivityStreamsSensitive(dSensitive) + + return d +} + +func attachment1() vocab.ActivityStreamsAttachmentProperty { + a := streams.NewActivityStreamsAttachmentProperty() + a.AppendActivityStreamsDocument(document1()) + return a +} + +func noteWithMentions1() vocab.ActivityStreamsNote { + note := streams.NewActivityStreamsNote() + + tags := streams.NewActivityStreamsTagProperty() + + mention1 := streams.NewActivityStreamsMention() + + mention1Href := streams.NewActivityStreamsHrefProperty() + mention1Href.Set(testrig.URLMustParse("https://gts.superseriousbusiness.org/users/dumpsterqueer")) + mention1.SetActivityStreamsHref(mention1Href) + + mention1Name := streams.NewActivityStreamsNameProperty() + mention1Name.AppendXMLSchemaString("@dumpsterqueer@superseriousbusiness.org") + mention1.SetActivityStreamsName(mention1Name) + + mention2 := streams.NewActivityStreamsMention() + + mention2Href := streams.NewActivityStreamsHrefProperty() + mention2Href.Set(testrig.URLMustParse("https://gts.superseriousbusiness.org/users/f0x")) + mention2.SetActivityStreamsHref(mention2Href) + + mention2Name := streams.NewActivityStreamsNameProperty() + mention2Name.AppendXMLSchemaString("@f0x@superseriousbusiness.org") + mention2.SetActivityStreamsName(mention2Name) + + tags.AppendActivityStreamsMention(mention1) + tags.AppendActivityStreamsMention(mention2) + + note.SetActivityStreamsTag(tags) + + content := streams.NewActivityStreamsContentProperty() + content.AppendXMLSchemaString("hey @f0x and @dumpsterqueer") + note.SetActivityStreamsContent(content) + + return note +} + +func addressable1() ap.Addressable { + // make a note addressed to public with followers in cc + note := streams.NewActivityStreamsNote() + + toProp := streams.NewActivityStreamsToProperty() + toProp.AppendIRI(testrig.URLMustParse(pub.PublicActivityPubIRI)) + + note.SetActivityStreamsTo(toProp) + + ccProp := streams.NewActivityStreamsCcProperty() + ccProp.AppendIRI(testrig.URLMustParse("http://localhost:8080/users/the_mighty_zork/followers")) + + note.SetActivityStreamsCc(ccProp) + + return note +} + +func addressable2() ap.Addressable { + // make a note addressed to followers with public in cc + note := streams.NewActivityStreamsNote() + + toProp := streams.NewActivityStreamsToProperty() + toProp.AppendIRI(testrig.URLMustParse("http://localhost:8080/users/the_mighty_zork/followers")) + + note.SetActivityStreamsTo(toProp) + + ccProp := streams.NewActivityStreamsCcProperty() + ccProp.AppendIRI(testrig.URLMustParse(pub.PublicActivityPubIRI)) + + note.SetActivityStreamsCc(ccProp) + + return note +} + +func addressable3() ap.Addressable { + // make a note addressed to followers + note := streams.NewActivityStreamsNote() + + toProp := streams.NewActivityStreamsToProperty() + toProp.AppendIRI(testrig.URLMustParse("http://localhost:8080/users/the_mighty_zork/followers")) + + note.SetActivityStreamsTo(toProp) + + return note +} + +func addressable4() vocab.ActivityStreamsAnnounce { + // https://github.com/superseriousbusiness/gotosocial/issues/267 + announceJson := []byte(` +{ + "@context": "https://www.w3.org/ns/activitystreams", + "actor": "https://example.org/users/someone", + "cc": "https://another.instance/users/someone_else", + "id": "https://example.org/users/someone/statuses/107043888547829808/activity", + "object": "https://another.instance/users/someone_else/statuses/107026674805188668", + "published": "2021-10-04T15:08:35.00Z", + "to": "https://example.org/users/someone/followers", + "type": "Announce" +}`) + + var jsonAsMap map[string]interface{} + err := json.Unmarshal(announceJson, &jsonAsMap) + if err != nil { + panic(err) + } + + t, err := streams.ToType(context.Background(), jsonAsMap) + if err != nil { + panic(err) + } + + return t.(vocab.ActivityStreamsAnnounce) +} + +func addressable5() ap.Addressable { + // make a note addressed to one person (direct message) + note := streams.NewActivityStreamsNote() + + toProp := streams.NewActivityStreamsToProperty() + toProp.AppendIRI(testrig.URLMustParse("http://localhost:8080/users/1_happy_turtle")) + + note.SetActivityStreamsTo(toProp) + + return note +} + +type APTestSuite struct { + suite.Suite + document1 vocab.ActivityStreamsDocument + attachment1 vocab.ActivityStreamsAttachmentProperty + noteWithMentions1 vocab.ActivityStreamsNote + addressable1 ap.Addressable + addressable2 ap.Addressable + addressable3 ap.Addressable + addressable4 vocab.ActivityStreamsAnnounce + addressable5 ap.Addressable +} + +func (suite *APTestSuite) jsonToType(rawJson string) (vocab.Type, map[string]interface{}) { + var raw map[string]interface{} + err := json.Unmarshal([]byte(rawJson), &raw) + if err != nil { + panic(err) + } + + t, err := streams.ToType(context.Background(), raw) + if err != nil { + panic(err) + } + + return t, raw +} + +func (suite *APTestSuite) typeToJson(t vocab.Type) string { + m, err := ap.Serialize(t) + if err != nil { + suite.FailNow(err.Error()) + } + + b, err := json.MarshalIndent(m, "", " ") + if err != nil { + suite.FailNow(err.Error()) + } + + return string(b) +} + +func (suite *APTestSuite) SetupTest() { + suite.document1 = document1() + suite.attachment1 = attachment1() + suite.noteWithMentions1 = noteWithMentions1() + suite.addressable1 = addressable1() + suite.addressable2 = addressable2() + suite.addressable3 = addressable3() + suite.addressable4 = addressable4() + suite.addressable5 = addressable5() +} |