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

Moved default settings population test to regression suite

closes https://github.com/TryGhost/Team/issues/860
refs 5405b6ca7c

- The slow test was running slow because it's not a "unit test" it is testing much more. Moved it to a correct suite - regression which simplified the logic a lot (no need to mock db calls).
- Brought back the 2000ms limit as the bottleneck has been solved
This commit is contained in:
Naz 2021-09-01 15:23:45 +04:00
parent f52d0136ef
commit 4f78bf01a2
3 changed files with 55 additions and 102 deletions

View file

@ -29,7 +29,7 @@
"test": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js --timeout=60000",
"test:all": "yarn test:unit && yarn test:acceptance && yarn lint",
"test:debug": "DEBUG=ghost:test* yarn test",
"test:unit": "c8 --all -n 'core/{*.js,frontend,server,shared}' --reporter text-summary mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/unit' --timeout=3000",
"test:unit": "c8 --all -n 'core/{*.js,frontend,server,shared}' --reporter text-summary mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/unit' --timeout=2000",
"test:acceptance": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/api-acceptance' './test/frontend-acceptance' --timeout=10000",
"test:regression": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/regression' --timeout=60000",
"test:slow": "yarn test:unit --reporter=mocha-slow-test-reporter && yarn test:acceptance --reporter=mocha-slow-test-reporter",

View file

@ -0,0 +1,54 @@
const should = require('should');
const testUtils = require('../../utils');
const db = require('../../../core/server/data/db');
// Stuff we are testing
const models = require('../../../core/server/models');
describe('Settings Model', function () {
before(models.init);
afterEach(testUtils.teardownDb);
describe('defaults', function () {
it('populates all defaults', async function () {
const settings = await models.Settings.findAll();
settings.length.should.equal(0);
await models.Settings.populateDefaults();
const settingsPopulated = await models.Settings.findAll();
settingsPopulated.length.should.equal(93);
});
it('doesn\'t overwrite any existing settings', async function () {
const now = db.knex.raw('CURRENT_TIMESTAMP');
await db.knex
.table('settings')
.insert({
id: 'test_id',
key: 'title',
value: 'Testing Defaults',
flags: 'PUBLIC',
type: 'string',
created_at: now,
created_by: 1,
updated_at: now,
updated_by: 1
});
const settings = await models.Settings.findAll();
settings.length.should.equal(1);
await models.Settings.populateDefaults();
const settingsPopulated = await models.Settings.findAll();
settingsPopulated.length.should.equal(93);
const titleSetting = settingsPopulated.models.find(s => s.get('key') === 'title');
titleSetting.get('value').should.equal('Testing Defaults');
const descriptionSetting = settingsPopulated.models.find(s => s.get('key') === 'description');
descriptionSetting.get('value').should.equal('Thoughts, stories and ideas');
});
});
});

View file

@ -4,7 +4,6 @@ const mockDb = require('mock-knex');
const models = require('../../../core/server/models');
const {knex} = require('../../../core/server/data/db');
const events = require('../../../core/server/lib/common/events');
const defaultSettings = require('../../../core/server/data/schema/default-settings');
const errors = require('@tryghost/errors');
describe('Unit: models/settings', function () {
@ -81,106 +80,6 @@ describe('Unit: models/settings', function () {
});
});
describe('defaults', function () {
let tracker;
let eventSpy;
beforeEach(function () {
mockDb.mock(knex);
tracker = mockDb.getTracker();
tracker.install();
});
afterEach(function () {
mockDb.unmock(knex);
tracker.uninstall();
});
beforeEach(function () {
eventSpy = sinon.spy(events, 'emit');
});
afterEach(function () {
sinon.restore();
});
it('populates unset defaults', function () {
let insertQueries = [];
tracker.on('query', (query) => {
// skip group and flags columns so we can test the insertion column skip
if (query.method === 'columnInfo') {
return query.response([
{name: 'id', type: 'varchar'},
// {name: 'group', type: 'varchar'},
{name: 'key', type: 'varchar'},
{name: 'value', type: 'varchar'},
{name: 'type', type: 'varchar'},
// {name: 'flags', type: 'varchar'},
{name: 'created_at', type: 'datetime'},
{name: 'created_by', type: 'varchar'},
{name: 'updated_at', type: 'varchar'},
{name: 'updated_by', type: 'datetime'}
]);
}
if (query.method === 'insert') {
insertQueries.push(query);
}
return query.response([{}]);
});
return models.Settings.populateDefaults()
.then(() => {
const numberOfSettings = Object.keys(defaultSettings).reduce((settings, settingGroup) => {
return settings.concat(Object.keys(defaultSettings[settingGroup]));
}, []).length;
insertQueries.length.should.equal(numberOfSettings);
// non-existent columns should not be populated
insertQueries[0].sql.should.not.match(/group/);
insertQueries[0].sql.should.not.match(/flags/);
// no events are emitted because we're not using the model layer
eventSpy.callCount.should.equal(0);
});
});
it('doesn\'t overwrite any existing settings', function () {
let insertQueries = [];
tracker.on('query', (query) => {
if (query.method === 'columnInfo') {
return query.response([
{name: 'id', type: 'varchar'},
{name: 'key', type: 'varchar'},
{name: 'value', type: 'varchar'}
]);
}
if (query.method === 'insert') {
insertQueries.push(query);
}
return query.response([{
key: 'description',
value: 'Adam\'s Blog'
}]);
});
return models.Settings.populateDefaults()
.then(() => {
const numberOfSettings = Object.keys(defaultSettings).reduce((settings, settingGroup) => {
return settings.concat(Object.keys(defaultSettings[settingGroup]));
}, []).length;
insertQueries.length.should.equal(numberOfSettings - 1);
});
});
});
describe('format', function () {
it('transforms urls when persisting to db', function () {
const setting = models.Settings.forge();