mirror of
https://github.com/hoernschen/dendrite.git
synced 2024-12-27 07:28:27 +00:00
Fix m.receipt
s causing notifications (#2893)
Fixes https://github.com/matrix-org/dendrite/issues/2353
This commit is contained in:
parent
1990c154e9
commit
f8d1dc521d
3 changed files with 108 additions and 2 deletions
|
@ -87,8 +87,7 @@ func (p *ReceiptStreamProvider) IncrementalSync(
|
||||||
}
|
}
|
||||||
|
|
||||||
ev := gomatrixserverlib.ClientEvent{
|
ev := gomatrixserverlib.ClientEvent{
|
||||||
Type: gomatrixserverlib.MReceipt,
|
Type: gomatrixserverlib.MReceipt,
|
||||||
RoomID: roomID,
|
|
||||||
}
|
}
|
||||||
content := make(map[string]ReceiptMRead)
|
content := make(map[string]ReceiptMRead)
|
||||||
for _, receipt := range receipts {
|
for _, receipt := range receipts {
|
||||||
|
|
|
@ -480,6 +480,13 @@ func (jr JoinResponse) MarshalJSON() ([]byte, error) {
|
||||||
if jr.Ephemeral != nil && len(jr.Ephemeral.Events) == 0 {
|
if jr.Ephemeral != nil && len(jr.Ephemeral.Events) == 0 {
|
||||||
a.Ephemeral = nil
|
a.Ephemeral = nil
|
||||||
}
|
}
|
||||||
|
if jr.Ephemeral != nil {
|
||||||
|
// Remove the room_id from EDUs, as this seems to cause Element Web
|
||||||
|
// to trigger notifications - https://github.com/vector-im/element-web/issues/17263
|
||||||
|
for i := range jr.Ephemeral.Events {
|
||||||
|
jr.Ephemeral.Events[i].RoomID = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
if jr.AccountData != nil && len(jr.AccountData.Events) == 0 {
|
if jr.AccountData != nil && len(jr.AccountData.Events) == 0 {
|
||||||
a.AccountData = nil
|
a.AccountData = nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
@ -63,3 +64,102 @@ func TestNewInviteResponse(t *testing.T) {
|
||||||
t.Fatalf("Invite response didn't contain correct info")
|
t.Fatalf("Invite response didn't contain correct info")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestJoinResponse_MarshalJSON(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
Summary *Summary
|
||||||
|
State *ClientEvents
|
||||||
|
Timeline *Timeline
|
||||||
|
Ephemeral *ClientEvents
|
||||||
|
AccountData *ClientEvents
|
||||||
|
UnreadNotifications *UnreadNotifications
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
want []byte
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty state is removed",
|
||||||
|
fields: fields{
|
||||||
|
State: &ClientEvents{},
|
||||||
|
},
|
||||||
|
want: []byte("{}"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty accountdata is removed",
|
||||||
|
fields: fields{
|
||||||
|
AccountData: &ClientEvents{},
|
||||||
|
},
|
||||||
|
want: []byte("{}"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty ephemeral is removed",
|
||||||
|
fields: fields{
|
||||||
|
Ephemeral: &ClientEvents{},
|
||||||
|
},
|
||||||
|
want: []byte("{}"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty timeline is removed",
|
||||||
|
fields: fields{
|
||||||
|
Timeline: &Timeline{},
|
||||||
|
},
|
||||||
|
want: []byte("{}"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty summary is removed",
|
||||||
|
fields: fields{
|
||||||
|
Summary: &Summary{},
|
||||||
|
},
|
||||||
|
want: []byte("{}"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "unread notifications are removed, if everything else is empty",
|
||||||
|
fields: fields{
|
||||||
|
UnreadNotifications: &UnreadNotifications{},
|
||||||
|
},
|
||||||
|
want: []byte("{}"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "unread notifications are NOT removed, if state is set",
|
||||||
|
fields: fields{
|
||||||
|
State: &ClientEvents{Events: []gomatrixserverlib.ClientEvent{{Content: []byte("{}")}}},
|
||||||
|
UnreadNotifications: &UnreadNotifications{NotificationCount: 1},
|
||||||
|
},
|
||||||
|
want: []byte(`{"state":{"events":[{"content":{},"type":""}]},"unread_notifications":{"highlight_count":0,"notification_count":1}}`),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "roomID is removed from EDUs",
|
||||||
|
fields: fields{
|
||||||
|
Ephemeral: &ClientEvents{
|
||||||
|
Events: []gomatrixserverlib.ClientEvent{
|
||||||
|
{RoomID: "!someRandomRoomID:test", Content: []byte("{}")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: []byte(`{"ephemeral":{"events":[{"content":{},"type":""}]}}`),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
jr := JoinResponse{
|
||||||
|
Summary: tt.fields.Summary,
|
||||||
|
State: tt.fields.State,
|
||||||
|
Timeline: tt.fields.Timeline,
|
||||||
|
Ephemeral: tt.fields.Ephemeral,
|
||||||
|
AccountData: tt.fields.AccountData,
|
||||||
|
UnreadNotifications: tt.fields.UnreadNotifications,
|
||||||
|
}
|
||||||
|
got, err := jr.MarshalJSON()
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("MarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("MarshalJSON() got = %v, want %v", string(got), string(tt.want))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue