feat: enhance desktop client presence management and add monitoring for active platforms
Backend CI / Backend (push) Successful in 14m43s
Backend CI / Backend (push) Successful in 14m43s
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user