From 9dff1141d40066663711d13e5007c7ec694f8142 Mon Sep 17 00:00:00 2001 From: "DESKTOP-L8OUL9F\\gfl0034" <1003614916@qq.com> Date: Sun, 18 Oct 2026 22:06:12 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E4=BA=92=E5=85=B3=E5=90=8E=E4=BB=BB?= =?UTF-8?q?=E4=B8=80=E6=96=B9=E5=8F=96=E5=85=B3=E9=83=BD=E5=88=A0=E6=8E=89?= =?UTF-8?q?=E5=8F=8C=E6=96=B9=E5=A5=BD=E5=8F=8B=E8=BE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DeleteFriend 一次删掉两条好友边,消息仍留在会话里。 Co-authored-by: Cursor --- internal/module/friend/logic/follow.go | 1 + internal/module/friend/logic/follow_test.go | 38 +++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/internal/module/friend/logic/follow.go b/internal/module/friend/logic/follow.go index 0344737..5dd5b5e 100644 --- a/internal/module/friend/logic/follow.go +++ b/internal/module/friend/logic/follow.go @@ -51,6 +51,7 @@ func (s *Service) Unfollow(ctx context.Context, userID, targetID int64) (*Follow return nil, err } if mutual { + // DeleteFriend removes both directed edges. Messages stay. if err := s.repo.DeleteFriend(ctx, userID, targetID); err != nil && !errors.Is(err, errs.ErrNotFound) { return nil, err } diff --git a/internal/module/friend/logic/follow_test.go b/internal/module/friend/logic/follow_test.go index 6a57e72..5e89477 100644 --- a/internal/module/friend/logic/follow_test.go +++ b/internal/module/friend/logic/follow_test.go @@ -93,13 +93,45 @@ func TestUnfollowMutualDropsFriendsKeepsMessage(t *testing.T) { if err != nil || view.Following || view.Mutual || view.Friend || !view.FollowedBy { t.Fatalf("%+v %v", view, err) } + peer, err := svc.GetFollow(ctx, b.ID, a.ID) + if err != nil || peer.Friend || peer.Mutual { + t.Fatalf("peer %+v %v", peer, err) + } + if _, err := svc.Relation(ctx, a.ID, b.ID); !errors.Is(err, errs.ErrNotFound) { + t.Fatalf("edge a->b %v", err) + } + if _, err := svc.Relation(ctx, b.ID, a.ID); !errors.Is(err, errs.ErrNotFound) { + t.Fatalf("edge b->a %v", err) + } after, err := msgs.ListByConversation(ctx, conv.ID, a.ID, 0, 20) if err != nil || len(after) != 1 || after[0].ID != before[0].ID { t.Fatalf("after %d %v", len(after), err) } - ok, err := svc.AreFriends(ctx, a.ID, b.ID) - if err != nil || ok { - t.Fatalf("still friends %v %v", ok, err) +} + +func TestOtherSideUnfollowRemovesBothEdges(t *testing.T) { + svc, users, _ := testFriends(t) + ctx := t.Context() + a, b := twoUsers(t, users) + if _, err := svc.Follow(ctx, a.ID, b.ID); err != nil { + t.Fatal(err) + } + if view, err := svc.Follow(ctx, b.ID, a.ID); err != nil || !view.Friend { + t.Fatalf("mutual %+v %v", view, err) + } + view, err := svc.Unfollow(ctx, b.ID, a.ID) + if err != nil || view.Friend || view.Mutual { + t.Fatalf("unfollow %+v %v", view, err) + } + if _, err := svc.Relation(ctx, a.ID, b.ID); !errors.Is(err, errs.ErrNotFound) { + t.Fatalf("edge a->b %v", err) + } + if _, err := svc.Relation(ctx, b.ID, a.ID); !errors.Is(err, errs.ErrNotFound) { + t.Fatalf("edge b->a %v", err) + } + left, err := svc.GetFollow(ctx, a.ID, b.ID) + if err != nil || left.Friend || !left.Following { + t.Fatalf("remaining follow %+v %v", left, err) } }