feat: enhance desktop client presence management and add monitoring for active platforms
Backend CI / Backend (push) Successful in 14m43s

This commit is contained in:
2026-06-19 20:02:59 +08:00
parent 18aa681b01
commit a48f450de6
6 changed files with 503 additions and 75 deletions
@@ -2,6 +2,7 @@ package app
import (
"context"
"strconv"
"testing"
"time"
@@ -111,3 +112,59 @@ func TestDesktopTaskConsumerPresenceIsSeparateFromHeartbeatPresence(t *testing.T
require.NotNil(t, taskConsumerPresence)
assert.True(t, taskConsumerPresence[clientID])
}
func TestDesktopClientPresenceKeepsOriginalOnlineSinceAcrossHeartbeats(t *testing.T) {
ctx := context.Background()
server := miniredis.RunT(t)
redis := goredis.NewClient(&goredis.Options{Addr: server.Addr()})
t.Cleanup(func() {
require.NoError(t, redis.Close())
})
clientID := uuid.New()
markDesktopClientPresent(ctx, redis, clientID)
firstOnlineSince := redis.Get(ctx, desktopClientPresenceKey(clientID)).Val()
require.NotEmpty(t, firstOnlineSince)
time.Sleep(time.Millisecond)
markDesktopClientPresent(ctx, redis, clientID)
secondOnlineSince := redis.Get(ctx, desktopClientPresenceKey(clientID)).Val()
assert.Equal(t, firstOnlineSince, secondOnlineSince)
assert.Positive(t, redis.TTL(ctx, desktopClientPresenceKey(clientID)).Val())
}
func TestDesktopAccountPresenceClientsKeepLongRunningOnlineClientAndOrderByOnlineSince(t *testing.T) {
ctx := context.Background()
server := miniredis.RunT(t)
redis := goredis.NewClient(&goredis.Options{Addr: server.Addr()})
t.Cleanup(func() {
require.NoError(t, redis.Close())
})
accountID := uuid.New()
earlierClientID := uuid.New()
laterClientID := uuid.New()
offlineClientID := uuid.New()
now := time.Date(2026, 6, 19, 10, 0, 0, 0, time.UTC)
earlierOnlineSince := now.Add(-time.Hour).UnixMilli()
laterOnlineSince := now.UnixMilli()
require.NoError(t, redis.Set(ctx, desktopClientPresenceKey(earlierClientID), strconv.FormatInt(earlierOnlineSince, 10), desktopClientPresenceTTL).Err())
require.NoError(t, redis.Set(ctx, desktopClientPresenceKey(laterClientID), strconv.FormatInt(laterOnlineSince, 10), desktopClientPresenceTTL).Err())
require.NoError(t, redis.ZAdd(ctx, desktopAccountPresenceKey(accountID),
goredis.Z{Score: float64(laterOnlineSince), Member: laterClientID.String()},
goredis.Z{Score: float64(earlierOnlineSince), Member: earlierClientID.String()},
goredis.Z{Score: float64(now.Add(-2 * time.Hour).UnixMilli()), Member: offlineClientID.String()},
).Err())
clientsByAccount := loadDesktopAccountPresenceClients(ctx, redis, []uuid.UUID{accountID})
require.Len(t, clientsByAccount[accountID], 2)
assert.Equal(t, earlierClientID, clientsByAccount[accountID][0].ClientID)
assert.Equal(t, earlierOnlineSince, clientsByAccount[accountID][0].OnlineSinceUnixMilli)
assert.Equal(t, laterClientID, clientsByAccount[accountID][1].ClientID)
assert.Equal(t, laterOnlineSince, clientsByAccount[accountID][1].OnlineSinceUnixMilli)
assert.False(t, redis.ZScore(ctx, desktopAccountPresenceKey(accountID), offlineClientID.String()).Val() > 0)
}