diff --git a/src/tests/backend/specs/ExportEtherpad.js b/src/tests/backend/specs/ExportEtherpad.js new file mode 100644 index 000000000..8a4c056cc --- /dev/null +++ b/src/tests/backend/specs/ExportEtherpad.js @@ -0,0 +1,53 @@ +'use strict'; + +const assert = require('assert').strict; +const common = require('../common'); +const exportEtherpad = require('../../../node/utils/ExportEtherpad'); +const padManager = require('../../../node/db/PadManager'); +const plugins = require('../../../static/js/pluginfw/plugin_defs'); +const readOnlyManager = require('../../../node/db/ReadOnlyManager'); + +describe(__filename, function () { + let padId; + + beforeEach(async function () { + padId = common.randomString(); + assert(!await padManager.doesPadExist(padId)); + }); + + describe('exportEtherpadAdditionalContent', function () { + let hookBackup; + + before(async function () { + hookBackup = plugins.hooks.exportEtherpadAdditionalContent || []; + plugins.hooks.exportEtherpadAdditionalContent = [{hook_fn: () => ['custom']}]; + }); + + after(async function () { + plugins.hooks.exportEtherpadAdditionalContent = hookBackup; + }); + + it('exports custom records', async function () { + const pad = await padManager.getPad(padId); + await pad.db.set(`custom:${padId}`, 'a'); + const data = await exportEtherpad.getPadRaw(pad.id, null); + assert.equal(data[`custom:${padId}`], 'a'); + }); + + it('export from read-only pad uses read-only ID', async function () { + const pad = await padManager.getPad(padId); + const readOnlyId = await readOnlyManager.getReadOnlyId(padId); + await pad.db.set(`custom:${padId}`, 'a'); + const data = await exportEtherpad.getPadRaw(padId, readOnlyId); + assert.equal(data[`custom:${readOnlyId}`], 'a'); + assert(!(`custom:${padId}` in data)); + }); + + it('does not export records from pad with similar ID', async function () { + const pad = await padManager.getPad(padId); + await pad.db.set(`custom:${padId}x`, 'a'); + const data = await exportEtherpad.getPadRaw(pad.id, null); + assert(!(`custom:${padId}x` in data)); + }); + }); +}); diff --git a/src/tests/backend/specs/ImportEtherpad.js b/src/tests/backend/specs/ImportEtherpad.js index 6dfd11112..3158c308d 100644 --- a/src/tests/backend/specs/ImportEtherpad.js +++ b/src/tests/backend/specs/ImportEtherpad.js @@ -5,6 +5,7 @@ const authorManager = require('../../../node/db/AuthorManager'); const db = require('../../../node/db/DB'); const importEtherpad = require('../../../node/utils/ImportEtherpad'); const padManager = require('../../../node/db/PadManager'); +const plugins = require('../../../static/js/pluginfw/plugin_defs'); const {randomString} = require('../../../static/js/pad_utils'); describe(__filename, function () { @@ -167,4 +168,41 @@ describe(__filename, function () { }); } }); + + describe('exportEtherpadAdditionalContent', function () { + let hookBackup; + + before(async function () { + hookBackup = plugins.hooks.exportEtherpadAdditionalContent || []; + plugins.hooks.exportEtherpadAdditionalContent = [{hook_fn: () => ['custom']}]; + }); + + after(async function () { + plugins.hooks.exportEtherpadAdditionalContent = hookBackup; + }); + + it('imports from custom prefix', async function () { + await importEtherpad.setPadRaw(padId, JSON.stringify({ + ...makeExport(makeAuthorId()), + 'custom:testing': 'a', + 'custom:testing:foo': 'b', + })); + const pad = await padManager.getPad(padId); + assert.equal(await pad.db.get(`custom:${padId}`), 'a'); + assert.equal(await pad.db.get(`custom:${padId}:foo`), 'b'); + }); + + it('rejects records for pad with similar ID', async function () { + await assert.rejects(importEtherpad.setPadRaw(padId, JSON.stringify({ + ...makeExport(makeAuthorId()), + 'custom:testingx': 'x', + })), /unexpected pad ID/); + assert(await db.get(`custom:${padId}x`) == null); + await assert.rejects(importEtherpad.setPadRaw(padId, JSON.stringify({ + ...makeExport(makeAuthorId()), + 'custom:testingx:foo': 'x', + })), /unexpected pad ID/); + assert(await db.get(`custom:${padId}x:foo`) == null); + }); + }); });