88 lines
3.4 KiB
Go
88 lines
3.4 KiB
Go
package store
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"telesrv/internal/domain"
|
|
)
|
|
|
|
func TestPrivateSendSnapshotRejectsInvalidExternalReply(t *testing.T) {
|
|
message := domain.Message{ID: 7, UID: 8, RandomID: 9, OwnerUserID: 10, Pts: 11,
|
|
ReplyTo: &domain.MessageReply{MessageID: 1, External: &domain.MessageReplyExternal{
|
|
From: domain.MessageForward{From: domain.Peer{Type: domain.PeerTypeUser, ID: 10}, Date: 12}, Text: "source",
|
|
}},
|
|
}
|
|
raw, err := EncodePrivateSendSnapshot(message)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got, err := DecodePrivateSendSnapshot(raw); err != nil || got.ReplyTo.External.Text != "source" {
|
|
t.Fatalf("valid external replay: %+v %v", got, err)
|
|
}
|
|
for _, mutation := range [][2][]byte{
|
|
{[]byte(`"Date":12`), []byte(`"Date":0`)},
|
|
{[]byte(`"text":"source"`), []byte(`"text":"source","unexpected":true`)},
|
|
} {
|
|
corrupt := bytes.Replace(raw, mutation[0], mutation[1], 1)
|
|
if bytes.Equal(corrupt, raw) {
|
|
t.Fatalf("mutation did not match %s", mutation[0])
|
|
}
|
|
if _, err := DecodePrivateSendSnapshot(corrupt); err == nil {
|
|
t.Fatal("corrupt external receipt accepted")
|
|
}
|
|
}
|
|
message.ReplyTo.External.From.Date = 0
|
|
if _, err := EncodePrivateSendSnapshot(message); err == nil {
|
|
t.Fatal("invalid external receipt written")
|
|
}
|
|
}
|
|
|
|
func TestPrivateSendSnapshotIsDeepAndVersioned(t *testing.T) {
|
|
message := domain.Message{
|
|
ID: 7, UID: 8, RandomID: 9, OwnerUserID: 10,
|
|
Peer: domain.Peer{Type: domain.PeerTypeUser, ID: 11},
|
|
From: domain.Peer{Type: domain.PeerTypeUser, ID: 10},
|
|
Date: 12, Out: true, Body: "first", Pts: 13,
|
|
Entities: []domain.MessageEntity{{Type: domain.MessageEntityBold, Length: 5}},
|
|
Media: &domain.MessageMedia{Kind: domain.MessageMediaKindContact, Contact: &domain.MessageContact{PhoneNumber: "+1", FirstName: "Alice"}},
|
|
}
|
|
raw, err := EncodePrivateSendSnapshot(message)
|
|
if err != nil {
|
|
t.Fatalf("encode private snapshot: %v", err)
|
|
}
|
|
message.Body = "mutated"
|
|
message.Entities[0].Length = 1
|
|
message.Media.Contact.FirstName = "Mutated"
|
|
decoded, err := DecodePrivateSendSnapshot(raw)
|
|
if err != nil {
|
|
t.Fatalf("decode private snapshot: %v", err)
|
|
}
|
|
if decoded.Body != "first" || decoded.Entities[0].Length != 5 || decoded.Media.Contact.FirstName != "Alice" {
|
|
t.Fatalf("decoded private snapshot = %+v, want immutable nested graph", decoded)
|
|
}
|
|
decoded.Media.Contact.FirstName = "Second mutation"
|
|
again, err := DecodePrivateSendSnapshot(raw)
|
|
if err != nil || again.Media.Contact.FirstName != "Alice" {
|
|
t.Fatalf("second decode = %+v err=%v, want fresh graph", again, err)
|
|
}
|
|
}
|
|
|
|
func TestChannelSendSnapshotRejectsEmptyLegacyValue(t *testing.T) {
|
|
if _, err := DecodeChannelSendSnapshot([]byte(`{}`)); err == nil {
|
|
t.Fatal("empty legacy channel snapshot decoded successfully")
|
|
}
|
|
message := domain.ChannelMessage{
|
|
ChannelID: 21, ID: 22, RandomID: 23, SenderUserID: 24,
|
|
From: domain.Peer{Type: domain.PeerTypeUser, ID: 24},
|
|
Date: 25, Body: "channel", Pts: 26,
|
|
}
|
|
raw, err := EncodeChannelSendSnapshot(message)
|
|
if err != nil {
|
|
t.Fatalf("encode channel snapshot: %v", err)
|
|
}
|
|
decoded, err := DecodeChannelSendSnapshot(raw)
|
|
if err != nil || decoded.ChannelID != message.ChannelID || decoded.ID != message.ID || decoded.RandomID != message.RandomID || decoded.SenderUserID != message.SenderUserID || decoded.Body != message.Body || decoded.Pts != message.Pts {
|
|
t.Fatalf("decoded channel snapshot = %+v err=%v, want %+v", decoded, err, message)
|
|
}
|
|
}
|