Files
foundry-core/internal/platform/subgraph_dissolve_test.go
codex-bot d6ee8942f1
Foundry Go checks / check (push) Successful in 2m40s
Foundry Go checks / check (pull_request) Successful in 2m36s
Implement Canvas V2 subgraphs, assets and asynchronous AI execution
2026-11-06 18:36:00 +08:00

77 lines
2.4 KiB
Go

package platform
import (
"encoding/json"
"reflect"
"testing"
)
func TestMigrateDissolveRestoresContentAndEdges(t *testing.T) {
raw := json.RawMessage(legacyMigrationFixture)
parent, children, err := migrateLegacyDocument(raw, map[string]string{"f": "11111111-1111-4111-8111-111111111111", "empty": "22222222-2222-4222-8222-222222222222"})
if err != nil {
t.Fatal(err)
}
restored, empty, err := dissolveDocuments(parent, children["f"], "f")
if err != nil {
t.Fatal(err)
}
originalNodes := canvasNodesByID(raw)
restoredNodes := canvasNodesByID(restored)
for _, id := range []string{"a", "b", "outside"} {
original := originalNodes[id]
delete(original["data"].(map[string]any), "frameId")
if !reflect.DeepEqual(original, restoredNodes[id]) {
t.Fatalf("node %s not preserved", id)
}
}
if restoredNodes["f"] != nil {
t.Fatal("dissolved frame remains")
}
var originalDoc, restoredDoc, emptyDoc map[string]any
_ = json.Unmarshal(raw, &originalDoc)
_ = json.Unmarshal(restored, &restoredDoc)
_ = json.Unmarshal(empty, &emptyDoc)
byID := func(doc map[string]any) map[string]any {
m := map[string]any{}
for _, v := range doc["edges"].([]any) {
e := v.(map[string]any)
m[e["id"].(string)] = e
}
return m
}
if !reflect.DeepEqual(byID(originalDoc), byID(restoredDoc)) {
t.Fatal("boundary/internal edges did not round trip")
}
if len(emptyDoc["nodes"].([]any)) != 0 || len(emptyDoc["edges"].([]any)) != 0 {
t.Fatal("archived child duplicates live content")
}
}
func canvasNodesByID(raw json.RawMessage) map[string]map[string]any {
var doc map[string]any
_ = json.Unmarshal(raw, &doc)
out := map[string]map[string]any{}
for _, v := range doc["nodes"].([]any) {
n := v.(map[string]any)
out[n["id"].(string)] = n
}
return out
}
func TestDissolveRejectsNodeCollisionWithoutMutatingInputs(t *testing.T) {
parent, children, err := migrateLegacyDocument(json.RawMessage(legacyMigrationFixture), map[string]string{"f": "11111111-1111-4111-8111-111111111111", "empty": "22222222-2222-4222-8222-222222222222"})
if err != nil {
t.Fatal(err)
}
var doc map[string]any
_ = json.Unmarshal(children["f"], &doc)
doc["nodes"].([]any)[0].(map[string]any)["id"] = "outside"
collision, _ := json.Marshal(doc)
saved := string(parent)
if _, _, err := dissolveDocuments(parent, collision, "f"); err != errGraphOwnership {
t.Fatalf("collision accepted: %v", err)
}
if string(parent) != saved {
t.Fatal("failed operation mutated source")
}
}