synctos
Version:
The Syncmaker. A tool to build comprehensive sync functions for Couchbase Sync Gateway.
77 lines (58 loc) • 3.15 kB
JavaScript
const path = require('path');
const { expect } = require('chai');
const simpleMock = require('../../lib/simple-mock/index');
const mockRequire = require('mock-require');
describe('Sync function loader', () => {
let syncFunctionLoader, fsMock, indentMock, fileFragmentLoaderMock, docDefinitionsLoaderMock;
const expectedMacroName = 'importSyncFunctionFragment';
const syncFuncTemplateDir = path.resolve(__dirname, '../../templates/sync-function');
const syncFuncTemplateFile = path.resolve(syncFuncTemplateDir, 'template.js');
beforeEach(() => {
// Mock out the "require" calls in the module under test
fsMock = { readFileSync: simpleMock.stub() };
mockRequire('fs', fsMock);
indentMock = { js: simpleMock.stub() };
mockRequire('../../lib/indent.js/indent.js', indentMock);
fileFragmentLoaderMock = { load: simpleMock.stub() };
mockRequire('./file-fragment-loader.js', fileFragmentLoaderMock);
docDefinitionsLoaderMock = { load: simpleMock.stub() };
mockRequire('./document-definitions-loader.js', docDefinitionsLoaderMock);
syncFunctionLoader = mockRequire.reRequire('./sync-function-loader');
});
afterEach(() => {
// Restore "require" calls to their original behaviour after each test case
mockRequire.stopAll();
});
it('should load a sync function as a multi-line JavaScript block', () => {
validateLoadSuccess(
'my\n \r\nfinal\rsync `func`',
'my\n\nfinal\nsync `func`');
});
it('should load a sync function as a JSON string', () => {
validateLoadSuccess(
'my\n \r\n"final"\r`sync` \\func\\',
'"my\\n\\n\\"final\\"\\n`sync` \\\\func\\\\"',
{ jsonString: true });
});
function validateLoadSuccess(indentedSyncFunc, expectedSyncFunc, formatOptions) {
const docDefinitionsFile = 'my/doc-definitions.js';
const docDefinitionsContent = 'my-doc-definitions';
const originalSyncFuncTemplate = 'my-original-sync-fync-template';
const updatedSyncFuncTemplate = 'function my-sync-func-template() { $DOCUMENT_DEFINITIONS_PLACEHOLDER$; }';
fsMock.readFileSync.returnWith(originalSyncFuncTemplate);
fileFragmentLoaderMock.load.returnWith(updatedSyncFuncTemplate);
docDefinitionsLoaderMock.load.returnWith(docDefinitionsContent);
indentMock.js.returnWith(indentedSyncFunc);
const result = syncFunctionLoader.load(docDefinitionsFile, formatOptions);
expect(result).to.equal(expectedSyncFunc);
expect(fsMock.readFileSync.callCount).to.equal(1);
expect(fsMock.readFileSync.calls[0].args).to.eql([ syncFuncTemplateFile, 'utf8' ]);
expect(fileFragmentLoaderMock.load.callCount).to.equal(1);
expect(fileFragmentLoaderMock.load.calls[0].args).to.eql([ syncFuncTemplateDir, expectedMacroName, originalSyncFuncTemplate ]);
expect(docDefinitionsLoaderMock.load.callCount).to.equal(1);
expect(docDefinitionsLoaderMock.load.calls[0].args).to.eql([ docDefinitionsFile ]);
expect(indentMock.js.callCount).to.equal(1);
expect(indentMock.js.calls[0].args).to.eql(
[ `function my-sync-func-template() { ${docDefinitionsContent}; }`, { tabString: ' ' } ]);
}
});