owpengram-server/internal/store/postgres/channel_member_bot_integration_test.go

173 lines
6.2 KiB
Go

package postgres
import (
"context"
"testing"
"telesrv/internal/domain"
)
func TestChannelStoreListActiveChannelBotMembers(t *testing.T) {
pool := testPool(t)
ctx := context.Background()
suffix := randomSuffix(t)
users := NewUserStore(pool)
bots := NewBotStore(pool)
channels := NewChannelStore(pool)
owner, err := users.Create(ctx, domain.User{AccessHash: 8901, Phone: "+1888" + suffix + "01", FirstName: "BotOwner"})
if err != nil {
t.Fatalf("create owner: %v", err)
}
friend, err := users.Create(ctx, domain.User{AccessHash: 8902, Phone: "+1888" + suffix + "02", FirstName: "Human"})
if err != nil {
t.Fatalf("create friend: %v", err)
}
bot, _, err := bots.CreateBotAccount(ctx,
domain.User{AccessHash: 8903, FirstName: "MemberBot", Username: "member_" + suffix + "_bot"},
domain.BotProfile{OwnerUserID: owner.ID, TokenSecret: "secret_" + suffix},
)
if err != nil {
t.Fatalf("create bot: %v", err)
}
var channelID int64
t.Cleanup(func() {
if channelID != 0 {
_, _ = pool.Exec(ctx, "DELETE FROM channels WHERE id = $1", channelID)
}
_, _ = pool.Exec(ctx, "DELETE FROM bots WHERE bot_user_id = $1 OR owner_user_id = $2", bot.ID, owner.ID)
_, _ = pool.Exec(ctx, "DELETE FROM users WHERE id = ANY($1::bigint[])", []int64{owner.ID, friend.ID, bot.ID})
})
created, err := channels.CreateChannel(ctx, domain.CreateChannelRequest{
CreatorUserID: owner.ID,
Title: "Bot Members " + suffix,
Megagroup: true,
MemberUserIDs: []int64{friend.ID, bot.ID},
Date: 1700008900,
})
if err != nil {
t.Fatalf("create channel: %v", err)
}
channelID = created.Channel.ID
list, err := channels.ListActiveChannelBotMembers(ctx, owner.ID, channelID, 0, 20)
if err != nil {
t.Fatalf("list active bot members: %v", err)
}
if list.Count != 1 || len(list.Participants) != 1 || list.Participants[0].UserID != bot.ID {
t.Fatalf("bot members = %+v, want only bot %d", list, bot.ID)
}
if _, err := channels.SetParticipantsHidden(ctx, owner.ID, channelID, true); err != nil {
t.Fatalf("hide participants: %v", err)
}
hidden, err := channels.ListActiveChannelBotMembers(ctx, friend.ID, channelID, 0, 20)
if err != nil {
t.Fatalf("list hidden bot members as ordinary member: %v", err)
}
if hidden.Count != 0 || len(hidden.Participants) != 0 {
t.Fatalf("hidden bot members = %+v, want empty for ordinary member", hidden)
}
internalIDs, err := channels.ListActiveChannelBotMemberIDs(ctx, friend.ID, channelID, 20)
if err != nil {
t.Fatalf("list hidden bot member ids as ordinary member: %v", err)
}
if len(internalIDs) != 1 || internalIDs[0] != bot.ID {
t.Fatalf("internal hidden bot ids = %+v, want bot %d", internalIDs, bot.ID)
}
ownerVisible, err := channels.ListActiveChannelBotMembers(ctx, owner.ID, channelID, 0, 20)
if err != nil {
t.Fatalf("list hidden bot members as owner: %v", err)
}
if ownerVisible.Count != 1 || len(ownerVisible.Participants) != 1 || ownerVisible.Participants[0].UserID != bot.ID {
t.Fatalf("owner visible bot members = %+v, want bot %d", ownerVisible, bot.ID)
}
}
func TestChannelStoreGetParticipantsHidesAnonymousAdminFromRegularMember(t *testing.T) {
pool := testPool(t)
ctx := context.Background()
suffix := randomSuffix(t)
users := NewUserStore(pool)
channels := NewChannelStore(pool)
owner, err := users.Create(ctx, domain.User{AccessHash: 8911, Phone: "+1889" + suffix + "01", FirstName: "Owner"})
if err != nil {
t.Fatalf("create owner: %v", err)
}
anonymousAdmin, err := users.Create(ctx, domain.User{AccessHash: 8912, Phone: "+1889" + suffix + "02", FirstName: "Hidden"})
if err != nil {
t.Fatalf("create anonymous admin: %v", err)
}
regular, err := users.Create(ctx, domain.User{AccessHash: 8913, Phone: "+1889" + suffix + "03", FirstName: "Regular"})
if err != nil {
t.Fatalf("create regular: %v", err)
}
var channelID int64
t.Cleanup(func() {
if channelID != 0 {
_, _ = pool.Exec(ctx, "DELETE FROM channels WHERE id = $1", channelID)
}
_, _ = pool.Exec(ctx, "DELETE FROM users WHERE id = ANY($1::bigint[])", []int64{owner.ID, anonymousAdmin.ID, regular.ID})
})
created, err := channels.CreateChannel(ctx, domain.CreateChannelRequest{
CreatorUserID: owner.ID,
Title: "Anonymous Admin " + suffix,
Megagroup: true,
MemberUserIDs: []int64{anonymousAdmin.ID, regular.ID},
Date: 1700008910,
})
if err != nil {
t.Fatalf("create channel: %v", err)
}
channelID = created.Channel.ID
if _, err := channels.EditChannelAdmin(ctx, domain.EditChannelAdminRequest{
UserID: owner.ID,
ChannelID: channelID,
MemberID: anonymousAdmin.ID,
AdminRights: domain.ChannelAdminRights{
Anonymous: true,
ChangeInfo: true,
},
Date: 1700008911,
}); err != nil {
t.Fatalf("edit anonymous admin: %v", err)
}
recent, err := channels.GetParticipants(ctx, regular.ID, channelID, domain.ChannelParticipantsFilter{Kind: domain.ChannelParticipantsRecent}, 0, 10)
if err != nil {
t.Fatalf("regular recent participants: %v", err)
}
if postgresParticipantListHasUser(recent.Participants, anonymousAdmin.ID) || recent.Count != 2 {
t.Fatalf("regular recent participants = %+v count=%d, want anonymous admin hidden and visible count 2", recent.Participants, recent.Count)
}
admins, err := channels.GetParticipants(ctx, regular.ID, channelID, domain.ChannelParticipantsFilter{Kind: domain.ChannelParticipantsAdmins}, 0, 10)
if err != nil {
t.Fatalf("regular admin participants: %v", err)
}
if postgresParticipantListHasUser(admins.Participants, anonymousAdmin.ID) || len(admins.Participants) != 1 || admins.Participants[0].UserID != owner.ID {
t.Fatalf("regular admins = %+v, want only creator visible", admins.Participants)
}
ownerAdmins, err := channels.GetParticipants(ctx, owner.ID, channelID, domain.ChannelParticipantsFilter{Kind: domain.ChannelParticipantsAdmins}, 0, 10)
if err != nil {
t.Fatalf("owner admin participants: %v", err)
}
if !postgresParticipantListHasUser(ownerAdmins.Participants, anonymousAdmin.ID) {
t.Fatalf("owner admins = %+v, want anonymous admin visible to admins", ownerAdmins.Participants)
}
}
func postgresParticipantListHasUser(participants []domain.ChannelMember, userID int64) bool {
for _, participant := range participants {
if participant.UserID == userID {
return true
}
}
return false
}