From 8460ac632917ded5fb327b4855de670e3802c444 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 15 Apr 2026 10:15:18 +0200 Subject: [PATCH] Add test for migrating legacy NPC dialogue speaker fields --- .../project-document-json.test.ts | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tests/serialization/project-document-json.test.ts b/tests/serialization/project-document-json.test.ts index 8aa63466..f926eadb 100644 --- a/tests/serialization/project-document-json.test.ts +++ b/tests/serialization/project-document-json.test.ts @@ -13,6 +13,7 @@ import { DEFAULT_PROJECT_NAME, DEFAULT_SCENE_EDITOR_SNAP_STEP, NPC_COLLIDER_SCENE_DOCUMENT_VERSION, + NPC_ONLY_DIALOGUES_SCENE_DOCUMENT_VERSION, PROJECT_DIALOGUE_LIBRARY_SCENE_DOCUMENT_VERSION, PROJECT_SEQUENCE_EFFECTS_SCENE_DOCUMENT_VERSION, NPC_PRESENCE_SCENE_DOCUMENT_VERSION, @@ -112,6 +113,77 @@ describe("project document JSON", () => { ); }); + it("migrates legacy NPC dialogue speaker fields by deriving names from actor ids instead", () => { + const document = createEmptyProjectDocument({ + name: "Legacy NPC Speaker Project" + }); + const npc = createNpcEntity({ + id: "entity-npc-merchant", + actorId: "actor-merchant", + dialogues: [ + { + id: "dialogue-market", + title: "Market", + lines: [ + { + id: "dialogue-line-market-1", + text: "Fresh bread." + } + ] + } + ], + defaultDialogueId: "dialogue-market" + }); + document.scenes[document.activeSceneId]!.entities[npc.id] = npc; + + const legacyDocument = JSON.parse( + serializeProjectDocument(document) + ) as Record; + legacyDocument.version = NPC_ONLY_DIALOGUES_SCENE_DOCUMENT_VERSION; + ( + ( + ( + legacyDocument.scenes as Record + )[document.activeSceneId] as { + entities: Record; + } + ).entities[npc.id] as { + dialogues: Array<{ + lines: Array>; + }>; + } + ).dialogues[0]!.lines[0]!.speakerName = "Merchant"; + + const migratedDocument = parseProjectDocumentJson( + JSON.stringify(legacyDocument) + ); + const migratedNpc = migratedDocument.scenes[migratedDocument.activeSceneId]! + .entities[npc.id]; + + expect(migratedNpc).toEqual( + expect.objectContaining({ + kind: "npc", + actorId: "actor-merchant", + dialogues: [ + { + id: "dialogue-market", + title: "Market", + lines: [ + { + id: "dialogue-line-market-1", + text: "Fresh bread." + } + ] + } + ] + }) + ); + expect( + "speakerName" in + (migratedNpc as typeof npc).dialogues[0]!.lines[0]! + ).toBe(false); + }); + it("migrates project NPCs without dialogue references from v50 to null NPC dialogue defaults", () => { const document = createEmptyProjectDocument({ name: "Legacy NPC Dialogue Project"