@@ -336,6 +336,32 @@ describe("CodeFilesAPI", () => {
336336 expect(trackerRemember).not.toHaveBeenCalled()
337337 })
338338
339+ it("seeds snapshot before a remote rename finishes to avoid echoing subscription updates", async () => {
340+ const { api, socket, tracker, trackerRemember } = setup()
341+ const content = "export const Old = 1"
342+ const existing = createCodeFile({ name: "Old.tsx", content })
343+
344+ await publishSnapshotAndClear({
345+ api,
346+ socket,
347+ files: [createCodeFile({ name: "Old.tsx", content })],
348+ })
349+
350+ framerMock.getCodeFiles.mockResolvedValueOnce([existing])
351+ existing.rename.mockImplementation(async (nextName: string) => {
352+ existing.name = nextName
353+ framerMock.getCodeFiles.mockResolvedValue([existing])
354+ await api.handleFramerFilesChanged(socket as unknown as WebSocket, tracker)
355+ })
356+
357+ await expect(api.applyRemoteRename("Old.tsx", "New", socket as unknown as WebSocket)).resolves.toBe(true)
358+
359+ const sentMessages = getSentMessages(socket)
360+ expect(sentMessages).toHaveLength(1)
361+ expectFileSyncedMessage(sentMessages[0], "New.tsx")
362+ expect(trackerRemember).not.toHaveBeenCalled()
363+ })
364+
339365 it("finds an extensionless rename source using its normalized name", async () => {
340366 const { api, socket, tracker, trackerRemember } = setup()
341367 const content = "export const Old = 1"
0 commit comments