diff --git a/lib/__tests__/demo-client-files.test.ts b/lib/__tests__/demo-client-files.test.ts new file mode 100644 index 000000000..9a4c9b873 --- /dev/null +++ b/lib/__tests__/demo-client-files.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest'; +import { DemoJMAPClient } from '@/lib/demo/demo-client'; + +// A move, its Undo and a restore from the trash are all parentId updates; +// none of them may make a file look edited. +describe('DemoJMAPClient files', () => { + it('keeps a file\'s Modified time when it is moved or renamed', async () => { + const client = new DemoJMAPClient(); + const folder = await client.createFileDirectory('Target', null); + const nodes = await client.listAllFileNodes(); + const original = nodes.find((n) => n.blobId != null && n.modified)!; + const before = original.modified; + + await client.updateFileNodes({ [original.id]: { parentId: folder.id } }); + await client.updateFileNode(original.id, { name: 'renamed.txt' }); + + const after = (await client.getFileNodes([original.id]))[0]; + expect(after.parentId).toBe(folder.id); + expect(after.name).toBe('renamed.txt'); + expect(after.modified).toBe(before); + }); +}); diff --git a/lib/demo/demo-client.ts b/lib/demo/demo-client.ts index 44bb9e3d7..f1790676e 100644 --- a/lib/demo/demo-client.ts +++ b/lib/demo/demo-client.ts @@ -1409,8 +1409,10 @@ export class DemoJMAPClient implements IJMAPClient { } async updateFileNode(id: string, updates: Partial>): Promise { + // A rename or move leaves `modified` alone, as on Stalwart: it dates the + // content, and a move or its Undo shouldn't make a file look edited. const node = this.data.fileNodes.find(n => n.id === id); - if (node) Object.assign(node, updates, { modified: new Date().toISOString() }); + if (node) Object.assign(node, updates); } async updateFileNodes(updates: Record>>): Promise<{ updated: string[]; notUpdated: Record }> { @@ -1418,7 +1420,7 @@ export class DemoJMAPClient implements IJMAPClient { for (const [id, patch] of Object.entries(updates)) { const node = this.data.fileNodes.find(n => n.id === id); if (node) { - Object.assign(node, patch, { modified: new Date().toISOString() }); + Object.assign(node, patch); updated.push(id); } }