feat: 积分流水互转合并展示,并优化个人主页与经济看板

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-18 02:37:12 +08:00
parent b3a4b8bb03
commit fa713bfc3f
9 changed files with 1098 additions and 230 deletions

View File

@@ -0,0 +1,75 @@
package service
import (
"testing"
"github.com/freefire/jiang13-bbs/model"
)
func TestComplementaryLedgerRef(t *testing.T) {
if got := complementaryLedgerRef(model.PointReasonUnlockPost, "post"); got != "post_earn" {
t.Fatalf("unlock debit: got %q", got)
}
if got := complementaryLedgerRef(model.PointReasonUnlockPost, "post_earn"); got != "post" {
t.Fatalf("unlock credit: got %q", got)
}
if got := complementaryLedgerRef(model.PointReasonDownloadFile, "attachment"); got != "attachment_earn" {
t.Fatalf("download debit: got %q", got)
}
if got := complementaryLedgerRef(model.PointReasonCheckin, "checkin"); got != "" {
t.Fatalf("checkin should not pair, got %q", got)
}
}
func TestPairLedgerIndicesMergesUnlock(t *testing.T) {
rows := []model.PointLedger{
{ID: 4, UserID: 2, Delta: 10, Reason: model.PointReasonUnlockPost, RefType: "post_earn", RefID: 9},
{ID: 3, UserID: 1, Delta: -10, Reason: model.PointReasonUnlockPost, RefType: "post", RefID: 9},
{ID: 2, UserID: 3, Delta: 5, Reason: model.PointReasonCheckin, RefType: "checkin", RefID: 1},
}
pairs := pairLedgerIndices(rows)
if len(pairs) != 2 {
t.Fatalf("pairs=%d want 2: %#v", len(pairs), pairs)
}
if pairs[0] != [2]int{0, 1} {
t.Fatalf("first pair=%v want [0 1]", pairs[0])
}
if pairs[1] != [2]int{2, -1} {
t.Fatalf("checkin pair=%v want [2 -1]", pairs[1])
}
}
func TestPairLedgerIndicesNearestSamePost(t *testing.T) {
rows := []model.PointLedger{
{ID: 10, UserID: 2, Delta: 8, Reason: model.PointReasonUnlockPost, RefType: "post_earn", RefID: 1},
{ID: 9, UserID: 1, Delta: -8, Reason: model.PointReasonUnlockPost, RefType: "post", RefID: 1},
{ID: 8, UserID: 4, Delta: 8, Reason: model.PointReasonUnlockPost, RefType: "post_earn", RefID: 1},
{ID: 7, UserID: 3, Delta: -8, Reason: model.PointReasonUnlockPost, RefType: "post", RefID: 1},
}
pairs := pairLedgerIndices(rows)
if len(pairs) != 2 {
t.Fatalf("pairs=%d want 2: %#v", len(pairs), pairs)
}
if pairs[0] != [2]int{0, 1} || pairs[1] != [2]int{2, 3} {
t.Fatalf("pairs=%v", pairs)
}
from, to := transferEnds(rows[0], rows[1])
if from != 1 || to != 2 {
t.Fatalf("flow=%d→%d want 1→2", from, to)
}
}
func TestMergePairedLedgerKeepsNewer(t *testing.T) {
a := model.PointLedger{ID: 4, UserID: 2, Delta: 10, Note: "正文解锁收益", Reason: model.PointReasonUnlockPost}
b := model.PointLedger{ID: 3, UserID: 1, Delta: -10, Note: "解锁帖子:长标题", Reason: model.PointReasonUnlockPost}
got := mergePairedLedger(a, b)
if got.ID != 4 {
t.Fatalf("id=%d want 4", got.ID)
}
if got.Note != "解锁帖子:长标题" {
t.Fatalf("note=%q", got.Note)
}
if got.Delta != 10 {
t.Fatalf("delta=%d want 10", got.Delta)
}
}