test: 互关后任一方取关都删掉双方好友边

DeleteFriend 一次删掉两条好友边,消息仍留在会话里。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
DESKTOP-L8OUL9F\gfl0034 2026-10-18 22:06:12 +08:00
parent 284157cc25
commit 9dff1141d4
2 changed files with 36 additions and 3 deletions

View File

@ -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
}

View File

@ -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)
}
}