owpengram-server/internal/domain/premium_test.go

93 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package domain
import (
"testing"
"time"
)
func TestPremiumActiveAt(t *testing.T) {
now := time.Now().Unix()
cases := []struct {
name string
user User
want bool
}{
{"zero until = 非会员", User{}, false},
{"future until = 会员", User{PremiumUntil: int(now + 3600)}, true},
{"past until = 已到期", User{PremiumUntil: int(now - 1)}, false},
{"恰好 now = 已到期(边界闭区间外)", User{PremiumUntil: int(now)}, false},
{"bot 永不会员(双保险)", User{Bot: true, BotInfoVersion: 1, PremiumUntil: int(now + 3600)}, false},
}
for _, tc := range cases {
if got := tc.user.PremiumActiveAt(now); got != tc.want {
t.Errorf("%s: PremiumActiveAt = %v, want %v", tc.name, got, tc.want)
}
}
}
func TestEmojiStatusActiveAt(t *testing.T) {
now := time.Now().Unix()
premium := int(now + 3600)
cases := []struct {
name string
user User
want bool
}{
{"未设置", User{PremiumUntil: premium}, false},
{"永久状态", User{PremiumUntil: premium, EmojiStatusDocumentID: 7}, true},
{"未过期状态", User{PremiumUntil: premium, EmojiStatusDocumentID: 7, EmojiStatusUntil: int(now + 60)}, true},
{"已过期状态", User{PremiumUntil: premium, EmojiStatusDocumentID: 7, EmojiStatusUntil: int(now - 60)}, false},
{"会员到期后残值不下发", User{PremiumUntil: int(now - 1), EmojiStatusDocumentID: 7}, false},
}
for _, tc := range cases {
if got := tc.user.EmojiStatusActiveAt(now); got != tc.want {
t.Errorf("%s: EmojiStatusActiveAt = %v, want %v", tc.name, got, tc.want)
}
}
}
func TestTrimMessageReactionsToUserMaxTiers(t *testing.T) {
reactions := []MessageReaction{
{Type: MessageReactionEmoji, Emoticon: "👍"},
{Type: MessageReactionEmoji, Emoticon: "❤"},
{Type: MessageReactionEmoji, Emoticon: "🔥"},
{Type: MessageReactionEmoji, Emoticon: "🎉"},
}
// 默认档(含 0 = 旧调用方未填)裁到 1保尾部最新。
for _, max := range []int{0, -1, MaxMessageReactionsPerUser} {
got := TrimMessageReactionsToUserMax(reactions, max)
if len(got) != 1 || got[0].Emoticon != "🎉" {
t.Fatalf("default tier (max=%d) = %+v, want [🎉]", max, got)
}
}
// premium 档裁到 3保尾部最新。
got := TrimMessageReactionsToUserMax(reactions, MessageReactionsUserMax(true))
if len(got) != 3 || got[0].Emoticon != "❤" || got[2].Emoticon != "🎉" {
t.Fatalf("premium tier = %+v, want [❤ 🔥 🎉]", got)
}
// 超出 premium 档的请求值被封顶。
if got := TrimMessageReactionsToUserMax(reactions, 99); len(got) != MaxMessageReactionsPerUserPremium {
t.Fatalf("over-cap tier = %d entries, want %d", len(got), MaxMessageReactionsPerUserPremium)
}
if MessageReactionsUserMax(false) != MaxMessageReactionsPerUser {
t.Fatalf("MessageReactionsUserMax(false) = %d", MessageReactionsUserMax(false))
}
}
func TestPinnedDialogsLimitTiers(t *testing.T) {
cases := []struct {
folderID int
premium bool
want int
}{
{DialogMainFolderID, false, MaxPinnedDialogsMainFolder},
{DialogMainFolderID, true, MaxPinnedDialogsMainFolderPremium},
{DialogArchiveFolderID, false, MaxPinnedDialogsArchiveFolder},
{DialogArchiveFolderID, true, MaxPinnedDialogsArchiveFolderPremium},
}
for _, tc := range cases {
if got := PinnedDialogsLimit(tc.folderID, tc.premium); got != tc.want {
t.Errorf("PinnedDialogsLimit(%d, %v) = %d, want %d", tc.folderID, tc.premium, got, tc.want)
}
}
}