Ghost/ghost/version-notifications-data-service/test/version-notificatons-data-service.test.js
Naz baef69f968 Added Integration name extraction based on API Key data
refs https://github.com/TryGhost/Toolbox/issues/292

- This information is needed for the emails used to notify the instance admins about version mismatch.
- The identification information is different for Content and Admin keys because of their nature. Content API keys send the unique "secret" value in plaintext, Admin API keys send key id (kid) as a part of token payload and that's the easiest accessible information available without a need to query the db in another parts of the system.
2022-05-10 16:26:52 +08:00

186 lines
6.5 KiB
JavaScript

const assert = require('assert');
const sinon = require('sinon');
const VersionNotificationsDataService = require('..');
describe('Version Notification Data Service', function () {
afterEach(function () {
sinon.restore();
});
describe('fetchNotification', function () {
it('parses and filters out version notifications', async function () {
const settingsService = {
read: sinon.stub().resolves({
version_notifications: {
value: JSON.stringify([
'v3.4',
'v4.1',
'v5.0',
'v0.99'
])
}
})
};
const versionNotificationsDataService = new VersionNotificationsDataService({
UserModel: {},
ApiKeyModel: {},
settingsService
});
assert.equal(await versionNotificationsDataService.fetchNotification('v4.1'), 'v4.1');
assert.equal(await versionNotificationsDataService.fetchNotification('v9999.1'), undefined);
assert.equal(await versionNotificationsDataService.fetchNotification('v5'), undefined);
assert.equal(await versionNotificationsDataService.fetchNotification(), undefined);
});
});
describe('saveNotification', function () {
it('parses and filters out version notifications', async function () {
const settingsService = {
read: sinon.stub().resolves({
version_notifications: {
value: JSON.stringify([
'v3.4',
'v4.1',
'v5.0',
'v0.99'
])
}
}),
edit: sinon.stub().resolves()
};
const versionNotificationsDataService = new VersionNotificationsDataService({
UserModel: {},
ApiKeyModel: {},
settingsService
});
await versionNotificationsDataService.saveNotification('v5.0');
assert.equal(settingsService.edit.called, false);
await versionNotificationsDataService.saveNotification('v4.0');
assert.equal(settingsService.edit.called, true);
assert.deepEqual(settingsService.edit.firstCall.args, [[{
key: 'version_notifications',
value: JSON.stringify([
'v3.4',
'v4.1',
'v5.0',
'v0.99',
'v4.0'
])
}], {
context: {
internal: true
}
}]);
});
});
describe('getNotificationEmails', function () {
it('parses and filters out version notifications', async function () {
const UserModel = {
findAll: sinon
.stub()
.withArgs({
withRelated: ['roles'],
filter: 'status:active'
}, {
internal: true
})
.resolves({
toJSON: () => [{
email: 'simon@example.com',
roles: [{
name: 'Administrator'
}]
}, {
email: 'bob@example.com',
roles: [{
name: 'Owner'
}]
}, {
email: 'joe@example.com',
roles: [{
name: 'Publisher'
}]
}]
})
};
const versionNotificationsDataService = new VersionNotificationsDataService({
UserModel,
ApiKeyModel: {},
settingsService: {}
});
const emails = await versionNotificationsDataService.getNotificationEmails();
assert.equal(UserModel.findAll.called, true);
assert.deepEqual(emails, ['simon@example.com', 'bob@example.com']);
});
});
describe('getIntegrationName', function () {
it('Queries for Content API key when such is provided', async function () {
const ApiKeyModel = {
findOne: sinon
.stub()
.withArgs({
secret: 'super_secret'
}, {
withRelated: ['integration']
})
.resolves({
relations: {
integration: {
get: () => 'live fast die young'
}
}
})
};
const versionNotificationsDataService = new VersionNotificationsDataService({
UserModel: {},
ApiKeyModel,
settingsService: {}
});
const integrationName = await versionNotificationsDataService.getIntegrationName('super_secret', 'content');
assert.equal(integrationName, 'live fast die young');
});
it('Queries for Admin API key when such is provided', async function () {
const ApiKeyModel = {
findOne: sinon
.stub()
.withArgs({
id: 'key_id'
}, {
withRelated: ['integration']
})
.resolves({
relations: {
integration: {
get: () => 'Tri Hita Karana'
}
}
})
};
const versionNotificationsDataService = new VersionNotificationsDataService({
UserModel: {},
ApiKeyModel,
settingsService: {}
});
const integrationName = await versionNotificationsDataService.getIntegrationName('key_id', 'admin');
assert.equal(integrationName, 'Tri Hita Karana');
});
});
});