Improvements to Equals methods for actor and activity
This commit is contained in:
parent
4837641dc8
commit
e8c528edf3
|
@ -860,9 +860,9 @@ func (a *Activity) GobDecode(data []byte) error {
|
||||||
// Equals verifies if our receiver Object is equals with the "with" Object
|
// Equals verifies if our receiver Object is equals with the "with" Object
|
||||||
func (a Activity) Equals(with Item) bool {
|
func (a Activity) Equals(with Item) bool {
|
||||||
result := true
|
result := true
|
||||||
OnActivity(with, func(w *Activity) error {
|
err := OnActivity(with, func(w *Activity) error {
|
||||||
OnObject(a, func(o *Object) error {
|
OnObject(a, func(oa *Object) error {
|
||||||
result = o.Equals(w)
|
result = oa.Equals(w)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if w.Object != nil {
|
if w.Object != nil {
|
||||||
|
@ -909,5 +909,8 @@ func (a Activity) Equals(with Item) bool {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
result = false
|
||||||
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
125
activity_test.go
125
activity_test.go
|
@ -1459,3 +1459,128 @@ func TestIntransitiveActivity_MarshalJSON(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestActivity_Equals(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
ID ID
|
||||||
|
Type ActivityVocabularyType
|
||||||
|
Name NaturalLanguageValues
|
||||||
|
Attachment Item
|
||||||
|
AttributedTo Item
|
||||||
|
Audience ItemCollection
|
||||||
|
Content NaturalLanguageValues
|
||||||
|
Context Item
|
||||||
|
MediaType MimeType
|
||||||
|
EndTime time.Time
|
||||||
|
Generator Item
|
||||||
|
Icon Item
|
||||||
|
Image Item
|
||||||
|
InReplyTo Item
|
||||||
|
Location Item
|
||||||
|
Preview Item
|
||||||
|
Published time.Time
|
||||||
|
Replies Item
|
||||||
|
StartTime time.Time
|
||||||
|
Summary NaturalLanguageValues
|
||||||
|
Tag ItemCollection
|
||||||
|
Updated time.Time
|
||||||
|
URL Item
|
||||||
|
To ItemCollection
|
||||||
|
Bto ItemCollection
|
||||||
|
CC ItemCollection
|
||||||
|
BCC ItemCollection
|
||||||
|
Duration time.Duration
|
||||||
|
Likes Item
|
||||||
|
Shares Item
|
||||||
|
Source Source
|
||||||
|
Actor Item
|
||||||
|
Target Item
|
||||||
|
Result Item
|
||||||
|
Origin Item
|
||||||
|
Instrument Item
|
||||||
|
Object Item
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
arg Item
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "equal-empty-activity",
|
||||||
|
fields: fields{},
|
||||||
|
arg: Activity{},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "equal-activity-just-id",
|
||||||
|
fields: fields{ID: "test"},
|
||||||
|
arg: Activity{ID: "test"},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "equal-activity-id",
|
||||||
|
fields: fields{ID: "test", URL: IRI("example.com")},
|
||||||
|
arg: Activity{ID: "test"},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "equal-false-with-id-and-url",
|
||||||
|
fields: fields{ID: "test"},
|
||||||
|
arg: Activity{ID: "test", URL: IRI("example.com")},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "not a valid activity",
|
||||||
|
fields: fields{ID: "http://example.com"},
|
||||||
|
arg: Link{ID: "http://example.com"},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
a := Activity{
|
||||||
|
ID: tt.fields.ID,
|
||||||
|
Type: tt.fields.Type,
|
||||||
|
Name: tt.fields.Name,
|
||||||
|
Attachment: tt.fields.Attachment,
|
||||||
|
AttributedTo: tt.fields.AttributedTo,
|
||||||
|
Audience: tt.fields.Audience,
|
||||||
|
Content: tt.fields.Content,
|
||||||
|
Context: tt.fields.Context,
|
||||||
|
MediaType: tt.fields.MediaType,
|
||||||
|
EndTime: tt.fields.EndTime,
|
||||||
|
Generator: tt.fields.Generator,
|
||||||
|
Icon: tt.fields.Icon,
|
||||||
|
Image: tt.fields.Image,
|
||||||
|
InReplyTo: tt.fields.InReplyTo,
|
||||||
|
Location: tt.fields.Location,
|
||||||
|
Preview: tt.fields.Preview,
|
||||||
|
Published: tt.fields.Published,
|
||||||
|
Replies: tt.fields.Replies,
|
||||||
|
StartTime: tt.fields.StartTime,
|
||||||
|
Summary: tt.fields.Summary,
|
||||||
|
Tag: tt.fields.Tag,
|
||||||
|
Updated: tt.fields.Updated,
|
||||||
|
URL: tt.fields.URL,
|
||||||
|
To: tt.fields.To,
|
||||||
|
Bto: tt.fields.Bto,
|
||||||
|
CC: tt.fields.CC,
|
||||||
|
BCC: tt.fields.BCC,
|
||||||
|
Duration: tt.fields.Duration,
|
||||||
|
Likes: tt.fields.Likes,
|
||||||
|
Shares: tt.fields.Shares,
|
||||||
|
Source: tt.fields.Source,
|
||||||
|
Actor: tt.fields.Actor,
|
||||||
|
Target: tt.fields.Target,
|
||||||
|
Result: tt.fields.Result,
|
||||||
|
Origin: tt.fields.Origin,
|
||||||
|
Instrument: tt.fields.Instrument,
|
||||||
|
Object: tt.fields.Object,
|
||||||
|
}
|
||||||
|
if got := a.Equals(tt.arg); got != tt.want {
|
||||||
|
t.Errorf("Equals() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
34
actor.go
34
actor.go
|
@ -516,16 +516,40 @@ func ToActor(it Item) (*Actor, error) {
|
||||||
// Equals verifies if our receiver Object is equals with the "with" Object
|
// Equals verifies if our receiver Object is equals with the "with" Object
|
||||||
func (a Actor) Equals(with Item) bool {
|
func (a Actor) Equals(with Item) bool {
|
||||||
result := true
|
result := true
|
||||||
OnActor(with, func(w *Actor) error {
|
err := OnActor(with, func(w *Actor) error {
|
||||||
OnObject(w, func(wo *Object) error {
|
OnObject(a, func(oa *Object) error {
|
||||||
if !wo.Equals(a) {
|
result = oa.Equals(w)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if w.Inbox != nil {
|
||||||
|
if !ItemsEqual(a.Inbox, w.Inbox) {
|
||||||
result = false
|
result = false
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return nil
|
}
|
||||||
})
|
if w.Outbox != nil {
|
||||||
|
if !ItemsEqual(a.Outbox, w.Outbox) {
|
||||||
|
result = false
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if w.Liked != nil {
|
||||||
|
if !ItemsEqual(a.Liked, w.Liked) {
|
||||||
|
result = false
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if w.PreferredUsername != nil {
|
||||||
|
if !a.PreferredUsername.Equals(w.PreferredUsername) {
|
||||||
|
result = false
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
result = false
|
||||||
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
132
actor_test.go
132
actor_test.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestActorNew(t *testing.T) {
|
func TestActorNew(t *testing.T) {
|
||||||
|
@ -437,3 +438,134 @@ func TestOnActor(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestActor_Equals(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
ID ID
|
||||||
|
Type ActivityVocabularyType
|
||||||
|
Name NaturalLanguageValues
|
||||||
|
Attachment Item
|
||||||
|
AttributedTo Item
|
||||||
|
Audience ItemCollection
|
||||||
|
Content NaturalLanguageValues
|
||||||
|
Context Item
|
||||||
|
MediaType MimeType
|
||||||
|
EndTime time.Time
|
||||||
|
Generator Item
|
||||||
|
Icon Item
|
||||||
|
Image Item
|
||||||
|
InReplyTo Item
|
||||||
|
Location Item
|
||||||
|
Preview Item
|
||||||
|
Published time.Time
|
||||||
|
Replies Item
|
||||||
|
StartTime time.Time
|
||||||
|
Summary NaturalLanguageValues
|
||||||
|
Tag ItemCollection
|
||||||
|
Updated time.Time
|
||||||
|
URL Item
|
||||||
|
To ItemCollection
|
||||||
|
Bto ItemCollection
|
||||||
|
CC ItemCollection
|
||||||
|
BCC ItemCollection
|
||||||
|
Duration time.Duration
|
||||||
|
Likes Item
|
||||||
|
Shares Item
|
||||||
|
Source Source
|
||||||
|
Inbox Item
|
||||||
|
Outbox Item
|
||||||
|
Following Item
|
||||||
|
Followers Item
|
||||||
|
Liked Item
|
||||||
|
PreferredUsername NaturalLanguageValues
|
||||||
|
Endpoints *Endpoints
|
||||||
|
Streams ItemCollection
|
||||||
|
PublicKey PublicKey
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
arg Item
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "equal-empty-actor",
|
||||||
|
fields: fields{},
|
||||||
|
arg: Actor{},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "equal-actor-just-id",
|
||||||
|
fields: fields{ID: "test"},
|
||||||
|
arg: Actor{ID: "test"},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "equal-actor-id",
|
||||||
|
fields: fields{ID: "test", URL: IRI("example.com")},
|
||||||
|
arg: Actor{ID: "test"},
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "equal-false-with-id-and-url",
|
||||||
|
fields: fields{ID: "test"},
|
||||||
|
arg: Actor{ID: "test", URL: IRI("example.com")},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "not a valid actor",
|
||||||
|
fields: fields{ID: "http://example.com"},
|
||||||
|
arg: Activity{ID: "http://example.com"},
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
a := Actor{
|
||||||
|
ID: tt.fields.ID,
|
||||||
|
Type: tt.fields.Type,
|
||||||
|
Name: tt.fields.Name,
|
||||||
|
Attachment: tt.fields.Attachment,
|
||||||
|
AttributedTo: tt.fields.AttributedTo,
|
||||||
|
Audience: tt.fields.Audience,
|
||||||
|
Content: tt.fields.Content,
|
||||||
|
Context: tt.fields.Context,
|
||||||
|
MediaType: tt.fields.MediaType,
|
||||||
|
EndTime: tt.fields.EndTime,
|
||||||
|
Generator: tt.fields.Generator,
|
||||||
|
Icon: tt.fields.Icon,
|
||||||
|
Image: tt.fields.Image,
|
||||||
|
InReplyTo: tt.fields.InReplyTo,
|
||||||
|
Location: tt.fields.Location,
|
||||||
|
Preview: tt.fields.Preview,
|
||||||
|
Published: tt.fields.Published,
|
||||||
|
Replies: tt.fields.Replies,
|
||||||
|
StartTime: tt.fields.StartTime,
|
||||||
|
Summary: tt.fields.Summary,
|
||||||
|
Tag: tt.fields.Tag,
|
||||||
|
Updated: tt.fields.Updated,
|
||||||
|
URL: tt.fields.URL,
|
||||||
|
To: tt.fields.To,
|
||||||
|
Bto: tt.fields.Bto,
|
||||||
|
CC: tt.fields.CC,
|
||||||
|
BCC: tt.fields.BCC,
|
||||||
|
Duration: tt.fields.Duration,
|
||||||
|
Likes: tt.fields.Likes,
|
||||||
|
Shares: tt.fields.Shares,
|
||||||
|
Source: tt.fields.Source,
|
||||||
|
Inbox: tt.fields.Inbox,
|
||||||
|
Outbox: tt.fields.Outbox,
|
||||||
|
Following: tt.fields.Following,
|
||||||
|
Followers: tt.fields.Followers,
|
||||||
|
Liked: tt.fields.Liked,
|
||||||
|
PreferredUsername: tt.fields.PreferredUsername,
|
||||||
|
Endpoints: tt.fields.Endpoints,
|
||||||
|
Streams: tt.fields.Streams,
|
||||||
|
PublicKey: tt.fields.PublicKey,
|
||||||
|
}
|
||||||
|
if got := a.Equals(tt.arg); got != tt.want {
|
||||||
|
t.Errorf("Equals() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -640,7 +640,7 @@ func (o Object) Equals(with Item) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
result := true
|
result := true
|
||||||
OnObject(with, func(w *Object) error {
|
err := OnObject(with, func(w *Object) error {
|
||||||
if len(w.Name) > 0 {
|
if len(w.Name) > 0 {
|
||||||
if !w.Name.Equals(o.Name) {
|
if !w.Name.Equals(o.Name) {
|
||||||
result = false
|
result = false
|
||||||
|
@ -809,5 +809,8 @@ func (o Object) Equals(with Item) bool {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
result = false
|
||||||
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
123
object_test.go
123
object_test.go
|
@ -926,51 +926,112 @@ func TestSource_MarshalJSON(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestObject_Equals(t *testing.T) {
|
func TestObject_Equals(t *testing.T) {
|
||||||
type args struct {
|
type fields struct {
|
||||||
with Object
|
ID ID
|
||||||
|
Type ActivityVocabularyType
|
||||||
|
Name NaturalLanguageValues
|
||||||
|
Attachment Item
|
||||||
|
AttributedTo Item
|
||||||
|
Audience ItemCollection
|
||||||
|
Content NaturalLanguageValues
|
||||||
|
Context Item
|
||||||
|
MediaType MimeType
|
||||||
|
EndTime time.Time
|
||||||
|
Generator Item
|
||||||
|
Icon Item
|
||||||
|
Image Item
|
||||||
|
InReplyTo Item
|
||||||
|
Location Item
|
||||||
|
Preview Item
|
||||||
|
Published time.Time
|
||||||
|
Replies Item
|
||||||
|
StartTime time.Time
|
||||||
|
Summary NaturalLanguageValues
|
||||||
|
Tag ItemCollection
|
||||||
|
Updated time.Time
|
||||||
|
URL Item
|
||||||
|
To ItemCollection
|
||||||
|
Bto ItemCollection
|
||||||
|
CC ItemCollection
|
||||||
|
BCC ItemCollection
|
||||||
|
Duration time.Duration
|
||||||
|
Likes Item
|
||||||
|
Shares Item
|
||||||
|
Source Source
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
o Object
|
fields fields
|
||||||
args args
|
arg Item
|
||||||
want bool
|
want bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "equal-empty-object",
|
name: "equal-empty-object",
|
||||||
o: Object{},
|
fields: fields{},
|
||||||
args: args{
|
arg: Object{},
|
||||||
with: Object{},
|
want: true,
|
||||||
},
|
|
||||||
want: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "equal-object-just-id",
|
name: "equal-object-just-id",
|
||||||
o: Object{ID: "test"},
|
fields: fields{ID: "test"},
|
||||||
args: args{
|
arg: Object{ID: "test"},
|
||||||
with: Object{ID: "test"},
|
want: true,
|
||||||
},
|
|
||||||
want: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "equal-object-id",
|
name: "equal-object-id",
|
||||||
o: Object{ID: "test", URL: IRI("example.com")},
|
fields: fields{ID: "test", URL: IRI("example.com")},
|
||||||
args: args{
|
arg: Object{ID: "test"},
|
||||||
with: Object{ID: "test"},
|
want: true,
|
||||||
},
|
|
||||||
want: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "equal-false-with-id-and-url",
|
name: "equal-false-with-id-and-url",
|
||||||
o: Object{ID: "test"},
|
fields: fields{ID: "test"},
|
||||||
args: args{
|
arg: Object{ID: "test", URL: IRI("example.com")},
|
||||||
with: Object{ID: "test", URL: IRI("example.com")},
|
want: false,
|
||||||
},
|
},
|
||||||
want: false,
|
{
|
||||||
|
name: "not a valid object",
|
||||||
|
fields: fields{ID: "http://example.com"},
|
||||||
|
arg: Link{ID: "http://example.com"},
|
||||||
|
want: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
if got := tt.o.Equals(tt.args.with); got != tt.want {
|
o := Object{
|
||||||
|
ID: tt.fields.ID,
|
||||||
|
Type: tt.fields.Type,
|
||||||
|
Name: tt.fields.Name,
|
||||||
|
Attachment: tt.fields.Attachment,
|
||||||
|
AttributedTo: tt.fields.AttributedTo,
|
||||||
|
Audience: tt.fields.Audience,
|
||||||
|
Content: tt.fields.Content,
|
||||||
|
Context: tt.fields.Context,
|
||||||
|
MediaType: tt.fields.MediaType,
|
||||||
|
EndTime: tt.fields.EndTime,
|
||||||
|
Generator: tt.fields.Generator,
|
||||||
|
Icon: tt.fields.Icon,
|
||||||
|
Image: tt.fields.Image,
|
||||||
|
InReplyTo: tt.fields.InReplyTo,
|
||||||
|
Location: tt.fields.Location,
|
||||||
|
Preview: tt.fields.Preview,
|
||||||
|
Published: tt.fields.Published,
|
||||||
|
Replies: tt.fields.Replies,
|
||||||
|
StartTime: tt.fields.StartTime,
|
||||||
|
Summary: tt.fields.Summary,
|
||||||
|
Tag: tt.fields.Tag,
|
||||||
|
Updated: tt.fields.Updated,
|
||||||
|
URL: tt.fields.URL,
|
||||||
|
To: tt.fields.To,
|
||||||
|
Bto: tt.fields.Bto,
|
||||||
|
CC: tt.fields.CC,
|
||||||
|
BCC: tt.fields.BCC,
|
||||||
|
Duration: tt.fields.Duration,
|
||||||
|
Likes: tt.fields.Likes,
|
||||||
|
Shares: tt.fields.Shares,
|
||||||
|
Source: tt.fields.Source,
|
||||||
|
}
|
||||||
|
if got := o.Equals(tt.arg); got != tt.want {
|
||||||
t.Errorf("Equals() = %v, want %v", got, tt.want)
|
t.Errorf("Equals() = %v, want %v", got, tt.want)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
Reference in a new issue