29 lines
1.4 KiB
TypeScript
29 lines
1.4 KiB
TypeScript
import DiffMatchPatch from 'diff-match-patch';
|
|
import { describe, expect, test } from 'vitest';
|
|
import { reconstructRevision } from '../src/domain/revisions.js';
|
|
import type { RevisionRecord } from '../src/domain/types.js';
|
|
|
|
const dmp = new DiffMatchPatch();
|
|
const patch = (before: string, after: string) => JSON.stringify(dmp.patch_make(before, after));
|
|
|
|
describe('revision reconstruction', () => {
|
|
test('follows Joplin parent revisions and applies text and metadata patches', () => {
|
|
const first: RevisionRecord = {
|
|
id: 'r1', parent_id: '', item_id: 'note', item_type: 1, item_updated_time: 10,
|
|
title_diff: patch('', 'Title one'), body_diff: patch('', 'First body'),
|
|
metadata_diff: JSON.stringify({ new: { parent_id: 'folder', user_created_time: 1, user_updated_time: 10 }, deleted: [] }),
|
|
encryption_applied: 0,
|
|
};
|
|
const second: RevisionRecord = {
|
|
id: 'r2', parent_id: 'r1', item_id: 'note', item_type: 1, item_updated_time: 20,
|
|
title_diff: patch('Title one', 'Title two'), body_diff: patch('First body', 'Second body'),
|
|
metadata_diff: JSON.stringify({ new: { user_updated_time: 20 }, deleted: [] }),
|
|
encryption_applied: 0,
|
|
};
|
|
expect(reconstructRevision([first, second], 'r2')).toEqual({
|
|
id: 'r2', note_id: 'note', item_updated_time: 20, title: 'Title two', body: 'Second body',
|
|
parent_id: 'folder', user_created_time: 1, user_updated_time: 20,
|
|
});
|
|
});
|
|
});
|