2019-03-06 14:56:26 +03:00
|
|
|
const should = require('should');
|
2019-03-26 06:37:32 +03:00
|
|
|
const sinon = require('sinon');
|
|
|
|
const mockDb = require('mock-knex');
|
2019-03-06 14:56:26 +03:00
|
|
|
const models = require('../../../server/models');
|
2019-03-26 06:37:32 +03:00
|
|
|
const {knex} = require('../../../server/data/db');
|
|
|
|
const common = require('../../../server/lib/common');
|
2019-03-06 14:56:26 +03:00
|
|
|
|
|
|
|
describe('Unit: models/settings', function () {
|
|
|
|
before(function () {
|
|
|
|
models.init();
|
|
|
|
});
|
|
|
|
|
2019-03-26 06:37:32 +03:00
|
|
|
describe('events', function () {
|
|
|
|
let tracker;
|
|
|
|
let eventSpy;
|
|
|
|
|
|
|
|
beforeEach(function () {
|
|
|
|
mockDb.mock(knex);
|
|
|
|
tracker = mockDb.getTracker();
|
|
|
|
tracker.install();
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(function () {
|
|
|
|
mockDb.unmock(knex);
|
|
|
|
});
|
|
|
|
|
|
|
|
beforeEach(function () {
|
|
|
|
eventSpy = sinon.spy(common.events, 'emit');
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(function () {
|
|
|
|
sinon.restore();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits add events', function () {
|
|
|
|
tracker.on('query', (query, step) => {
|
|
|
|
return [
|
|
|
|
function fetchAddQuery() {
|
|
|
|
query.response([{}]);
|
|
|
|
},
|
|
|
|
function addQuery() {
|
|
|
|
query.response([{
|
|
|
|
key: 'description',
|
|
|
|
value: 'added value'
|
|
|
|
}]);
|
|
|
|
}
|
|
|
|
][step - 1]();
|
|
|
|
});
|
|
|
|
|
|
|
|
return models.Settings.edit({
|
2019-08-19 14:41:09 +03:00
|
|
|
key: 'description',
|
|
|
|
value: 'added value'
|
|
|
|
})
|
2019-03-26 06:37:32 +03:00
|
|
|
.then(() => {
|
|
|
|
eventSpy.calledTwice.should.be.true();
|
|
|
|
eventSpy.firstCall.calledWith('settings.added').should.be.true();
|
|
|
|
eventSpy.secondCall.calledWith('settings.description.added').should.be.true();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits edit events', function () {
|
|
|
|
tracker.on('query', (query, step) => {
|
|
|
|
return [
|
|
|
|
function fetchEditQuery() {
|
|
|
|
query.response([{
|
2019-08-19 14:41:09 +03:00
|
|
|
id: 1, // NOTE: `id` imitates existing value for 'edit' event
|
2019-03-26 06:37:32 +03:00
|
|
|
key: 'description',
|
|
|
|
value: 'db value'
|
|
|
|
}]);
|
|
|
|
}
|
|
|
|
][step - 1]();
|
|
|
|
});
|
|
|
|
|
|
|
|
return models.Settings.edit({
|
2019-08-19 14:41:09 +03:00
|
|
|
key: 'description',
|
|
|
|
value: 'edited value'
|
|
|
|
})
|
2019-03-26 06:37:32 +03:00
|
|
|
.then(() => {
|
|
|
|
eventSpy.calledTwice.should.be.true();
|
|
|
|
eventSpy.firstCall.calledWith('settings.edited').should.be.true();
|
|
|
|
eventSpy.secondCall.calledWith('settings.description.edited').should.be.true();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
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(common.events, 'emit');
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(function () {
|
|
|
|
sinon.restore();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('populates unset defaults', function () {
|
|
|
|
tracker.on('query', (query) => {
|
|
|
|
return query.response([{}]);
|
|
|
|
});
|
|
|
|
|
|
|
|
return models.Settings.populateDefaults()
|
|
|
|
.then(() => {
|
2019-12-04 07:12:02 +03:00
|
|
|
// 2 events per item - settings.added and settings.[name].added
|
2020-01-20 14:45:58 +03:00
|
|
|
eventSpy.callCount.should.equal(92);
|
2019-10-11 09:41:36 +03:00
|
|
|
const eventsEmitted = eventSpy.args.map(args => args[0]);
|
|
|
|
const checkEventEmitted = event => should.ok(eventsEmitted.includes(event), `${event} event should be emitted`);
|
2019-03-26 06:37:32 +03:00
|
|
|
|
2019-10-11 09:41:36 +03:00
|
|
|
checkEventEmitted('settings.db_hash.added');
|
|
|
|
checkEventEmitted('settings.description.added');
|
2019-03-26 06:37:32 +03:00
|
|
|
|
2019-10-11 09:41:36 +03:00
|
|
|
checkEventEmitted('settings.default_content_visibility.added');
|
|
|
|
checkEventEmitted('settings.members_subscription_settings.added');
|
2019-03-26 06:37:32 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('doesn\'t overwrite any existing settings', function () {
|
|
|
|
tracker.on('query', (query) => {
|
|
|
|
return query.response([{
|
|
|
|
key: 'description',
|
|
|
|
value: 'Adam\'s Blog'
|
|
|
|
}]);
|
|
|
|
});
|
|
|
|
|
|
|
|
return models.Settings.populateDefaults()
|
|
|
|
.then(() => {
|
2020-01-20 14:45:58 +03:00
|
|
|
const eventsEmitted = eventSpy.args.map(args => args[0]);
|
|
|
|
const checkEventNotEmitted = event => should.ok(!eventsEmitted.includes(event), `${event} event should be emitted`);
|
|
|
|
checkEventNotEmitted('settings.description.added');
|
2019-03-26 06:37:32 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-03-06 14:56:26 +03:00
|
|
|
describe('parse', function () {
|
|
|
|
it('ensure correct parsing when fetching from db', function () {
|
|
|
|
const setting = models.Settings.forge();
|
|
|
|
|
|
|
|
let returns = setting.parse({key: 'is_private', value: 'false'});
|
|
|
|
should.equal(returns.value, false);
|
|
|
|
|
|
|
|
returns = setting.parse({key: 'is_private', value: false});
|
|
|
|
should.equal(returns.value, false);
|
|
|
|
|
|
|
|
returns = setting.parse({key: 'is_private', value: true});
|
|
|
|
should.equal(returns.value, true);
|
|
|
|
|
|
|
|
returns = setting.parse({key: 'is_private', value: 'true'});
|
|
|
|
should.equal(returns.value, true);
|
|
|
|
|
|
|
|
returns = setting.parse({key: 'is_private', value: '0'});
|
|
|
|
should.equal(returns.value, false);
|
|
|
|
|
|
|
|
returns = setting.parse({key: 'is_private', value: '1'});
|
|
|
|
should.equal(returns.value, true);
|
|
|
|
|
|
|
|
returns = setting.parse({key: 'something', value: 'null'});
|
2019-03-11 19:25:45 +03:00
|
|
|
should.equal(returns.value, 'null');
|
2019-03-06 14:56:26 +03:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|