UNPKG

diff-file-tree

Version:

Compare two file-trees, get a list of changes, then apply left or right

141 lines (128 loc) 4.55 kB
const test = require('tape') const {sortDiffs, mock} = require('./util') const dft = require('../index') test('diff', async t => { await runTests(async function check (leftDesc, rightDesc, expected) { try { console.log('## diff', leftDesc, rightDesc) var left = mock(leftDesc) var right = mock(rightDesc) t.deepEqual(sortDiffs(await dft.diff({fs: left}, {fs: right}, {compareContent: true})), expected) } catch (err) { t.fail(err) } }) t.end() }) test('applyRight', async t => { await runTests(async function check (leftDesc, rightDesc, expected) { try { console.log('## applyRight', leftDesc, rightDesc) var left = mock(leftDesc) var right = mock(rightDesc) var diffs = await dft.diff({fs: left}, {fs: right}, {compareContent: true}) t.deepEqual(sortDiffs(diffs), expected) await dft.applyRight({fs: left}, {fs: right}, diffs) t.same((await dft.diff({fs: left}, {fs: right}, {compareContent: true})).length, 0) } catch (err) { t.fail(err) } }) t.end() }) test('applyRightStream', async t => { await runTests(async function check (leftDesc, rightDesc, expected) { try { console.log('## applyRightStream', leftDesc, rightDesc) var left = mock(leftDesc) var right = mock(rightDesc) var diffs = await dft.diff({fs: left}, {fs: right}, {compareContent: true}) t.deepEqual(sortDiffs(diffs), expected) await new Promise((resolve, reject) => { var stream = dft.applyRightStream({fs: left}, {fs: right}, diffs) stream.on('data', console.log) stream.on('error', reject) stream.on('close', resolve) }) t.same((await dft.diff({fs: left}, {fs: right}, {compareContent: true})).length, 0) } catch (err) { t.fail(err) } }) t.end() }) test('applyLeft', async t => { await runTests(async function check (leftDesc, rightDesc, expected) { try { console.log('## applyLeft', leftDesc, rightDesc) var left = mock(leftDesc) var right = mock(rightDesc) var diffs = await dft.diff({fs: left}, {fs: right}, {compareContent: true}) t.deepEqual(sortDiffs(diffs), expected) await dft.applyLeft({fs: left}, {fs: right}, diffs) t.same((await dft.diff({fs: left}, {fs: right}, {compareContent: true})).length, 0) } catch (err) { t.fail(err) } }) t.end() }) async function runTests (check) { await check([], [], []) await check(['/a'], ['/a'], []) await check(['/a/', '/a/a'], ['/a/', '/a/a'], []) await check(['/a/', '/a/a/', '/a/a/a'], ['/a/', '/a/a/', '/a/a/a'], []) await check(['/a/', '/a/a/', '/a/a/a/', '/a/a/a/a'], ['/a/', '/a/a/', '/a/a/a/', '/a/a/a/a'], []) await check(['/a'], [], [ {change: 'add', type: 'file', path: '/a'} ]) await check(['/a/'], [], [ {change: 'add', type: 'dir', path: '/a'} ]) await check(['/a/', '/a/a'], [], [ {change: 'add', type: 'dir', path: '/a'}, {change: 'add', type: 'file', path: '/a/a'} ]) await check([], ['/a'], [ {change: 'del', type: 'file', path: '/a'} ]) await check([], ['/a/'], [ {change: 'del', type: 'dir', path: '/a'} ]) await check([], ['/a/', '/a/a'], [ {change: 'del', type: 'dir', path: '/a'}, {change: 'del', type: 'file', path: '/a/a'} ]) await check(['/a'], ['/b'], [ {change: 'add', type: 'file', path: '/a'}, {change: 'del', type: 'file', path: '/b'} ]) await check(['/a/', '/a/a/', '/a/a/a/', '/a/a/a/a'], ['/a/', '/a/a/', '/a/a/a/', '/a/a/a/b'], [ {change: 'add', type: 'file', path: '/a/a/a/a'}, {change: 'del', type: 'file', path: '/a/a/a/b'} ]) await check(['/a/'], ['/b/'], [ {change: 'add', type: 'dir', path: '/a'}, {change: 'del', type: 'dir', path: '/b'} ]) await check(['/a'], ['/a/'], [ {change: 'del', type: 'dir', path: '/a'}, {change: 'add', type: 'file', path: '/a'} ]) await check(['/a/'], ['/a'], [ {change: 'del', type: 'file', path: '/a'}, {change: 'add', type: 'dir', path: '/a'} ]) await check([['/a', 'foo']], [['/a', 'barr']], [ {change: 'mod', type: 'file', path: '/a'} ]) await check([['/a', 'foo']], [['/a', Buffer.from([1, 2, 3, 4])]], [ {change: 'mod', type: 'file', path: '/a'} ]) await check([['/a', Buffer.from([4, 3, 2, 1])]], [['/a', 'bar']], [ {change: 'mod', type: 'file', path: '/a'} ]) await check([['/a', Buffer.from([4, 3, 2, 1])]], [['/a', Buffer.from([1, 2, 3, 4, 5])]], [ {change: 'mod', type: 'file', path: '/a'} ]) }