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 ++++++++
internal/gtserror/error.go | 19 ++-
12 files changed, 318 insertions(+), 295 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')
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{})
+}
diff --git a/internal/gtserror/error.go b/internal/gtserror/error.go
index 6eaa3db63..85dc0d54c 100644
--- a/internal/gtserror/error.go
+++ b/internal/gtserror/error.go
@@ -40,26 +40,35 @@ const (
TypeSMTP ErrorType = "smtp" // smtp (mail)
)
-// Unretrievable ...
+// Unretrievable checks error for a stored "unretrievable" flag.
+//
+// Unretrievable indicates that a call to retrieve a resource
+// (account, status, etc) could not be fulfilled, either because
+// it was not found locally, or because some prerequisite remote
+// resource call failed, making it impossible to return the item.
func Unretrievable(err error) bool {
_, ok := errors.Value(err, unrtrvableKey).(struct{})
return ok
}
-// SetUnretrievable ...
+// SetUnretrievable will wrap the given error to store an "unretrievable"
+// flag, returning wrapped error. See "Unretrievable" for example use-cases.
func SetUnretrievable(err error) error {
return errors.WithValue(err, unrtrvableKey, struct{}{})
}
-// WrongType ...
+// WrongType checks error for a stored "wrong type" flag. Wrong type
+// indicates that an ActivityPub URI returned a type we weren't expecting:
+// Statusable instead of Accountable, or vice versa, for example.
func WrongType(err error) bool {
_, ok := errors.Value(err, wrongTypeKey).(struct{})
return ok
}
-// SetWrongType ...
+// SetWrongType will wrap the given error to store a "wrong type" flag,
+// returning wrapped error. See "WrongType" for example use-cases.
func SetWrongType(err error) error {
- return errors.WithValue(err, unrtrvableKey, struct{}{})
+ return errors.WithValue(err, wrongTypeKey, struct{}{})
}
// StatusCode checks error for a stored status code value. For example
--
cgit v1.2.3