0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-04-01 02:41:39 -05:00

Integration tests use consistent teardown methods

This commit is contained in:
Hannah Wolfe 2014-07-21 10:29:03 +01:00
parent c2f0fd54da
commit cf9839c71d
23 changed files with 405 additions and 565 deletions

View file

@ -628,7 +628,7 @@ var path = require('path'),
// globally, by using a command in the form (replace path to api_tags_spec.js with the test file you want to
// run):
//
// NODE_ENV=testing mocha --timeout=15000 --ui=bdd --reporter=spec core/test/integration/api/api_tags_spec.js`
// `NODE_ENV=testing mocha --timeout=15000 --ui=bdd --reporter=spec core/test/integration/api/api_tags_spec.js`
//
// Their purpose is to test that both the api and models behave as expected when the database layer is involved.
// These tests are run against sqlite3, mysql and pg on travis and ensure that differences between the databases

View file

@ -1,31 +1,31 @@
var testUtils = require('../../utils'),
should = require('should'),
when = require('when'),
rewire = require('rewire'),
mail = rewire('../../../server/api/mail'),
permissions = require('../../../server/permissions'),
settings = require('../../../server/api/settings'),
/*globals describe, before, beforeEach, afterEach, it */
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
when = require('when'),
rewire = require('rewire'),
authentication = require('../../../server/api/authentication');
// Stuff we are testing
mail = rewire('../../../server/api/mail'),
settings = require('../../../server/api/settings'),
permissions = require('../../../server/permissions'),
AuthAPI = require('../../../server/api/authentication');
describe('Authentication API', function () {
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(AuthAPI);
describe('Setup', function () {
describe('Not completed', function () {
beforeEach(function (done) {
testUtils.clearData().then(function () {
return testUtils.initData().then(function () {
return permissions.init().then(function () {
return settings.updateSettingsCache();
});
testUtils.initData().then(function () {
return permissions.init().then(function () {
return settings.updateSettingsCache();
});
}).then(function () {
done();
@ -33,7 +33,7 @@ describe('Authentication API', function () {
});
it('should report that setup has not been completed', function (done) {
authentication.isSetup().then(function (result) {
AuthAPI.isSetup().then(function (result) {
should.exist(result);
result.setup[0].status.should.be.false;
@ -55,8 +55,12 @@ describe('Authentication API', function () {
return when.resolve();
});
authentication.setup({ setup: [setupData] }).then(function (result) {
AuthAPI.setup({ setup: [setupData] }).then(function (result) {
should.exist(result);
should.exist(result.users);
result.users.should.have.length(1);
testUtils.API.checkResponse(result, 'users');
testUtils.API.checkResponse(result.users[0], 'user', ['roles']);
var newUser = result.users[0];
@ -74,12 +78,10 @@ describe('Authentication API', function () {
describe('Completed', function () {
beforeEach(function (done) {
testUtils.clearData().then(function () {
return testUtils.initData().then(function () {
return testUtils.insertDefaultFixtures().then(function () {
return permissions.init().then(function () {
return settings.updateSettingsCache();
});
testUtils.initData().then(function () {
return testUtils.insertDefaultFixtures().then(function () {
return permissions.init().then(function () {
return settings.updateSettingsCache();
});
});
}).then(function () {
@ -88,7 +90,7 @@ describe('Authentication API', function () {
});
it('should report that setup has been completed', function (done) {
authentication.isSetup().then(function (result) {
AuthAPI.isSetup().then(function (result) {
should.exist(result);
result.setup[0].status.should.be.true;
@ -104,7 +106,7 @@ describe('Authentication API', function () {
title: 'a test blog'
};
authentication.setup({ setup: [setupData] }).then(function (result) {
AuthAPI.setup({ setup: [setupData] }).then(function () {
done(new Error('Setup was able to be run'));
}).catch(function (err) {
should.exist(err);
@ -123,11 +125,9 @@ describe('Authentication API', function () {
describe('Setup not completed', function () {
beforeEach(function (done) {
testUtils.clearData().then(function () {
return testUtils.initData().then(function () {
return permissions.init().then(function () {
return settings.updateSettingsCache();
});
return testUtils.initData().then(function () {
return permissions.init().then(function () {
return settings.updateSettingsCache();
});
}).then(function () {
done();
@ -135,7 +135,7 @@ describe('Authentication API', function () {
});
it('should not allow an invitation to be accepted', function (done) {
authentication.acceptInvitation().then(function () {
AuthAPI.acceptInvitation().then(function () {
done(new Error('Invitation was allowed to be accepted'));
}).catch(function (err) {
should.exist(err);
@ -148,7 +148,7 @@ describe('Authentication API', function () {
});
it('should not generate a password reset token', function (done) {
authentication.generateResetToken().then(function () {
AuthAPI.generateResetToken().then(function () {
done(new Error('Reset token was generated'));
}).catch(function (err) {
should.exist(err);
@ -161,7 +161,7 @@ describe('Authentication API', function () {
});
it('should not allow a password reset', function (done) {
authentication.resetPassword().then(function () {
AuthAPI.resetPassword().then(function () {
done(new Error('Password was reset'));
}).catch(function (err) {
should.exist(err);

View file

@ -1,21 +1,18 @@
/*globals describe, before, beforeEach, afterEach, it */
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
permissions = require('../../../server/permissions'),
DataGenerator = require('../../utils/fixtures/data-generator'),
dbAPI = require('../../../server/api/db'),
TagsAPI = require('../../../server/api/tags'),
PostAPI = require('../../../server/api/posts');
describe('DB API', function () {
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData().then(function () {
@ -29,11 +26,7 @@ describe('DB API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(dbAPI);
it('delete all content', function (done) {
var options = {context: {user: 1}};
@ -62,17 +55,17 @@ describe('DB API', function () {
permissions.init().then(function () {
return dbAPI.deleteAllContent({context: {user: 2}});
}).then(function (){
done(new Error("Delete all content is not denied for editor."));
done(new Error('Delete all content is not denied for editor.'));
}, function (error) {
error.type.should.eql('NoPermissionError');
return dbAPI.deleteAllContent({context: {user: 3}});
}).then(function (){
done(new Error("Delete all content is not denied for author."));
done(new Error('Delete all content is not denied for author.'));
}, function (error) {
error.type.should.eql('NoPermissionError');
return dbAPI.deleteAllContent();
}).then(function (){
done(new Error("Delete all content is not denied without authentication."));
done(new Error('Delete all content is not denied without authentication.'));
}).catch(function (error) {
error.type.should.eql('NoPermissionError');
done();
@ -83,17 +76,17 @@ describe('DB API', function () {
permissions.init().then(function () {
return dbAPI.exportContent({context: {user: 2}});
}).then(function (){
done(new Error("Export content is not denied for editor."));
done(new Error('Export content is not denied for editor.'));
}, function (error) {
error.type.should.eql('NoPermissionError');
return dbAPI.exportContent({context: {user: 3}});
}).then(function (){
done(new Error("Export content is not denied for author."));
done(new Error('Export content is not denied for author.'));
}, function (error) {
error.type.should.eql('NoPermissionError');
return dbAPI.exportContent();
}).then(function (){
done(new Error("Export content is not denied without authentication."));
done(new Error('Export content is not denied without authentication.'));
}).catch(function (error) {
error.type.should.eql('NoPermissionError');
done();
@ -103,18 +96,18 @@ describe('DB API', function () {
it('import content is denied', function (done) {
permissions.init().then(function () {
return dbAPI.importContent({context: {user: 2}});
}).then(function (result) {
done(new Error("Import content is not denied for editor."));
}).then(function () {
done(new Error('Import content is not denied for editor.'));
}, function (error) {
error.type.should.eql('NoPermissionError');
return dbAPI.importContent({context: {user: 3}});
}).then(function (result) {
done(new Error("Import content is not denied for author."));
}).then(function () {
done(new Error('Import content is not denied for author.'));
}, function (error) {
error.type.should.eql('NoPermissionError');
return dbAPI.importContent();
}).then(function (result) {
done(new Error("Import content is not denied without authentication."));
}).then(function () {
done(new Error('Import content is not denied without authentication.'));
}).catch(function (error) {
error.type.should.eql('NoPermissionError');
done();

View file

@ -1,25 +1,28 @@
/*globals describe, before, beforeEach, afterEach, it */
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
permissions = require('../../../server/permissions'),
MailAPI = require('../../../server/api/mail');
MailAPI = require('../../../server/api/mail'),
mailData = {
mail: [{
message: {
to: 'joe@example.com',
subject: 'testemail',
html: '<p>This</p>'
},
options: {}
}]
};
describe('Mail API', function () {
var mailData = {
mail: [{
message: {
to: 'joe@example.com',
subject: 'testemail',
html: '<p>This</p>'
},
options: {}
}]
};
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
before(function (done) {
beforeEach(function (done) {
testUtils.clearData()
.then(function () {
return testUtils.initData();
@ -32,13 +35,7 @@ describe('Mail API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(MailAPI);
it('return correct failure message', function (done) {
MailAPI.send(mailData, {context: {internal: true}}).then(function (response) {

View file

@ -1,19 +1,17 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
should = require('should'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
permissions = require('../../../server/permissions'),
DataGenerator = require('../../utils/fixtures/data-generator'),
permissions = require('../../../server/permissions'),
NotificationsAPI = require('../../../server/api/notifications');
describe('Notifications API', function () {
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -26,11 +24,7 @@ describe('Notifications API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(NotificationsAPI);
it('can add, adds defaults (internal)', function (done) {
var msg = {
@ -102,7 +96,7 @@ describe('Notifications API', function () {
type: 'error', // this can be 'error', 'success', 'warn' and 'info'
message: 'This is an error' // A string. Should fit in one line.
};
NotificationsAPI.add({ notifications: [msg] }, {context: {internal: true}}).then(function (notification) {
NotificationsAPI.add({ notifications: [msg] }, {context: {internal: true}}).then(function () {
NotificationsAPI.browse({context: {internal: true}}).then(function (results) {
should.exist(results);
should.exist(results.notifications);
@ -118,7 +112,7 @@ describe('Notifications API', function () {
type: 'error', // this can be 'error', 'success', 'warn' and 'info'
message: 'This is an error' // A string. Should fit in one line.
};
NotificationsAPI.add({ notifications: [msg] }, {context: {internal: true}}).then(function (notification) {
NotificationsAPI.add({ notifications: [msg] }, {context: {internal: true}}).then(function () {
NotificationsAPI.browse({context: {user: 1}}).then(function (results) {
should.exist(results);
should.exist(results.notifications);

View file

@ -1,18 +1,16 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
should = require('should'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
DataGenerator = require('../../utils/fixtures/data-generator'),
PostAPI = require('../../../server/api/posts');
describe('Post API', function () {
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -24,11 +22,7 @@ describe('Post API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(PostAPI);
it('can browse', function (done) {
PostAPI.browse().then(function (results) {

View file

@ -1,46 +1,22 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
should = require('should'),
_ = require('lodash'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
_ = require('lodash'),
// Stuff we are testing
permissions = require('../../../server/permissions'),
DataGenerator = require('../../utils/fixtures/data-generator'),
SettingsAPI = require('../../../server/api/settings');
permissions = require('../../../server/permissions'),
SettingsAPI = require('../../../server/api/settings'),
defaultContext = {user: 1},
internalContext = {internal: true},
callApiWithContext,
getErrorDetails;
describe('Settings API', function () {
var defaultContext = {
user: 1
},
internalContext = {
internal: true
},
callApiWithContext = function (context, method) {
var args = _.toArray(arguments),
options = args[args.length - 1];
if (_.isObject(options)) {
options.context = _.clone(context);
}
return SettingsAPI[method].apply({}, args.slice(2));
},
getErrorDetails = function (done) {
return function (err) {
if (err instanceof Error) {
return done(err);
}
done(new Error(err.message));
};
};
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -58,11 +34,27 @@ describe('Settings API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(getErrorDetails(done));
});
should.exist(SettingsAPI);
callApiWithContext = function (context, method) {
var args = _.toArray(arguments),
options = args[args.length - 1];
if (_.isObject(options)) {
options.context = _.clone(context);
}
return SettingsAPI[method].apply({}, args.slice(2));
};
getErrorDetails = function (done) {
return function (err) {
if (err instanceof Error) {
return done(err);
}
done(new Error(err.message));
};
};
it('uses Date objects for dateTime fields', function (done) {
return callApiWithContext(defaultContext, 'browse', {}).then(function (results) {
@ -129,7 +121,7 @@ describe('Settings API', function () {
});
it('cannot read core settings if not an internal request', function (done) {
return callApiWithContext(defaultContext, 'read', {key: 'databaseVersion'}).then(function (response) {
return callApiWithContext(defaultContext, 'read', {key: 'databaseVersion'}).then(function () {
done(new Error('Allowed to read databaseVersion with external request'));
}).catch(function (error) {
should.exist(error);
@ -210,15 +202,16 @@ describe('Settings API', function () {
});
it('does not allow an active theme which is not installed', function (done) {
return callApiWithContext(defaultContext, 'edit', 'activeTheme', { settings: [{ key: 'activeTheme', value: 'rasper' }] })
.then(function (response) {
done(new Error('Allowed to set an active theme which is not installed'));
}).catch(function (err) {
should.exist(err);
return callApiWithContext(defaultContext, 'edit', 'activeTheme', {
settings: [{ key: 'activeTheme', value: 'rasper' }]
}).then(function () {
done(new Error('Allowed to set an active theme which is not installed'));
}).catch(function (err) {
should.exist(err);
err.type.should.eql('ValidationError');
err.type.should.eql('ValidationError');
done();
}).catch(done);
done();
}).catch(done);
});
});

View file

@ -1,16 +1,15 @@
var testUtils = require('../../utils'),
should = require('should'),
/*globals describe, before, beforeEach, afterEach, it */
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
permissions = require('../../../server/permissions'),
slugAPI = require('../../../server/api/slugs');
SlugAPI = require('../../../server/api/slugs');
describe('Slug API', function () {
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData().then(function () {
@ -22,14 +21,10 @@ describe('Slug API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(SlugAPI);
it('can generate post slug', function (done) {
slugAPI.generate({ context: { user: 1 }, type: 'post', name: 'A fancy Title' })
SlugAPI.generate({ context: { user: 1 }, type: 'post', name: 'A fancy Title' })
.then(function (results) {
should.exist(results);
testUtils.API.checkResponse(results, 'slugs');
@ -41,7 +36,7 @@ describe('Slug API', function () {
});
it('can generate tag slug', function (done) {
slugAPI.generate({ context: { user: 1 }, type: 'tag', name: 'A fancy Title' })
SlugAPI.generate({ context: { user: 1 }, type: 'tag', name: 'A fancy Title' })
.then(function (results) {
should.exist(results);
testUtils.API.checkResponse(results, 'slugs');
@ -53,7 +48,7 @@ describe('Slug API', function () {
});
it('can generate user slug', function (done) {
slugAPI.generate({ context: { user: 1 }, type: 'tag', name: 'user name' })
SlugAPI.generate({ context: { user: 1 }, type: 'tag', name: 'user name' })
.then(function (results) {
should.exist(results);
testUtils.API.checkResponse(results, 'slugs');
@ -65,7 +60,7 @@ describe('Slug API', function () {
});
it('can generate app slug', function (done) {
slugAPI.generate({ context: { user: 1 }, type: 'tag', name: 'app name' })
SlugAPI.generate({ context: { user: 1 }, type: 'tag', name: 'app name' })
.then(function (results) {
should.exist(results);
testUtils.API.checkResponse(results, 'slugs');
@ -77,7 +72,7 @@ describe('Slug API', function () {
});
it('rejects unknown types', function (done) {
slugAPI.generate({ context: { user: 1 }, type: 'unknown type', name: 'A fancy Title' })
SlugAPI.generate({ context: { user: 1 }, type: 'unknown type', name: 'A fancy Title' })
.then(function () {
done(new Error('Generate a slug for an unknown type is not rejected.'));
}).catch(function (error) {

View file

@ -1,19 +1,16 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
should = require('should'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
permissions = require('../../../server/permissions'),
DataGenerator = require('../../utils/fixtures/data-generator'),
TagsAPI = require('../../../server/api/tags');
permissions = require('../../../server/permissions'),
TagAPI = require('../../../server/api/tags');
describe('Tags API', function () {
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -30,14 +27,10 @@ describe('Tags API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(TagAPI);
it('can browse (internal)', function (done) {
TagsAPI.browse({context: {internal: true}}).then(function (results) {
TagAPI.browse({context: {internal: true}}).then(function (results) {
should.exist(results);
should.exist(results.tags);
results.tags.length.should.be.above(0);
@ -49,7 +42,7 @@ describe('Tags API', function () {
});
it('can browse (admin)', function (done) {
TagsAPI.browse({context: {user: 1}}).then(function (results) {
TagAPI.browse({context: {user: 1}}).then(function (results) {
should.exist(results);
should.exist(results.tags);
results.tags.length.should.be.above(0);
@ -61,7 +54,7 @@ describe('Tags API', function () {
});
it('can browse (editor)', function (done) {
TagsAPI.browse({context: {user: 2}}).then(function (results) {
TagAPI.browse({context: {user: 2}}).then(function (results) {
should.exist(results);
should.exist(results.tags);
results.tags.length.should.be.above(0);
@ -73,7 +66,7 @@ describe('Tags API', function () {
});
it('can browse (author)', function (done) {
TagsAPI.browse({context: {user: 3}}).then(function (results) {
TagAPI.browse({context: {user: 3}}).then(function (results) {
should.exist(results);
should.exist(results.tags);
results.tags.length.should.be.above(0);

View file

@ -1,4 +1,5 @@
/*globals describe, before, beforeEach, afterEach, it */
/*jshint expr:true*/
var _ = require('lodash'),
testUtils = require('../../utils'),
rewire = require('rewire'),
@ -8,7 +9,7 @@ var _ = require('lodash'),
// Stuff we are testing
permissions = require('../../../server/permissions'),
SettingsAPI = require('../../../server/api/settings'),
SettingsAPI = require('../../../server/api/settings'),
ThemeAPI = rewire('../../../server/api/themes');
describe('Themes API', function () {
@ -16,8 +17,11 @@ describe('Themes API', function () {
sandbox,
settingsReadStub;
before(function (done) {
// Keep the DB clean
before(testUtils.teardown);
afterEach(function (done) {
testUtils.clearData().then(function () {
sandbox.restore();
done();
}).catch(done);
});
@ -56,12 +60,7 @@ describe('Themes API', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
sandbox.restore();
done();
}).catch(done);
});
should.exist(ThemeAPI);
it('can browse', function (done) {
var config;

View file

@ -1,121 +1,121 @@
/*globals describe, beforeEach, afterEach, it*/
/*jshint expr:true*/
var fs = require('fs-extra'),
should = require('should'),
sinon = require('sinon'),
when = require('when'),
storage = require('../../../server/storage'),
var fs = require('fs-extra'),
should = require('should'),
sinon = require('sinon'),
when = require('when'),
storage = require('../../../server/storage'),
// Stuff we are testing
UploadAPI = require('../../../server/api/upload');
UploadAPI = require('../../../server/api/upload'),
store;
// To stop jshint complaining
should.equal(true, true);
describe('Upload API', function () {
describe('upload', function () {
// Doesn't test the DB
var req, res, store;
afterEach(function () {
storage.get_storage.restore();
fs.unlink.restore();
});
beforeEach(function () {
store = sinon.stub();
store.save = sinon.stub().returns(when('URL'));
store.exists = sinon.stub().returns(when(true));
store.destroy = sinon.stub().returns(when());
sinon.stub(storage, 'get_storage').returns(store);
sinon.stub(fs, 'unlink').yields();
});
beforeEach(function () {
store = sinon.stub();
store.save = sinon.stub().returns(when('URL'));
store.exists = sinon.stub().returns(when(true));
store.destroy = sinon.stub().returns(when());
sinon.stub(storage, 'get_storage').returns(store);
sinon.stub(fs, 'unlink').yields();
});
afterEach(function () {
storage.get_storage.restore();
fs.unlink.restore();
});
should.exist(UploadAPI);
describe('can not upload invalid file', function () {
it('should return 415 for invalid file type', function (done) {
var uploadimage = {
name: 'INVALID.FILE',
type: 'application/octet-stream',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function () {
done(new Error('Upload suceeded with invalid file.'));
}, function (result) {
result.code.should.equal(415);
result.type.should.equal('UnsupportedMediaTypeError');
done();
});
});
});
describe('can not upload file with valid extension but invalid type', function () {
it('should return 415 for invalid file type', function (done) {
var uploadimage = {
name: 'INVALID.jpg',
type: 'application/octet-stream',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function () {
done(new Error('Upload suceeded with invalid file.'));
}, function (result) {
result.code.should.equal(415);
result.type.should.equal('UnsupportedMediaTypeError');
done();
});
});
});
describe('valid file', function () {
it('can upload jpg', function (done) {
var uploadimage = {
name: 'INVALID.jpg',
type: 'image/jpeg',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
result.should.equal('URL');
describe('invalid file', function () {
it('should return 415 for invalid file type', function (done) {
var uploadimage = {
name: 'INVALID.FILE',
type: 'application/octet-stream',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function () {
done(new Error('Upload suceeded with invalid file.'));
}, function (result) {
result.code.should.equal(415);
result.type.should.equal('UnsupportedMediaTypeError');
done();
});
});
});
});
it('cannot upload jpg with incorrect extension', function (done) {
var uploadimage = {
name: 'INVALID.xjpg',
type: 'image/jpeg',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
done(new Error('Upload suceeded with invalid file.'));
}, function (result) {
result.code.should.equal(415);
result.type.should.equal('UnsupportedMediaTypeError');
done();
});
});
it('can upload png', function (done) {
var uploadimage = {
name: 'INVALID.png',
type: 'image/png',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
result.should.equal('URL');
describe('valid extension but invalid type', function () {
it('should return 415 for invalid file type', function (done) {
var uploadimage = {
name: 'INVALID.jpg',
type: 'application/octet-stream',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function () {
done(new Error('Upload suceeded with invalid file.'));
}, function (result) {
result.code.should.equal(415);
result.type.should.equal('UnsupportedMediaTypeError');
done();
});
});
});
});
describe('valid file', function () {
it('can upload jpg', function (done) {
var uploadimage = {
name: 'INVALID.jpg',
type: 'image/jpeg',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
result.should.equal('URL');
done();
});
it('can upload gif', function (done) {
var uploadimage = {
name: 'INVALID.gif',
type: 'image/gif',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
result.should.equal('URL');
});
it('cannot upload jpg with incorrect extension', function (done) {
var uploadimage = {
name: 'INVALID.xjpg',
type: 'image/jpeg',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function () {
done(new Error('Upload suceeded with invalid file.'));
}, function (result) {
result.code.should.equal(415);
result.type.should.equal('UnsupportedMediaTypeError');
done();
});
});
});
it('can upload png', function (done) {
var uploadimage = {
name: 'INVALID.png',
type: 'image/png',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
result.should.equal('URL');
done();
});
});
it('can upload gif', function (done) {
var uploadimage = {
name: 'INVALID.gif',
type: 'image/gif',
path: '/tmp/TMPFILEID'
};
UploadAPI.add({uploadimage: uploadimage}).then(function (result) {
result.should.equal('URL');
done();
});
});
});

View file

@ -1,53 +1,19 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
should = require('should'),
permissions = require('../../../server/permissions'),
UserModel = require('../../../server/models').User;
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
UsersAPI = require('../../../server/api/users');
AuthAPI = require('../../../server/api/authentication');
permissions = require('../../../server/permissions'),
UserModel = require('../../../server/models').User,
UsersAPI = require('../../../server/api/users');
describe('Users API', function () {
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
describe('No User', function () {
beforeEach(function (done) {
testUtils.initData().then(function () {
return permissions.init();
}).then(function () {
done();
}).catch(done);
});
it('can add with internal user', function (done) {
AuthAPI.setup({ setup: [{
'name': 'Hello World',
'email': 'hello@world.com',
'password': 'password'
}]}).then(function (results) {
should.exist(results);
testUtils.API.checkResponse(results, 'users');
should.exist(results.users);
results.users.should.have.length(1);
testUtils.API.checkResponse(results.users[0], 'user', ['roles']);
results.users[0].name.should.equal('Hello World');
done();
}).catch(done);
});
});
should.exist(UsersAPI);
describe('With Users', function () {
beforeEach(function (done) {

View file

@ -1,20 +1,16 @@
/*globals describe, before, beforeEach, afterEach, after, it*/
var testUtils = require('../../utils'),
should = require('should'),
/*globals describe, before, beforeEach, afterEach, it*/
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
AppFieldsModel = require('../../../server/models').AppField,
context = {context: {user: 1}};
describe('App Fields Model', function () {
var AppFieldsModel = Models.AppField;
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -26,17 +22,7 @@ describe('App Fields Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
after(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(AppFieldsModel);
it('can findAll', function (done) {
AppFieldsModel.findAll().then(function (results) {

View file

@ -1,20 +1,16 @@
/*globals describe, before, beforeEach, afterEach, after, it*/
var testUtils = require('../../utils'),
should = require('should'),
/*globals describe, before, beforeEach, afterEach, it*/
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
AppSettingModel = require('../../../server/models').AppSetting,
context = {context: {user: 1}};
describe('App Setting Model', function () {
var AppSettingModel = Models.AppSetting;
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -26,17 +22,7 @@ describe('App Setting Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
after(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(AppSettingModel);
it('can findAll', function (done) {
AppSettingModel.findAll().then(function (results) {

View file

@ -1,22 +1,19 @@
/*globals describe, before, beforeEach, afterEach, after, it*/
var testUtils = require('../../utils'),
sequence = require('when/sequence'),
should = require('should'),
_ = require('lodash'),
/*globals describe, before, beforeEach, afterEach, it*/
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
sequence = require('when/sequence'),
_ = require('lodash'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
Models = require('../../../server/models'),
context = {context: {user: 1}},
AppModel = Models.App;
describe('App Model', function () {
var AppModel = Models.App;
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -28,17 +25,7 @@ describe('App Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
after(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(AppModel);
it('can findAll', function (done) {
AppModel.findAll().then(function (results) {

View file

@ -1,22 +1,16 @@
/*globals describe, it, before, beforeEach, afterEach */
var testUtils = require('../../utils'),
should = require('should'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
PermissionModel = require('../../../server/models').Permission,
context = {context: {user: 1}};
describe('Permission Model', function () {
var PermissionModel = Models.Permission;
should.exist(PermissionModel);
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData().then(function () {
@ -24,11 +18,7 @@ describe('Permission Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(PermissionModel);
it('can findAll', function (done) {
PermissionModel.findAll().then(function (foundPermissions) {

View file

@ -1,23 +1,19 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
should = require('should'),
_ = require('lodash'),
sequence = require('when/sequence'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
sequence = require('when/sequence'),
_ = require('lodash'),
// Stuff we are testing
Models = require('../../../server/models'),
DataGenerator = testUtils.DataGenerator,
context = {context: {user: 1}};
PostModel = require('../../../server/models').Post,
DataGenerator = testUtils.DataGenerator,
context = {context: {user: 1}};
describe('Post Model', function () {
var PostModel = Models.Post;
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -29,11 +25,7 @@ describe('Post Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(PostModel);
function checkFirstPostData(firstPost) {
should.not.exist(firstPost.author_id);

View file

@ -1,22 +1,16 @@
/*globals describe, it, before, beforeEach, afterEach */
var testUtils = require('../../utils'),
should = require('should'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
RoleModel = require('../../../server/models').Role,
context = {context: {user: 1}};
describe('Role Model', function () {
var RoleModel = Models.Role;
should.exist(RoleModel);
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData().then(function () {
@ -24,11 +18,7 @@ describe('Role Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(RoleModel);
it('can findAll', function (done) {
RoleModel.findAll().then(function (foundRoles) {

View file

@ -1,21 +1,17 @@
/*globals describe, before, beforeEach, afterEach, after, it*/
var testUtils = require('../../utils'),
should = require('should'),
/*globals describe, before, beforeEach, afterEach, it*/
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
// Stuff we are testing
Models = require('../../../server/models'),
config = require('../../../server/config'),
context = {context: {user: 1}};
SettingsModel = require('../../../server/models').Settings,
config = require('../../../server/config'),
context = {context: {user: 1}};
describe('Settings Model', function () {
var SettingsModel = Models.Settings;
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData().then(function () {
@ -23,17 +19,7 @@ describe('Settings Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
after(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(SettingsModel);
describe('API', function () {

View file

@ -1,23 +1,20 @@
/*globals describe, before, beforeEach, afterEach, it */
var testUtils = require('../../utils'),
_ = require("lodash"),
when = require('when'),
sequence = require('when/sequence'),
should = require('should'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
when = require('when'),
_ = require('lodash'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
Models = require('../../../server/models'),
TagModel = Models.Tag,
PostModel = Models.Post,
context = {context: {user: 1}};
describe('Tag Model', function () {
var TagModel = Models.Tag;
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
beforeEach(function (done) {
testUtils.initData()
@ -26,11 +23,7 @@ describe('Tag Model', function () {
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(TagModel);
it('uses Date objects for dateTime fields', function (done) {
TagModel.add(testUtils.DataGenerator.forModel.tags[0], context).then(function (tag) {
@ -44,7 +37,6 @@ describe('Tag Model', function () {
});
describe('a Post', function () {
var PostModel = Models.Post;
it('can add a tag', function (done) {
var newPost = testUtils.DataGenerator.forModel.posts[0],
@ -118,7 +110,7 @@ describe('Tag Model', function () {
attachOperations;
attachOperations = [];
for (var i = 1; i < models.length; i++) {
for (var i = 1; i < models.length; i += 1) {
attachOperations.push(postModel.tags().attach(models[i]));
}

View file

@ -1,29 +1,22 @@
/*globals describe, before, beforeEach, afterEach, it*/
var testUtils = require('../../utils'),
should = require('should'),
when = require('when'),
sinon = require('sinon'),
uuid = require('node-uuid'),
/*jshint expr:true*/
var testUtils = require('../../utils'),
should = require('should'),
when = require('when'),
sinon = require('sinon'),
uuid = require('node-uuid'),
// Stuff we are testing
Models = require('../../../server/models'),
context = {context: {user: 1}};
UserModel = require('../../../server/models').User,
context = {context: {user: 1}};
describe('User Model', function run() {
var UserModel = Models.User;
// Keep the DB clean
before(testUtils.teardown);
afterEach(testUtils.teardown);
before(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
should.exist(UserModel);
describe('Registration', function runRegistration() {
beforeEach(function (done) {
@ -41,8 +34,8 @@ describe('User Model', function run() {
UserModel.add(userData, context).then(function (createdUser) {
should.exist(createdUser);
createdUser.has('uuid').should.equal(true);
createdUser.attributes.password.should.not.equal(userData.password, "password was hashed");
createdUser.attributes.email.should.eql(userData.email, "email address correct");
createdUser.attributes.password.should.not.equal(userData.password, 'password was hashed');
createdUser.attributes.email.should.eql(userData.email, 'email address correct');
gravatarStub.restore();
done();
}).catch(done);
@ -57,7 +50,7 @@ describe('User Model', function run() {
UserModel.add(userData, context).then(function (createdUser) {
should.exist(createdUser);
createdUser.has('uuid').should.equal(true);
createdUser.attributes.email.should.eql(userData.email, "email address correct");
createdUser.attributes.email.should.eql(userData.email, 'email address correct');
gravatarStub.restore();
done();
}).catch(done);
@ -73,7 +66,9 @@ describe('User Model', function run() {
UserModel.add(userData, context).then(function (createdUser) {
should.exist(createdUser);
createdUser.has('uuid').should.equal(true);
createdUser.attributes.image.should.eql('http://www.gravatar.com/avatar/2fab21a4c4ed88e76add10650c73bae1?d=404', 'Gravatar found');
createdUser.attributes.image.should.eql(
'http://www.gravatar.com/avatar/2fab21a4c4ed88e76add10650c73bae1?d=404', 'Gravatar found'
);
gravatarStub.restore();
done();
}).catch(done);
@ -346,12 +341,12 @@ describe('User Model', function run() {
}).then(function (token) {
return UserModel.validateToken(token, dbHash);
}).then(function () {
throw new Error("Allowed expired token");
throw new Error('Allowed expired token');
}).catch(function (err) {
should.exist(err);
err.message.should.equal("Expired token");
err.message.should.equal('Expired token');
done();
});
@ -381,12 +376,12 @@ describe('User Model', function run() {
return UserModel.validateToken(fakeToken, dbHash);
}).then(function () {
throw new Error("allowed invalid token");
throw new Error('allowed invalid token');
}).catch(function (err) {
should.exist(err);
err.message.should.equal("Invalid token");
err.message.should.equal('Invalid token');
done();
});

View file

@ -18,7 +18,10 @@ describe('Update Check', function () {
return testUtils.clearData();
}).then(function () {
done();
}).catch(done);
}).catch(function (err) {
console.log('Update Check before error', err);
throw new Error(err);
});
});
after(function () {
@ -36,14 +39,13 @@ describe('Update Check', function () {
return permissions.init();
}).then(function () {
done();
}).catch(done);
}).catch(function (err) {
console.log('Update Check beforeEach error', err);
throw new Error(err);
});
});
afterEach(function (done) {
testUtils.clearData().then(function () {
done();
}).catch(done);
});
afterEach(testUtils.teardown);
it('should report the correct data', function (done) {
var updateCheckData = updateCheck.__get__('updateCheckData');

View file

@ -8,7 +8,9 @@ var knex = require('../../server/models/base').knex,
migration = require('../../server/data/migration/'),
DataGenerator = require('./fixtures/data-generator'),
API = require('./api'),
fork = require('./fork');
fork = require('./fork'),
teardown;
function initData() {
return migration.init();
@ -49,7 +51,7 @@ function insertMorePosts(max) {
return sequence(_.times(posts.length, function(index) {
return function() {
return knex('posts').insert(posts[index]);
}
};
}));
}
@ -218,7 +220,15 @@ function loadExportFixture(filename) {
});
}
teardown = function (done) {
migration.reset().then(function () {
done();
}).catch(done);
};
module.exports = {
teardown: teardown,
initData: initData,
clearData: clearData,
insertDefaultFixtures: insertDefaultFixtures,