93 lines
3.9 KiB
Go
93 lines
3.9 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
func TestPremiumBoostStatusDefaultPolicyIsBoundedLinear(t *testing.T) {
|
|
peer := Peer{Type: PeerTypeChannel, ID: 100}
|
|
|
|
empty := PremiumBoostStatusForCount(peer, 0, nil)
|
|
if empty.Level != 0 || empty.CurrentLevelBoosts != 0 || empty.Boosts != 0 || empty.NextLevelBoosts != 1 || !empty.HasNextLevelBoosts {
|
|
t.Fatalf("empty status = %+v, want level 0 next 1", empty)
|
|
}
|
|
|
|
one := PremiumBoostStatusForCount(peer, 1, nil)
|
|
if one.Level != 1 || one.CurrentLevelBoosts != 1 || one.Boosts != 1 || one.NextLevelBoosts != 2 || !one.HasNextLevelBoosts {
|
|
t.Fatalf("one boost status = %+v, want level 1 next 2", one)
|
|
}
|
|
|
|
max := PremiumBoostStatusForCount(peer, MaxDefaultPremiumBoostLevel, nil)
|
|
if max.Level != MaxDefaultPremiumBoostLevel || max.CurrentLevelBoosts != MaxDefaultPremiumBoostLevel || max.HasNextLevelBoosts {
|
|
t.Fatalf("max status = %+v, want capped max level without next", max)
|
|
}
|
|
|
|
over := PremiumBoostStatusForCount(peer, MaxDefaultPremiumBoostLevel+50, nil)
|
|
if over.Level != MaxDefaultPremiumBoostLevel || over.CurrentLevelBoosts != MaxDefaultPremiumBoostLevel || over.HasNextLevelBoosts {
|
|
t.Fatalf("over max status = %+v, want capped max level without next", over)
|
|
}
|
|
}
|
|
|
|
func TestPremiumBoostStatusCustomPolicy(t *testing.T) {
|
|
policy := NewPremiumBoostLevelPolicy([]int{6, 1, 3, 3, 0})
|
|
peer := Peer{Type: PeerTypeChannel, ID: 100}
|
|
|
|
status := PremiumBoostStatusForPolicy(peer, 4, nil, policy)
|
|
if status.Level != 2 || status.CurrentLevelBoosts != 3 || status.NextLevelBoosts != 6 || !status.HasNextLevelBoosts {
|
|
t.Fatalf("custom policy status = %+v, want level 2 current 3 next 6", status)
|
|
}
|
|
|
|
status = PremiumBoostStatusForPolicy(peer, 6, nil, policy)
|
|
if status.Level != 3 || status.CurrentLevelBoosts != 6 || status.HasNextLevelBoosts {
|
|
t.Fatalf("custom max status = %+v, want level 3 without next", status)
|
|
}
|
|
}
|
|
|
|
func TestApplyPremiumBoostSlotLifecycle(t *testing.T) {
|
|
peer := Peer{Type: PeerTypeChannel, ID: 100}
|
|
slot, changed, err := ApplyPremiumBoostSlot(PremiumBoostSlot{}, 10, DefaultPremiumBoostSlotID, peer, 1000, 2000, 0)
|
|
if err != nil || !changed {
|
|
t.Fatalf("apply free slot changed=%v err=%v", changed, err)
|
|
}
|
|
if slot.UserID != 10 || slot.Slot != DefaultPremiumBoostSlotID || slot.Peer != peer || slot.Date != 1000 || slot.Expires != 2000 || slot.Multiplier != 1 {
|
|
t.Fatalf("applied slot = %+v", slot)
|
|
}
|
|
|
|
_, changed, err = ApplyPremiumBoostSlot(slot, 10, DefaultPremiumBoostSlotID, peer, 1001, 2000, 0)
|
|
if !errors.Is(err, ErrBoostNotModified) || changed {
|
|
t.Fatalf("reapply same peer changed=%v err=%v, want ErrBoostNotModified", changed, err)
|
|
}
|
|
|
|
extended, changed, err := ApplyPremiumBoostSlot(slot, 10, DefaultPremiumBoostSlotID, peer, 1002, 3000, 0)
|
|
if err != nil || !changed || extended.Expires != 3000 || extended.Date != slot.Date {
|
|
t.Fatalf("extend same peer slot=%+v changed=%v err=%v", extended, changed, err)
|
|
}
|
|
|
|
shortened, changed, err := ApplyPremiumBoostSlot(extended, 10, DefaultPremiumBoostSlotID, peer, 1003, 2500, 0)
|
|
if err != nil || !changed || shortened.Expires != 2500 || shortened.Date != slot.Date {
|
|
t.Fatalf("refresh same peer expiry slot=%+v changed=%v err=%v", shortened, changed, err)
|
|
}
|
|
}
|
|
|
|
func TestApplyPremiumBoostSlotCooldown(t *testing.T) {
|
|
first := Peer{Type: PeerTypeChannel, ID: 100}
|
|
second := Peer{Type: PeerTypeChannel, ID: 200}
|
|
slot := PremiumBoostSlot{
|
|
UserID: 10,
|
|
Slot: DefaultPremiumBoostSlotID,
|
|
Peer: first,
|
|
Date: 1000,
|
|
Expires: 3000,
|
|
CooldownUntil: 1500,
|
|
Multiplier: 1,
|
|
}
|
|
|
|
_, changed, err := ApplyPremiumBoostSlot(slot, 10, DefaultPremiumBoostSlotID, second, 1200, 3000, 0)
|
|
if changed || err == nil {
|
|
t.Fatalf("cooldown apply changed=%v err=%v, want flood wait", changed, err)
|
|
}
|
|
if seconds, ok := PremiumBoostFloodWaitSeconds(err); !ok || seconds != 300 {
|
|
t.Fatalf("cooldown err = %v seconds=%d ok=%v, want 300", err, seconds, ok)
|
|
}
|
|
}
|