From d98b6318ace5f8a00a6d1776be2e78782f7eb429 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Tue, 27 Jun 2023 11:37:42 +0200 Subject: [bugfix] Use gtserror package for WrongType errs (#1930) * [bugfix] Use gtserror package for WrongType errs * test --- internal/ap/ap_test.go | 237 +++++++++++++++++++++++++++++++++ internal/ap/error.go | 35 ----- internal/ap/extract_test.go | 208 ----------------------------- internal/ap/extractattachments_test.go | 2 +- internal/ap/extractcontent_test.go | 2 +- internal/ap/extractmentions_test.go | 2 +- internal/ap/extractsensitive_test.go | 2 +- internal/ap/extractvisibility_test.go | 2 +- internal/ap/normalize_test.go | 34 +---- internal/ap/resolve.go | 18 +-- internal/ap/resolve_test.go | 52 ++++++++ 11 files changed, 304 insertions(+), 290 deletions(-) create mode 100644 internal/ap/ap_test.go delete mode 100644 internal/ap/error.go delete mode 100644 internal/ap/extract_test.go create mode 100644 internal/ap/resolve_test.go (limited to 'internal/ap') 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 . + +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() +} diff --git a/internal/ap/error.go b/internal/ap/error.go deleted file mode 100644 index ef27d5ac7..000000000 --- a/internal/ap/error.go +++ /dev/null @@ -1,35 +0,0 @@ -// 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 . - -package ap - -import "fmt" - -// ErrWrongType indicates that we tried to resolve a type into -// an interface that it's not compatible with, eg a Person into -// a Statusable. -type ErrWrongType struct { - wrapped error -} - -func (err *ErrWrongType) Error() string { - return fmt.Sprintf("wrong received type: %v", err.wrapped) -} - -func newErrWrongType(err error) error { - return &ErrWrongType{wrapped: err} -} diff --git a/internal/ap/extract_test.go b/internal/ap/extract_test.go deleted file mode 100644 index deb5ec041..000000000 --- a/internal/ap/extract_test.go +++ /dev/null @@ -1,208 +0,0 @@ -// 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 . - -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 ExtractTestSuite 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 *ExtractTestSuite) 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() -} diff --git a/internal/ap/extractattachments_test.go b/internal/ap/extractattachments_test.go index e3a40c7bb..3d5fc7e89 100644 --- a/internal/ap/extractattachments_test.go +++ b/internal/ap/extractattachments_test.go @@ -26,7 +26,7 @@ import ( ) type ExtractAttachmentsTestSuite struct { - ExtractTestSuite + APTestSuite } func (suite *ExtractAttachmentsTestSuite) TestExtractAttachmentMissingURL() { diff --git a/internal/ap/extractcontent_test.go b/internal/ap/extractcontent_test.go index d4b4808ab..590d1b931 100644 --- a/internal/ap/extractcontent_test.go +++ b/internal/ap/extractcontent_test.go @@ -25,7 +25,7 @@ import ( ) type ExtractContentTestSuite struct { - ExtractTestSuite + APTestSuite } func (suite *ExtractContentTestSuite) TestExtractContent1() { diff --git a/internal/ap/extractmentions_test.go b/internal/ap/extractmentions_test.go index 2f1929c9a..fbfee34f5 100644 --- a/internal/ap/extractmentions_test.go +++ b/internal/ap/extractmentions_test.go @@ -25,7 +25,7 @@ import ( ) type ExtractMentionsTestSuite struct { - ExtractTestSuite + APTestSuite } func (suite *ExtractMentionsTestSuite) TestExtractMentions() { diff --git a/internal/ap/extractsensitive_test.go b/internal/ap/extractsensitive_test.go index f486877f8..ce5571680 100644 --- a/internal/ap/extractsensitive_test.go +++ b/internal/ap/extractsensitive_test.go @@ -25,7 +25,7 @@ import ( ) type ExtractSensitiveTestSuite struct { - ExtractTestSuite + APTestSuite } func (suite *ExtractMentionsTestSuite) TestExtractSensitive() { diff --git a/internal/ap/extractvisibility_test.go b/internal/ap/extractvisibility_test.go index 24fb50ec3..3c894f4a5 100644 --- a/internal/ap/extractvisibility_test.go +++ b/internal/ap/extractvisibility_test.go @@ -26,7 +26,7 @@ import ( ) type ExtractVisibilityTestSuite struct { - ExtractTestSuite + APTestSuite } func (suite *ExtractVisibilityTestSuite) TestExtractVisibilityPublic() { diff --git a/internal/ap/normalize_test.go b/internal/ap/normalize_test.go index 2c9a1907a..cde807f21 100644 --- a/internal/ap/normalize_test.go +++ b/internal/ap/normalize_test.go @@ -18,48 +18,16 @@ package ap_test import ( - "context" - "encoding/json" "testing" "github.com/stretchr/testify/suite" - "github.com/superseriousbusiness/activity/streams" "github.com/superseriousbusiness/activity/streams/vocab" "github.com/superseriousbusiness/gotosocial/internal/ap" "github.com/superseriousbusiness/gotosocial/testrig" ) type NormalizeTestSuite struct { - suite.Suite -} - -func (suite *NormalizeTestSuite) 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 *NormalizeTestSuite) 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) + APTestSuite } func (suite *NormalizeTestSuite) getStatusable() (vocab.ActivityStreamsNote, map[string]interface{}) { diff --git a/internal/ap/resolve.go b/internal/ap/resolve.go index ef4d0b50f..a9955be3f 100644 --- a/internal/ap/resolve.go +++ b/internal/ap/resolve.go @@ -20,10 +20,10 @@ package ap import ( "context" "encoding/json" - "fmt" "github.com/superseriousbusiness/activity/streams" "github.com/superseriousbusiness/activity/streams/vocab" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" ) // ResolveStatusable tries to resolve the given bytes into an ActivityPub Statusable representation. @@ -33,12 +33,12 @@ import ( func ResolveStatusable(ctx context.Context, b []byte) (Statusable, error) { rawStatusable := make(map[string]interface{}) if err := json.Unmarshal(b, &rawStatusable); err != nil { - return nil, fmt.Errorf("ResolveStatusable: error unmarshalling bytes into json: %w", err) + return nil, gtserror.Newf("error unmarshalling bytes into json: %w", err) } t, err := streams.ToType(ctx, rawStatusable) if err != nil { - return nil, fmt.Errorf("ResolveStatusable: error resolving json into ap vocab type: %w", err) + return nil, gtserror.Newf("error resolving json into ap vocab type: %w", err) } var ( @@ -68,8 +68,8 @@ func ResolveStatusable(ctx context.Context, b []byte) (Statusable, error) { } if !ok { - err = fmt.Errorf("ResolveStatusable: could not resolve %T to Statusable", t) - return nil, newErrWrongType(err) + err = gtserror.Newf("could not resolve %T to Statusable", t) + return nil, gtserror.SetWrongType(err) } NormalizeIncomingContent(statusable, rawStatusable) @@ -87,12 +87,12 @@ func ResolveStatusable(ctx context.Context, b []byte) (Statusable, error) { func ResolveAccountable(ctx context.Context, b []byte) (Accountable, error) { rawAccountable := make(map[string]interface{}) if err := json.Unmarshal(b, &rawAccountable); err != nil { - return nil, fmt.Errorf("ResolveAccountable: error unmarshalling bytes into json: %w", err) + return nil, gtserror.Newf("error unmarshalling bytes into json: %w", err) } t, err := streams.ToType(ctx, rawAccountable) if err != nil { - return nil, fmt.Errorf("ResolveAccountable: error resolving json into ap vocab type: %w", err) + return nil, gtserror.Newf("error resolving json into ap vocab type: %w", err) } var ( @@ -114,8 +114,8 @@ func ResolveAccountable(ctx context.Context, b []byte) (Accountable, error) { } if !ok { - err = fmt.Errorf("ResolveAccountable: could not resolve %T to Accountable", t) - return nil, newErrWrongType(err) + err = gtserror.Newf("could not resolve %T to Accountable", t) + return nil, gtserror.SetWrongType(err) } NormalizeIncomingSummary(accountable, rawAccountable) diff --git a/internal/ap/resolve_test.go b/internal/ap/resolve_test.go new file mode 100644 index 000000000..efb56b1c4 --- /dev/null +++ b/internal/ap/resolve_test.go @@ -0,0 +1,52 @@ +// 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 . + +package ap_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" +) + +type ResolveTestSuite struct { + APTestSuite +} + +func (suite *ResolveTestSuite) TestResolveDocumentAsStatusable() { + b := []byte(suite.typeToJson(suite.document1)) + + statusable, err := ap.ResolveStatusable(context.Background(), b) + suite.NoError(err) + suite.NotNil(statusable) +} + +func (suite *ResolveTestSuite) TestResolveDocumentAsAccountable() { + b := []byte(suite.typeToJson(suite.document1)) + + accountable, err := ap.ResolveAccountable(context.Background(), b) + suite.True(gtserror.WrongType(err)) + suite.EqualError(err, "ResolveAccountable: could not resolve *typedocument.ActivityStreamsDocument to Accountable") + suite.Nil(accountable) +} + +func TestResolveTestSuite(t *testing.T) { + suite.Run(t, &ResolveTestSuite{}) +} -- cgit v1.2.3