mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-27 22:49:56 -05:00
9309adc511
refs #6301 - change knex getter def to be configurable, else it is not testable - remove exportPath and lang from config - neither are used - add client_trusted_domains to tables which shouldn't be exported as there are no clients in the export - change export signature to be an object with `doExport` function consistent with import & easier to test - cleanup export code so it is clearer, easier to read & to test: - use mapSeries instead of sequence - use Promise.props instead of Promise.join - split functionality into smaller functions - add test coverage
143 lines
5.5 KiB
JavaScript
143 lines
5.5 KiB
JavaScript
/*globals describe, afterEach, beforeEach, it*/
|
|
var should = require('should'),
|
|
sinon = require('sinon'),
|
|
Promise = require('bluebird'),
|
|
|
|
// Stuff we're testing
|
|
db = require('../../server/data/db'),
|
|
errors = require('../../server/errors'),
|
|
exporter = require('../../server/data/export'),
|
|
schema = require('../../server/data/schema'),
|
|
settings = require('../../server/api/settings'),
|
|
|
|
schemaTables = Object.keys(schema.tables),
|
|
|
|
sandbox = sinon.sandbox.create();
|
|
|
|
require('should-sinon');
|
|
|
|
describe('Exporter', function () {
|
|
var versionStub, tablesStub, queryMock, knexMock, knexStub;
|
|
|
|
afterEach(function () {
|
|
sandbox.restore();
|
|
knexStub.restore();
|
|
});
|
|
|
|
describe('doExport', function () {
|
|
beforeEach(function () {
|
|
versionStub = sandbox.stub(schema.versioning, 'getDatabaseVersion').returns(new Promise.resolve('004'));
|
|
tablesStub = sandbox.stub(schema.commands, 'getTables').returns(schemaTables);
|
|
|
|
queryMock = {
|
|
select: sandbox.stub()
|
|
};
|
|
|
|
knexMock = sandbox.stub().returns(queryMock);
|
|
|
|
// this MUST use sinon, not sandbox, see sinonjs/sinon#781
|
|
knexStub = sinon.stub(db, 'knex', {get: function () { return knexMock; }});
|
|
});
|
|
|
|
it('should try to export all the correct tables', function (done) {
|
|
// Setup for success
|
|
queryMock.select.returns(new Promise.resolve({}));
|
|
|
|
// Execute
|
|
exporter.doExport().then(function (exportData) {
|
|
// No tables, less the number of excluded tables
|
|
var expectedCallCount = schemaTables.length - 4;
|
|
|
|
should.exist(exportData);
|
|
|
|
versionStub.should.be.calledOnce();
|
|
tablesStub.should.be.calledOnce();
|
|
knexStub.get.should.be.called();
|
|
knexMock.should.be.called();
|
|
queryMock.select.should.be.called();
|
|
|
|
knexMock.should.have.callCount(expectedCallCount);
|
|
queryMock.select.should.have.callCount(expectedCallCount);
|
|
|
|
knexMock.getCall(0).should.be.calledWith('posts');
|
|
knexMock.getCall(1).should.be.calledWith('users');
|
|
knexMock.getCall(2).should.be.calledWith('roles');
|
|
knexMock.getCall(3).should.be.calledWith('roles_users');
|
|
knexMock.getCall(4).should.be.calledWith('permissions');
|
|
knexMock.getCall(5).should.be.calledWith('permissions_users');
|
|
knexMock.getCall(6).should.be.calledWith('permissions_roles');
|
|
knexMock.getCall(7).should.be.calledWith('permissions_apps');
|
|
knexMock.getCall(8).should.be.calledWith('settings');
|
|
knexMock.getCall(9).should.be.calledWith('tags');
|
|
knexMock.getCall(10).should.be.calledWith('posts_tags');
|
|
knexMock.getCall(11).should.be.calledWith('apps');
|
|
knexMock.getCall(12).should.be.calledWith('app_settings');
|
|
knexMock.getCall(13).should.be.calledWith('app_fields');
|
|
|
|
knexMock.should.not.be.calledWith('clients');
|
|
knexMock.should.not.be.calledWith('client_trusted_domains');
|
|
knexMock.should.not.be.calledWith('refreshtokens');
|
|
knexMock.should.not.be.calledWith('accesstokens');
|
|
|
|
done();
|
|
}).catch(done);
|
|
});
|
|
|
|
it('should catch and log any errors', function (done) {
|
|
// Setup for failure
|
|
var errorStub = sandbox.stub(errors, 'logAndThrowError');
|
|
queryMock.select.returns(new Promise.reject({}));
|
|
|
|
// Execute
|
|
exporter.doExport().then(function (exportData) {
|
|
should.not.exist(exportData);
|
|
errorStub.should.be.calledOnce();
|
|
done();
|
|
}).catch(done);
|
|
});
|
|
});
|
|
|
|
describe('exportFileName', function () {
|
|
it('should return a correctly structured filename', function (done) {
|
|
var settingsStub = sandbox.stub(settings, 'read').returns(
|
|
new Promise.resolve({settings: [{value: 'testblog'}]})
|
|
);
|
|
|
|
exporter.fileName().then(function (result) {
|
|
should.exist(result);
|
|
settingsStub.should.be.calledOnce();
|
|
result.should.match(/^testblog\.ghost\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.json$/);
|
|
|
|
done();
|
|
}).catch(done);
|
|
});
|
|
|
|
it('should return a correctly structured filename if settings is empty', function (done) {
|
|
var settingsStub = sandbox.stub(settings, 'read').returns(
|
|
new Promise.resolve()
|
|
);
|
|
|
|
exporter.fileName().then(function (result) {
|
|
should.exist(result);
|
|
settingsStub.should.be.calledOnce();
|
|
result.should.match(/^ghost\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.json$/);
|
|
|
|
done();
|
|
}).catch(done);
|
|
});
|
|
|
|
it('should return a correctly structured filename if settings errors', function (done) {
|
|
var settingsStub = sandbox.stub(settings, 'read').returns(
|
|
new Promise.reject()
|
|
);
|
|
|
|
exporter.fileName().then(function (result) {
|
|
should.exist(result);
|
|
settingsStub.should.be.calledOnce();
|
|
result.should.match(/^ghost\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.json$/);
|
|
|
|
done();
|
|
}).catch(done);
|
|
});
|
|
});
|
|
});
|