Prune stale plugin metadata

This commit is contained in:
npc0-hue
2026-09-14 17:32:51 +08:00
parent ecdca8e28b
commit 63e2340db7
10 changed files with 659 additions and 13 deletions
+47
View File
@@ -1,6 +1,8 @@
package service
import (
"fmt"
"strings"
"testing"
"browser.local/platform/domain"
@@ -44,6 +46,51 @@ func TestPluginDataIsOpaqueAndScopedToItsServerPlugin(t *testing.T) {
}
}
func TestPluginDataListIsBoundedAndNewestFirst(t *testing.T) {
svc := newTestCoreService()
plugin, endpoint := createPluginAndRunEndpoint(t, svc)
owner, err := svc.RegisterUser(domain.UserRegistration{DisplayName: "Plugin bounded owner", Email: "plugin-bounded@example.test", Password: "secret-password"})
if err != nil {
t.Fatalf("register owner: %v", err)
}
if _, err := svc.CreateServerInstance(domain.ServerInstance{ID: "server-plugin-bounded", PluginID: plugin.ID, RunEndpointID: endpoint.ID, OwnerUserID: owner.User.ID, Name: "Bounded"}); err != nil {
t.Fatalf("create server: %v", err)
}
for index := 0; index < defaultPluginDataListLimit+5; index++ {
key := fmt.Sprintf("record-%04d", index)
if _, err := svc.PutPluginDataForSession(owner.SessionID, domain.PluginDataRecord{PluginID: plugin.ID, ServerInstanceID: "server-plugin-bounded", Collection: "records", Key: key, Value: map[string]any{"index": index}}); err != nil {
t.Fatalf("put plugin data %d: %v", index, err)
}
}
items, err := svc.ListPluginDataForSession(owner.SessionID, domain.PluginDataFilter{PluginID: plugin.ID, ServerInstanceID: "server-plugin-bounded", Collection: "records"})
if err != nil || len(items) != defaultPluginDataListLimit {
t.Fatalf("expected default bounded list, len=%d err=%v", len(items), err)
}
limited, err := svc.ListPluginDataForSession(owner.SessionID, domain.PluginDataFilter{PluginID: plugin.ID, ServerInstanceID: "server-plugin-bounded", Collection: "records", Limit: 3})
if err != nil || len(limited) != 3 {
t.Fatalf("expected explicit bounded list, len=%d err=%v", len(limited), err)
}
}
func TestSCUMLegacyProjectionPluginDataWritesAreRejected(t *testing.T) {
svc := newTestCoreService()
plugin, endpoint := createPluginAndRunEndpoint(t, svc)
owner, err := svc.RegisterUser(domain.UserRegistration{DisplayName: "SCUM projection owner", Email: "scum-projection@example.test", Password: "secret-password"})
if err != nil {
t.Fatalf("register owner: %v", err)
}
if _, err := svc.CreateServerInstance(domain.ServerInstance{ID: "server-scum-projection", PluginID: plugin.ID, RunEndpointID: endpoint.ID, OwnerUserID: owner.User.ID, Name: "SCUM Projection"}); err != nil {
t.Fatalf("create server: %v", err)
}
if _, err := svc.PutPluginDataForSession(owner.SessionID, domain.PluginDataRecord{PluginID: plugin.ID, ServerInstanceID: "server-scum-projection", Collection: "scum_trajectories", Key: "point-1", Value: map[string]any{"x": 1}}); err == nil || !strings.Contains(err.Error(), "platform SCUM tables") {
t.Fatalf("expected legacy projection put rejection, got %v", err)
}
_, err = svc.ApplyPluginDataTransactionForSession(owner.SessionID, domain.PluginDataTransaction{PluginID: plugin.ID, ServerInstanceID: "server-scum-projection", Collection: "scum_users", Mutations: []domain.PluginDataMutation{{Operation: domain.PluginDataMutationPut, Key: "steam-1", Value: map[string]any{"steamId": "steam-1"}}}})
if err == nil || !strings.Contains(err.Error(), "platform SCUM tables") {
t.Fatalf("expected legacy projection transaction rejection, got %v", err)
}
}
func TestPluginDataTransactionAppliesPutAndDeleteTogether(t *testing.T) {
svc := newTestCoreService()
plugin, endpoint := createPluginAndRunEndpoint(t, svc)