51 lines
1.9 KiB
Go
51 lines
1.9 KiB
Go
package memory
|
|
|
|
import (
|
|
"reflect"
|
|
"telesrv/internal/domain"
|
|
"testing"
|
|
)
|
|
|
|
func TestMessageSearchSenderAndCountFilters(t *testing.T) {
|
|
peer := domain.Peer{Type: domain.PeerTypeUser, ID: 22}
|
|
var messages []domain.Message
|
|
for i := 1; i <= 6; i++ {
|
|
sender := int64(11)
|
|
if i%2 == 0 {
|
|
sender = 22
|
|
}
|
|
messages = append(messages, domain.Message{ID: i, OwnerUserID: 11, Peer: peer, From: domain.Peer{Type: domain.PeerTypeUser, ID: sender}, Body: "count needle", Date: 100 + i, Pinned: i == 3})
|
|
}
|
|
for _, tt := range []struct {
|
|
name string
|
|
f domain.MessageFilter
|
|
ids []int
|
|
count int
|
|
}{
|
|
{"sender", domain.MessageFilter{SenderUserID: 11, Limit: 10}, []int{5, 3, 1}, 3},
|
|
{"sender-around", domain.MessageFilter{SenderUserID: 11, OffsetID: 3, AddOffset: -1, Limit: 3}, []int{3, 1}, 3},
|
|
{"count-ignores-page", domain.MessageFilter{SenderUserID: 11, CountOnly: true, OffsetID: 1, AddOffset: 100}, nil, 3},
|
|
{"count-intersection", domain.MessageFilter{SenderUserID: 11, CountOnly: true, MinDate: 101, MaxDate: 106, MinID: 1, MaxID: 5}, nil, 1},
|
|
{"count-pinned", domain.MessageFilter{SenderUserID: 11, CountOnly: true, PinnedOnly: true}, nil, 1},
|
|
{"count-pinned-other", domain.MessageFilter{SenderUserID: 22, CountOnly: true, PinnedOnly: true}, nil, 0},
|
|
{"count-peer-isolation", domain.MessageFilter{CountOnly: true, RestrictPeerIDs: true, PeerIDs: []int64{33}}, nil, 0},
|
|
} {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
f := tt.f
|
|
f.HasPeer = true
|
|
f.Peer = peer
|
|
f.Query = "needle"
|
|
got := filterMessageList(cloneMessages(messages), f)
|
|
var ids []int
|
|
for _, m := range got.Messages {
|
|
ids = append(ids, m.ID)
|
|
}
|
|
if !reflect.DeepEqual(ids, tt.ids) || got.Count != tt.count {
|
|
t.Fatalf("ids=%v count=%d want %v/%d", ids, got.Count, tt.ids, tt.count)
|
|
}
|
|
if f.CountOnly && len(got.Users) > 0 {
|
|
t.Fatal("count projected users")
|
|
}
|
|
})
|
|
}
|
|
}
|