修复(#126): 修复家庭组邀请记录漏查验收分支
Build docker and publish / build (20.15.1) (push) Failing after 20m3s
Build docker and publish / build (20.15.1) (pull_request) Failing after 21m10s

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
2026-05-29 20:35:37 -07:00
parent e17dc4a273
commit e5d6539d79
4 changed files with 287 additions and 44 deletions
@@ -20,16 +20,14 @@ func TestGetInviteRecordsInviter(t *testing.T) {
svcCtx, mock, cleanup := newInviteRecordsTestSvc(t)
defer cleanup()
mock.ExpectQuery("count(*)").
WithArgs(34, int64(100), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(1))
expectNoInviteRecordsFamily(t, mock, 100)
mock.ExpectQuery("SELECT id, object_id, content").
WithArgs(34, int64(100), "邀请赠送", 10).
WithArgs(34, int64(100), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"id", "object_id", "content", "created_at"}).
AddRow(1, 100, `{"order_no":"order-1","amount":7,"remark":"邀请赠送"}`, 1779934580000))
mock.ExpectQuery("SELECT order_no, user_id FROM `order`").
mock.ExpectQuery("SELECT `order`.order_no, `order`.user_id, `order`.subscription_user_id, invitee.referer_id FROM `order`").
WithArgs("order-1").
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id"}).AddRow("order-1", 200))
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id", "subscription_user_id", "referer_id"}).AddRow("order-1", 200, 200, 100))
resp, err := NewGetInviteRecordsLogic(inviteRecordsContext(100, 0), svcCtx).GetInviteRecords(&types.GetInviteRecordsRequest{Page: 1, Size: 10})
if err != nil {
@@ -49,16 +47,14 @@ func TestGetInviteRecordsInvitee(t *testing.T) {
svcCtx, mock, cleanup := newInviteRecordsTestSvc(t)
defer cleanup()
mock.ExpectQuery("count(*)").
WithArgs(34, int64(200), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(1))
expectNoInviteRecordsFamily(t, mock, 200)
mock.ExpectQuery("SELECT id, object_id, content").
WithArgs(34, int64(200), "邀请赠送", 10).
WithArgs(34, int64(200), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"id", "object_id", "content", "created_at"}).
AddRow(2, 200, `{"order_no":"order-2","amount":7,"remark":"邀请赠送"}`, 1779934590000))
mock.ExpectQuery("SELECT order_no, user_id FROM `order`").
mock.ExpectQuery("SELECT `order`.order_no, `order`.user_id, `order`.subscription_user_id, invitee.referer_id FROM `order`").
WithArgs("order-2").
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id"}).AddRow("order-2", 200))
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id", "subscription_user_id", "referer_id"}).AddRow("order-2", 200, 200, 100))
resp, err := NewGetInviteRecordsLogic(inviteRecordsContext(200, 100), svcCtx).GetInviteRecords(&types.GetInviteRecordsRequest{Page: 1, Size: 10})
if err != nil {
@@ -78,16 +74,14 @@ func TestGetInviteRecordsMissingOrderReturnsDirtyRecord(t *testing.T) {
svcCtx, mock, cleanup := newInviteRecordsTestSvc(t)
defer cleanup()
mock.ExpectQuery("count(*)").
WithArgs(34, int64(100), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(1))
expectNoInviteRecordsFamily(t, mock, 100)
mock.ExpectQuery("SELECT id, object_id, content").
WithArgs(34, int64(100), "邀请赠送", 10).
WithArgs(34, int64(100), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"id", "object_id", "content", "created_at"}).
AddRow(3, 100, `{"order_no":"missing-order","amount":7,"remark":"邀请赠送"}`, 1779934600000))
mock.ExpectQuery("SELECT order_no, user_id FROM `order`").
mock.ExpectQuery("SELECT `order`.order_no, `order`.user_id, `order`.subscription_user_id, invitee.referer_id FROM `order`").
WithArgs("missing-order").
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id"}))
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id", "subscription_user_id", "referer_id"}))
resp, err := NewGetInviteRecordsLogic(inviteRecordsContext(100, 0), svcCtx).GetInviteRecords(&types.GetInviteRecordsRequest{Page: 1, Size: 10})
if err != nil {
@@ -102,6 +96,62 @@ func TestGetInviteRecordsMissingOrderReturnsDirtyRecord(t *testing.T) {
assertInviteRecordsExpectations(t, mock)
}
func TestGetInviteRecordsFamilyMemberSeesOwnerGiftLog(t *testing.T) {
svcCtx, mock, cleanup := newInviteRecordsTestSvc(t)
defer cleanup()
expectInviteRecordsFamilyMember(t, mock, 200, 900)
mock.ExpectQuery("SELECT id, object_id, content").
WithArgs(34, int64(200), int64(900), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"id", "object_id", "content", "created_at"}).
AddRow(4, 900, `{"order_no":"family-order","amount":7,"remark":"邀请赠送"}`, 1779934610000))
mock.ExpectQuery("SELECT `order`.order_no, `order`.user_id, `order`.subscription_user_id, invitee.referer_id FROM `order`").
WithArgs("family-order").
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id", "subscription_user_id", "referer_id"}).AddRow("family-order", 200, 900, 100))
resp, err := NewGetInviteRecordsLogic(inviteRecordsContext(200, 100), svcCtx).GetInviteRecords(&types.GetInviteRecordsRequest{Page: 1, Size: 10})
if err != nil {
t.Fatalf("GetInviteRecords returned error: %v", err)
}
assertInviteRecordResponse(t, resp, types.InviteRecord{
Role: inviteRecordRoleInvitee,
PeerHash: hash.InvitePeerHash(100),
GiftDays: 7,
OrderNo: "family-order",
CreatedAt: 1779934610000,
})
assertInviteRecordsExpectations(t, mock)
}
func TestGetInviteRecordsOwnerDoesNotSeeMemberGiftLog(t *testing.T) {
svcCtx, mock, cleanup := newInviteRecordsTestSvc(t)
defer cleanup()
expectInviteRecordsFamilyOwner(t, mock, 900)
mock.ExpectQuery("SELECT id, object_id, content").
WithArgs(34, int64(900), "邀请赠送").
WillReturnRows(sqlmock.NewRows([]string{"id", "object_id", "content", "created_at"}).
AddRow(5, 900, `{"order_no":"member-order","amount":7,"remark":"邀请赠送"}`, 1779934620000))
mock.ExpectQuery("SELECT `order`.order_no, `order`.user_id, `order`.subscription_user_id, invitee.referer_id FROM `order`").
WithArgs("member-order").
WillReturnRows(sqlmock.NewRows([]string{"order_no", "user_id", "subscription_user_id", "referer_id"}).AddRow("member-order", 200, 900, 100))
resp, err := NewGetInviteRecordsLogic(inviteRecordsContext(900, 0), svcCtx).GetInviteRecords(&types.GetInviteRecordsRequest{Page: 1, Size: 10})
if err != nil {
t.Fatalf("GetInviteRecords returned error: %v", err)
}
if resp == nil {
t.Fatal("response is nil")
}
if resp.Total != 0 {
t.Fatalf("Total = %d, want 0", resp.Total)
}
if len(resp.List) != 0 {
t.Fatalf("len(List) = %d, want 0", len(resp.List))
}
assertInviteRecordsExpectations(t, mock)
}
func newInviteRecordsTestSvc(t *testing.T) (*svc.ServiceContext, sqlmock.Sqlmock, func()) {
t.Helper()
@@ -126,6 +176,27 @@ func newInviteRecordsTestSvc(t *testing.T) (*svc.ServiceContext, sqlmock.Sqlmock
}
}
func expectNoInviteRecordsFamily(t *testing.T, mock sqlmock.Sqlmock, userId int64) {
t.Helper()
mock.ExpectQuery("FROM `user_family_member` JOIN user_family").
WithArgs(1, userId, 1, 1).
WillReturnError(gorm.ErrRecordNotFound)
}
func expectInviteRecordsFamilyMember(t *testing.T, mock sqlmock.Sqlmock, userId, ownerUserId int64) {
t.Helper()
mock.ExpectQuery("FROM `user_family_member` JOIN user_family").
WithArgs(1, userId, 1, 1).
WillReturnRows(sqlmock.NewRows([]string{"family_id", "role", "owner_user_id"}).AddRow(800, 2, ownerUserId))
}
func expectInviteRecordsFamilyOwner(t *testing.T, mock sqlmock.Sqlmock, userId int64) {
t.Helper()
mock.ExpectQuery("FROM `user_family_member` JOIN user_family").
WithArgs(1, userId, 1, 1).
WillReturnRows(sqlmock.NewRows([]string{"family_id", "role", "owner_user_id"}).AddRow(800, 1, userId))
}
func inviteRecordsContext(userId, refererId int64) context.Context {
return context.WithValue(context.Background(), constant.CtxKeyUser, &modeluser.User{
Id: userId,