Skip to content
Permalink
Browse files

Migration related test improvements

refs #6301

- Don't hardcode the model fields in utils/api -> use the schema + modify the lists
   = We can now easily see what the differences between the schema and the API result are
- Don't hardcode the default DB version in the import/export tools
   = We don't have to update this every time we update the database version
  • Loading branch information...
ErisDS committed Feb 14, 2016
1 parent 21c272b commit 54979049eed2d6d386e749d3d018a701d12d276c
Showing with 69 additions and 62 deletions.
  1. +6 −4 core/test/integration/export_spec.js
  2. +13 −11 core/test/integration/import_spec.js
  3. +50 −47 core/test/utils/api.js
@@ -9,6 +9,8 @@ var testUtils = require('../utils/index'),
// Stuff we are testing
versioning = require('../../server/data/schema').versioning,
exporter = require('../../server/data/export/index'),

DEF_DB_VERSION = versioning.getDefaultDatabaseVersion(),
sandbox = sinon.sandbox.create();

describe('Exporter', function () {
@@ -22,9 +24,9 @@ describe('Exporter', function () {
should.exist(exporter);

it('exports data', function (done) {
// Stub migrations to return 000 as the current database version
// Stub migrations to return DEF_DB_VERSION as the current database version
var versioningStub = sandbox.stub(versioning, 'getDatabaseVersion', function () {
return Promise.resolve('004');
return Promise.resolve(DEF_DB_VERSION);
});

exporter().then(function (exportData) {
@@ -37,13 +39,13 @@ describe('Exporter', function () {
should.exist(exportData.meta);
should.exist(exportData.data);

exportData.meta.version.should.equal('004');
exportData.meta.version.should.equal(DEF_DB_VERSION);

dbVersionSetting = _.findWhere(exportData.data.settings, {key: 'databaseVersion'});

should.exist(dbVersionSetting);

dbVersionSetting.value.should.equal('004');
dbVersionSetting.value.should.equal(DEF_DB_VERSION);

_.each(tables, function (name) {
should.exist(exportData.data[name]);
@@ -12,12 +12,14 @@ var testUtils = require('../utils/index'),
// Stuff we are testing
db = require('../../server/data/db'),
config = require('../../server/config'),
versioning = require('../../server/data/schema').versioning,
defaultConfig = rewire('../../../config.example')[process.env.NODE_ENV],
migration = rewire('../../server/data/migration'),
exporter = require('../../server/data/export'),
importer = require('../../server/data/import'),
DataImporter = require('../../server/data/import/data-importer'),

DEF_DB_VERSION = versioning.getDefaultDatabaseVersion(),
knex = db.knex,
sandbox = sinon.sandbox.create();

@@ -155,7 +157,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

// test tags
tags.length.should.equal(exportData.data.tags.length, 'no new tags');
@@ -211,7 +213,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

// activeTheme should NOT have been overridden
_.findWhere(settings, {key: 'activeTheme'}).value.should.equal('casper', 'Wrong theme');
@@ -272,7 +274,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
});
@@ -317,7 +319,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
});
@@ -375,7 +377,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

// activeTheme should NOT have been overridden
_.findWhere(settings, {key: 'activeTheme'}).value.should.equal('casper', 'Wrong theme');
@@ -435,7 +437,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
});
@@ -479,7 +481,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
});
@@ -529,7 +531,7 @@ describe('Import', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
}).catch(done);
@@ -719,7 +721,7 @@ describe('Import (new test structure)', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
}).catch(done);
@@ -944,7 +946,7 @@ describe('Import (new test structure)', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
}).catch(done);
@@ -1181,7 +1183,7 @@ describe('Import (new test structure)', function () {

// test settings
settings.length.should.be.above(0, 'Wrong number of settings');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal('004', 'Wrong database version');
_.findWhere(settings, {key: 'databaseVersion'}).value.should.equal(DEF_DB_VERSION, 'Wrong database version');

done();
}).catch(done);
@@ -2,66 +2,77 @@ var _ = require('lodash'),
url = require('url'),
moment = require('moment'),
config = require('../../server/config'),
schema = require('../../server/data/schema').tables,
ApiRouteBase = '/ghost/api/v0.1/',
host = config.server.host,
port = config.server.port,
schema = 'http://',
protocol = 'http://',
expectedProperties = {
// API top level
configuration: ['key', 'value', 'type'],
posts: ['posts', 'meta'],
tags: ['tags', 'meta'],
users: ['users', 'meta'],
roles: ['roles'],
pagination: ['page', 'limit', 'pages', 'total', 'next', 'prev'],
post: ['id', 'uuid', 'title', 'slug', 'markdown', 'html', 'meta_title', 'meta_description',
'featured', 'image', 'status', 'language', 'created_at', 'created_by', 'updated_at',
'updated_by', 'published_at', 'published_by', 'page', 'author', 'url'
],
settings: ['settings', 'meta'],
setting: ['id', 'uuid', 'key', 'value', 'type', 'created_at', 'created_by', 'updated_at', 'updated_by'],
tag: ['id', 'uuid', 'name', 'slug', 'description', 'parent', 'image', 'hidden',
'meta_title', 'meta_description', 'created_at', 'created_by', 'updated_at', 'updated_by'
],
theme: ['uuid', 'name', 'version', 'active'],
user: ['id', 'uuid', 'name', 'slug', 'email', 'image', 'cover', 'bio', 'website',
'location', 'accessibility', 'status', 'language', 'meta_title', 'meta_description', 'tour', 'last_login',
'created_at', 'created_by', 'updated_at', 'updated_by'
],
posts: ['posts', 'meta'],
tags: ['tags', 'meta'],
users: ['users', 'meta'],
settings: ['settings', 'meta'],
roles: ['roles'],
pagination: ['page', 'limit', 'pages', 'total', 'next', 'prev'],
slugs: ['slugs'],
slug: ['slug'],
// object / model level
// Post API swaps author_id to author, and always returns a computed 'url' property
post: _(schema.posts).keys().without('author_id').concat('author', 'url').value(),
// User API always removes the password field
user: _(schema.users).keys().without('password').value(),
// Tag API swaps parent_id to parent
tag: _(schema.tags).keys().without('parent_id').concat('parent').value(),
setting: _.keys(schema.settings),
accesstoken: _.keys(schema.accesstokens),
role: _.keys(schema.roles),
permission: _.keys(schema.permissions),
notification: ['type', 'message', 'status', 'id', 'dismissible', 'location'],
slugs: ['slugs'],
slug: ['slug'],
accesstoken: ['access_token', 'refresh_token', 'expires_in', 'token_type'],
role: ['id', 'uuid', 'name', 'description', 'created_at', 'created_by', 'updated_at', 'updated_by'],
permission: ['id', 'uuid', 'name', 'object_type', 'action_type', 'object_id', 'created_at', 'created_by',
'updated_at', 'updated_by'
]
theme: ['uuid', 'name', 'version', 'active']
};

function getApiQuery(route) {
return url.resolve(ApiRouteBase, route);
}

function getApiURL(route) {
var baseURL = url.resolve(schema + host + ':' + port, ApiRouteBase);
var baseURL = url.resolve(protocol + host + ':' + port, ApiRouteBase);
return url.resolve(baseURL, route);
}

function getURL() {
return protocol + host;
}

function getSigninURL() {
return url.resolve(schema + host + ':' + port, 'ghost/signin/');
return url.resolve(protocol + host + ':' + port, 'ghost/signin/');
}

function getAdminURL() {
return url.resolve(schema + host + ':' + port, 'ghost/');
return url.resolve(protocol + host + ':' + port, 'ghost/');
}

function isISO8601(date) {
return moment(date).parsingFlags().iso;
}

// make sure the API only returns expected properties only
function checkResponseValue(jsonResponse, properties) {
for (var i = 0; i < properties.length; i = i + 1) {
// For some reason, settings response objects do not have the 'hasOwnProperty' method
if (Object.prototype.hasOwnProperty.call(jsonResponse, properties[i])) {
continue;
}
jsonResponse.should.have.property(properties[i]);
}
Object.keys(jsonResponse).length.should.eql(properties.length);
function checkResponseValue(jsonResponse, expectedProperties) {
var providedProperties = _.keys(jsonResponse),
missing = _.difference(expectedProperties, providedProperties),
unexpected = _.difference(providedProperties, expectedProperties);

_.each(missing, function (prop) {
jsonResponse.should.have.property(prop);
});

_.each(unexpected, function (prop) {
jsonResponse.should.not.have.property(prop);
});

providedProperties.length.should.eql(expectedProperties.length);
}

function checkResponse(jsonResponse, objectType, additionalProperties, missingProperties) {
@@ -72,14 +83,6 @@ function checkResponse(jsonResponse, objectType, additionalProperties, missingPr
checkResponseValue(jsonResponse, checkProperties);
}

function isISO8601(date) {
return moment(date).parsingFlags().iso;
}

function getURL() {
return schema + host;
}

module.exports = {
getApiURL: getApiURL,
getApiQuery: getApiQuery,

0 comments on commit 5497904

Please sign in to comment.
You can’t perform that action at this time.