[NEW] Button to download admin server info (#16059)
parent
8014abd343
commit
4f5423ac8f
@ -1,48 +1,30 @@ |
||||
import { Meteor } from 'meteor/meteor'; |
||||
|
||||
import { hasPermission } from '../../../authorization'; |
||||
import { Statistics } from '../../../models'; |
||||
import { API } from '../api'; |
||||
import { getStatistics, getLastStatistics } from '../../../statistics/server'; |
||||
|
||||
API.v1.addRoute('statistics', { authRequired: true }, { |
||||
get() { |
||||
let refresh = false; |
||||
if (typeof this.queryParams.refresh !== 'undefined' && this.queryParams.refresh === 'true') { |
||||
refresh = true; |
||||
} |
||||
|
||||
let stats; |
||||
Meteor.runAsUser(this.userId, () => { |
||||
stats = Meteor.call('getStatistics', refresh); |
||||
}); |
||||
|
||||
return API.v1.success({ |
||||
statistics: stats, |
||||
}); |
||||
const { refresh } = this.requestParams(); |
||||
return API.v1.success(Promise.await(getLastStatistics({ |
||||
userId: this.userId, |
||||
refresh: refresh && refresh === 'true', |
||||
}))); |
||||
}, |
||||
}); |
||||
|
||||
API.v1.addRoute('statistics.list', { authRequired: true }, { |
||||
get() { |
||||
if (!hasPermission(this.userId, 'view-statistics')) { |
||||
return API.v1.unauthorized(); |
||||
} |
||||
|
||||
const { offset, count } = this.getPaginationItems(); |
||||
const { sort, fields, query } = this.parseJsonQuery(); |
||||
|
||||
const statistics = Statistics.find(query, { |
||||
sort: sort || { name: 1 }, |
||||
skip: offset, |
||||
limit: count, |
||||
fields, |
||||
}).fetch(); |
||||
|
||||
return API.v1.success({ |
||||
statistics, |
||||
count: statistics.length, |
||||
return API.v1.success(Promise.await(getStatistics({ |
||||
userId: this.userId, |
||||
query, |
||||
pagination: { |
||||
offset, |
||||
total: Statistics.find(query).count(), |
||||
}); |
||||
count, |
||||
sort, |
||||
fields, |
||||
}, |
||||
}))); |
||||
}, |
||||
}); |
||||
|
@ -0,0 +1,14 @@ |
||||
import { BaseRaw } from './BaseRaw'; |
||||
|
||||
export class StatisticsRaw extends BaseRaw { |
||||
async findLast() { |
||||
const options = { |
||||
sort: { |
||||
createdAt: -1, |
||||
}, |
||||
limit: 1, |
||||
}; |
||||
const records = await this.find({}, options).toArray(); |
||||
return records && records[0]; |
||||
} |
||||
} |
@ -1,165 +0,0 @@ |
||||
import os from 'os'; |
||||
|
||||
import _ from 'underscore'; |
||||
import { Meteor } from 'meteor/meteor'; |
||||
import { InstanceStatus } from 'meteor/konecty:multiple-instances-status'; |
||||
|
||||
import { |
||||
Sessions, |
||||
Settings, |
||||
Users, |
||||
Rooms, |
||||
Subscriptions, |
||||
Uploads, |
||||
Messages, |
||||
LivechatVisitors, |
||||
Integrations, |
||||
} from '../../../models/server'; |
||||
import { settings } from '../../../settings/server'; |
||||
import { Info, getMongoInfo } from '../../../utils/server'; |
||||
import { Migrations } from '../../../migrations/server'; |
||||
import { statistics } from '../statisticsNamespace'; |
||||
import { Apps } from '../../../apps/server'; |
||||
import { getStatistics as federationGetStatistics } from '../../../federation/server/functions/dashboard'; |
||||
|
||||
const wizardFields = [ |
||||
'Organization_Type', |
||||
'Industry', |
||||
'Size', |
||||
'Country', |
||||
'Language', |
||||
'Server_Type', |
||||
'Register_Server', |
||||
]; |
||||
|
||||
statistics.get = function _getStatistics() { |
||||
const statistics = {}; |
||||
|
||||
// Setup Wizard
|
||||
statistics.wizard = {}; |
||||
wizardFields.forEach((field) => { |
||||
const record = Settings.findOne(field); |
||||
if (record) { |
||||
const wizardField = field.replace(/_/g, '').replace(field[0], field[0].toLowerCase()); |
||||
statistics.wizard[wizardField] = record.value; |
||||
} |
||||
}); |
||||
|
||||
// Version
|
||||
statistics.uniqueId = settings.get('uniqueID'); |
||||
if (Settings.findOne('uniqueID')) { |
||||
statistics.installedAt = Settings.findOne('uniqueID').createdAt; |
||||
} |
||||
|
||||
if (Info) { |
||||
statistics.version = Info.version; |
||||
statistics.tag = Info.tag; |
||||
statistics.branch = Info.branch; |
||||
} |
||||
|
||||
// User statistics
|
||||
statistics.totalUsers = Meteor.users.find().count(); |
||||
statistics.activeUsers = Meteor.users.find({ active: true }).count(); |
||||
statistics.nonActiveUsers = statistics.totalUsers - statistics.activeUsers; |
||||
statistics.onlineUsers = Meteor.users.find({ statusConnection: 'online' }).count(); |
||||
statistics.awayUsers = Meteor.users.find({ statusConnection: 'away' }).count(); |
||||
statistics.totalConnectedUsers = statistics.onlineUsers + statistics.awayUsers; |
||||
statistics.offlineUsers = statistics.totalUsers - statistics.onlineUsers - statistics.awayUsers; |
||||
|
||||
// Room statistics
|
||||
statistics.totalRooms = Rooms.find().count(); |
||||
statistics.totalChannels = Rooms.findByType('c').count(); |
||||
statistics.totalPrivateGroups = Rooms.findByType('p').count(); |
||||
statistics.totalDirect = Rooms.findByType('d').count(); |
||||
statistics.totalLivechat = Rooms.findByType('l').count(); |
||||
statistics.totalDiscussions = Rooms.countDiscussions(); |
||||
statistics.totalThreads = Messages.countThreads(); |
||||
|
||||
// livechat visitors
|
||||
statistics.totalLivechatVisitors = LivechatVisitors.find().count(); |
||||
|
||||
// livechat agents
|
||||
statistics.totalLivechatAgents = Users.findAgents().count(); |
||||
|
||||
// livechat enabled
|
||||
statistics.livechatEnabled = settings.get('Livechat_enabled'); |
||||
|
||||
// Message statistics
|
||||
statistics.totalMessages = Messages.find().count(); |
||||
statistics.totalChannelMessages = _.reduce(Rooms.findByType('c', { fields: { msgs: 1 } }).fetch(), function _countChannelMessages(num, room) { return num + room.msgs; }, 0); |
||||
statistics.totalPrivateGroupMessages = _.reduce(Rooms.findByType('p', { fields: { msgs: 1 } }).fetch(), function _countPrivateGroupMessages(num, room) { return num + room.msgs; }, 0); |
||||
statistics.totalDirectMessages = _.reduce(Rooms.findByType('d', { fields: { msgs: 1 } }).fetch(), function _countDirectMessages(num, room) { return num + room.msgs; }, 0); |
||||
statistics.totalLivechatMessages = _.reduce(Rooms.findByType('l', { fields: { msgs: 1 } }).fetch(), function _countLivechatMessages(num, room) { return num + room.msgs; }, 0); |
||||
|
||||
// Federation statistics
|
||||
const federationOverviewData = federationGetStatistics(); |
||||
|
||||
statistics.federatedServers = federationOverviewData.numberOfServers; |
||||
statistics.federatedUsers = federationOverviewData.numberOfFederatedUsers; |
||||
|
||||
statistics.lastLogin = Users.getLastLogin(); |
||||
statistics.lastMessageSentAt = Messages.getLastTimestamp(); |
||||
statistics.lastSeenSubscription = Subscriptions.getLastSeen(); |
||||
|
||||
statistics.os = { |
||||
type: os.type(), |
||||
platform: os.platform(), |
||||
arch: os.arch(), |
||||
release: os.release(), |
||||
uptime: os.uptime(), |
||||
loadavg: os.loadavg(), |
||||
totalmem: os.totalmem(), |
||||
freemem: os.freemem(), |
||||
cpus: os.cpus(), |
||||
}; |
||||
|
||||
statistics.process = { |
||||
nodeVersion: process.version, |
||||
pid: process.pid, |
||||
uptime: process.uptime(), |
||||
}; |
||||
|
||||
statistics.deploy = { |
||||
method: process.env.DEPLOY_METHOD || 'tar', |
||||
platform: process.env.DEPLOY_PLATFORM || 'selfinstall', |
||||
}; |
||||
|
||||
statistics.uploadsTotal = Uploads.find().count(); |
||||
const [result] = Promise.await(Uploads.model.rawCollection().aggregate([{ $group: { _id: 'total', total: { $sum: '$size' } } }]).toArray()); |
||||
statistics.uploadsTotalSize = result ? result.total : 0; |
||||
|
||||
statistics.migration = Migrations._getControl(); |
||||
statistics.instanceCount = InstanceStatus.getCollection().find({ _updatedAt: { $gt: new Date(Date.now() - process.uptime() * 1000 - 2000) } }).count(); |
||||
|
||||
const { oplogEnabled, mongoVersion, mongoStorageEngine } = getMongoInfo(); |
||||
statistics.oplogEnabled = oplogEnabled; |
||||
statistics.mongoVersion = mongoVersion; |
||||
statistics.mongoStorageEngine = mongoStorageEngine; |
||||
|
||||
statistics.uniqueUsersOfYesterday = Sessions.getUniqueUsersOfYesterday(); |
||||
statistics.uniqueUsersOfLastMonth = Sessions.getUniqueUsersOfLastMonth(); |
||||
statistics.uniqueDevicesOfYesterday = Sessions.getUniqueDevicesOfYesterday(); |
||||
statistics.uniqueDevicesOfLastMonth = Sessions.getUniqueDevicesOfLastMonth(); |
||||
statistics.uniqueOSOfYesterday = Sessions.getUniqueOSOfYesterday(); |
||||
statistics.uniqueOSOfLastMonth = Sessions.getUniqueOSOfLastMonth(); |
||||
|
||||
statistics.apps = { |
||||
engineVersion: Info.marketplaceApiVersion, |
||||
enabled: Apps.isEnabled(), |
||||
totalInstalled: Apps.isInitialized() && Apps.getManager().get().length, |
||||
totalActive: Apps.isInitialized() && Apps.getManager().get({ enabled: true }).length, |
||||
}; |
||||
|
||||
const integrations = Integrations.find().fetch(); |
||||
|
||||
statistics.integrations = { |
||||
totalIntegrations: integrations.length, |
||||
totalIncoming: integrations.filter((integration) => integration.type === 'webhook-incoming').length, |
||||
totalIncomingActive: integrations.filter((integration) => integration.enabled === true && integration.type === 'webhook-incoming').length, |
||||
totalOutgoing: integrations.filter((integration) => integration.type === 'webhook-outgoing').length, |
||||
totalOutgoingActive: integrations.filter((integration) => integration.enabled === true && integration.type === 'webhook-outgoing').length, |
||||
totalWithScriptEnabled: integrations.filter((integration) => integration.scriptEnabled === true).length, |
||||
}; |
||||
|
||||
return statistics; |
||||
}; |
@ -0,0 +1,14 @@ |
||||
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; |
||||
import { statistics } from '../lib/statistics'; |
||||
import { Statistics } from '../../../models/server/raw'; |
||||
|
||||
export async function getLastStatistics({ userId, refresh }) { |
||||
if (!await hasPermissionAsync(userId, 'view-statistics')) { |
||||
throw new Error('error-not-allowed'); |
||||
} |
||||
|
||||
if (refresh) { |
||||
return statistics.save(); |
||||
} |
||||
return Statistics.findLast(); |
||||
} |
@ -0,0 +1,26 @@ |
||||
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; |
||||
import { Statistics } from '../../../models/server/raw'; |
||||
|
||||
export async function getStatistics({ userId, query = {}, pagination: { offset, count, sort, fields } }) { |
||||
if (!await hasPermissionAsync(userId, 'view-statistics')) { |
||||
throw new Error('error-not-allowed'); |
||||
} |
||||
|
||||
const cursor = Statistics.find(query, { |
||||
sort: sort || { name: 1 }, |
||||
skip: offset, |
||||
limit: count, |
||||
fields, |
||||
}); |
||||
|
||||
const total = await cursor.count(); |
||||
|
||||
const statistics = await cursor.toArray(); |
||||
|
||||
return { |
||||
statistics, |
||||
count: statistics.length, |
||||
offset, |
||||
total, |
||||
}; |
||||
} |
@ -1,9 +0,0 @@ |
||||
import { Statistics } from '../../../models'; |
||||
import { statistics } from '../statisticsNamespace'; |
||||
|
||||
statistics.save = function() { |
||||
const rcStatistics = statistics.get(); |
||||
rcStatistics.createdAt = new Date(); |
||||
Statistics.insert(rcStatistics); |
||||
return rcStatistics; |
||||
}; |
@ -1,6 +1,6 @@ |
||||
import './functions/get'; |
||||
import './functions/save'; |
||||
import './methods/getStatistics'; |
||||
import './startup/monitor'; |
||||
|
||||
export { statistics } from './statisticsNamespace'; |
||||
export { statistics } from './lib/statistics'; |
||||
export { getLastStatistics } from './functions/getLastStatistics'; |
||||
export { getStatistics } from './functions/getStatistics'; |
||||
|
@ -0,0 +1,173 @@ |
||||
import os from 'os'; |
||||
|
||||
import _ from 'underscore'; |
||||
import { Meteor } from 'meteor/meteor'; |
||||
import { InstanceStatus } from 'meteor/konecty:multiple-instances-status'; |
||||
|
||||
import { |
||||
Sessions, |
||||
Settings, |
||||
Users, |
||||
Rooms, |
||||
Subscriptions, |
||||
Uploads, |
||||
Messages, |
||||
LivechatVisitors, |
||||
Integrations, |
||||
Statistics, |
||||
} from '../../../models/server'; |
||||
import { settings } from '../../../settings/server'; |
||||
import { Info, getMongoInfo } from '../../../utils/server'; |
||||
import { Migrations } from '../../../migrations/server'; |
||||
import { Apps } from '../../../apps/server'; |
||||
import { getStatistics as federationGetStatistics } from '../../../federation/server/functions/dashboard'; |
||||
|
||||
const wizardFields = [ |
||||
'Organization_Type', |
||||
'Industry', |
||||
'Size', |
||||
'Country', |
||||
'Language', |
||||
'Server_Type', |
||||
'Register_Server', |
||||
]; |
||||
|
||||
export const statistics = { |
||||
get: function _getStatistics() { |
||||
const statistics = {}; |
||||
|
||||
// Setup Wizard
|
||||
statistics.wizard = {}; |
||||
wizardFields.forEach((field) => { |
||||
const record = Settings.findOne(field); |
||||
if (record) { |
||||
const wizardField = field.replace(/_/g, '').replace(field[0], field[0].toLowerCase()); |
||||
statistics.wizard[wizardField] = record.value; |
||||
} |
||||
}); |
||||
|
||||
// Version
|
||||
statistics.uniqueId = settings.get('uniqueID'); |
||||
if (Settings.findOne('uniqueID')) { |
||||
statistics.installedAt = Settings.findOne('uniqueID').createdAt; |
||||
} |
||||
|
||||
if (Info) { |
||||
statistics.version = Info.version; |
||||
statistics.tag = Info.tag; |
||||
statistics.branch = Info.branch; |
||||
} |
||||
|
||||
// User statistics
|
||||
statistics.totalUsers = Meteor.users.find().count(); |
||||
statistics.activeUsers = Meteor.users.find({ active: true }).count(); |
||||
statistics.nonActiveUsers = statistics.totalUsers - statistics.activeUsers; |
||||
statistics.onlineUsers = Meteor.users.find({ statusConnection: 'online' }).count(); |
||||
statistics.awayUsers = Meteor.users.find({ statusConnection: 'away' }).count(); |
||||
statistics.totalConnectedUsers = statistics.onlineUsers + statistics.awayUsers; |
||||
statistics.offlineUsers = statistics.totalUsers - statistics.onlineUsers - statistics.awayUsers; |
||||
|
||||
// Room statistics
|
||||
statistics.totalRooms = Rooms.find().count(); |
||||
statistics.totalChannels = Rooms.findByType('c').count(); |
||||
statistics.totalPrivateGroups = Rooms.findByType('p').count(); |
||||
statistics.totalDirect = Rooms.findByType('d').count(); |
||||
statistics.totalLivechat = Rooms.findByType('l').count(); |
||||
statistics.totalDiscussions = Rooms.countDiscussions(); |
||||
statistics.totalThreads = Messages.countThreads(); |
||||
|
||||
// livechat visitors
|
||||
statistics.totalLivechatVisitors = LivechatVisitors.find().count(); |
||||
|
||||
// livechat agents
|
||||
statistics.totalLivechatAgents = Users.findAgents().count(); |
||||
|
||||
// livechat enabled
|
||||
statistics.livechatEnabled = settings.get('Livechat_enabled'); |
||||
|
||||
// Message statistics
|
||||
statistics.totalMessages = Messages.find().count(); |
||||
statistics.totalChannelMessages = _.reduce(Rooms.findByType('c', { fields: { msgs: 1 } }).fetch(), function _countChannelMessages(num, room) { return num + room.msgs; }, 0); |
||||
statistics.totalPrivateGroupMessages = _.reduce(Rooms.findByType('p', { fields: { msgs: 1 } }).fetch(), function _countPrivateGroupMessages(num, room) { return num + room.msgs; }, 0); |
||||
statistics.totalDirectMessages = _.reduce(Rooms.findByType('d', { fields: { msgs: 1 } }).fetch(), function _countDirectMessages(num, room) { return num + room.msgs; }, 0); |
||||
statistics.totalLivechatMessages = _.reduce(Rooms.findByType('l', { fields: { msgs: 1 } }).fetch(), function _countLivechatMessages(num, room) { return num + room.msgs; }, 0); |
||||
|
||||
// Federation statistics
|
||||
const federationOverviewData = federationGetStatistics(); |
||||
|
||||
statistics.federatedServers = federationOverviewData.numberOfServers; |
||||
statistics.federatedUsers = federationOverviewData.numberOfFederatedUsers; |
||||
|
||||
statistics.lastLogin = Users.getLastLogin(); |
||||
statistics.lastMessageSentAt = Messages.getLastTimestamp(); |
||||
statistics.lastSeenSubscription = Subscriptions.getLastSeen(); |
||||
|
||||
statistics.os = { |
||||
type: os.type(), |
||||
platform: os.platform(), |
||||
arch: os.arch(), |
||||
release: os.release(), |
||||
uptime: os.uptime(), |
||||
loadavg: os.loadavg(), |
||||
totalmem: os.totalmem(), |
||||
freemem: os.freemem(), |
||||
cpus: os.cpus(), |
||||
}; |
||||
|
||||
statistics.process = { |
||||
nodeVersion: process.version, |
||||
pid: process.pid, |
||||
uptime: process.uptime(), |
||||
}; |
||||
|
||||
statistics.deploy = { |
||||
method: process.env.DEPLOY_METHOD || 'tar', |
||||
platform: process.env.DEPLOY_PLATFORM || 'selfinstall', |
||||
}; |
||||
|
||||
statistics.uploadsTotal = Uploads.find().count(); |
||||
const [result] = Promise.await(Uploads.model.rawCollection().aggregate([{ $group: { _id: 'total', total: { $sum: '$size' } } }]).toArray()); |
||||
statistics.uploadsTotalSize = result ? result.total : 0; |
||||
|
||||
statistics.migration = Migrations._getControl(); |
||||
statistics.instanceCount = InstanceStatus.getCollection().find({ _updatedAt: { $gt: new Date(Date.now() - process.uptime() * 1000 - 2000) } }).count(); |
||||
|
||||
const { oplogEnabled, mongoVersion, mongoStorageEngine } = getMongoInfo(); |
||||
statistics.oplogEnabled = oplogEnabled; |
||||
statistics.mongoVersion = mongoVersion; |
||||
statistics.mongoStorageEngine = mongoStorageEngine; |
||||
|
||||
statistics.uniqueUsersOfYesterday = Sessions.getUniqueUsersOfYesterday(); |
||||
statistics.uniqueUsersOfLastMonth = Sessions.getUniqueUsersOfLastMonth(); |
||||
statistics.uniqueDevicesOfYesterday = Sessions.getUniqueDevicesOfYesterday(); |
||||
statistics.uniqueDevicesOfLastMonth = Sessions.getUniqueDevicesOfLastMonth(); |
||||
statistics.uniqueOSOfYesterday = Sessions.getUniqueOSOfYesterday(); |
||||
statistics.uniqueOSOfLastMonth = Sessions.getUniqueOSOfLastMonth(); |
||||
|
||||
statistics.apps = { |
||||
engineVersion: Info.marketplaceApiVersion, |
||||
enabled: Apps.isEnabled(), |
||||
totalInstalled: Apps.isInitialized() && Apps.getManager().get().length, |
||||
totalActive: Apps.isInitialized() && Apps.getManager().get({ enabled: true }).length, |
||||
}; |
||||
|
||||
const integrations = Integrations.find().fetch(); |
||||
|
||||
statistics.integrations = { |
||||
totalIntegrations: integrations.length, |
||||
totalIncoming: integrations.filter((integration) => integration.type === 'webhook-incoming').length, |
||||
totalIncomingActive: integrations.filter((integration) => integration.enabled === true && integration.type === 'webhook-incoming').length, |
||||
totalOutgoing: integrations.filter((integration) => integration.type === 'webhook-outgoing').length, |
||||
totalOutgoingActive: integrations.filter((integration) => integration.enabled === true && integration.type === 'webhook-outgoing').length, |
||||
totalWithScriptEnabled: integrations.filter((integration) => integration.scriptEnabled === true).length, |
||||
}; |
||||
|
||||
return statistics; |
||||
}, |
||||
save() { |
||||
const rcStatistics = statistics.get(); |
||||
rcStatistics.createdAt = new Date(); |
||||
Statistics.insert(rcStatistics); |
||||
return rcStatistics; |
||||
}, |
||||
}; |
@ -1,22 +1,15 @@ |
||||
import { Meteor } from 'meteor/meteor'; |
||||
|
||||
import { hasPermission } from '../../../authorization'; |
||||
import { Statistics } from '../../../models'; |
||||
import { statistics } from '../statisticsNamespace'; |
||||
import { getLastStatistics } from '../functions/getLastStatistics'; |
||||
|
||||
Meteor.methods({ |
||||
getStatistics(refresh) { |
||||
if (!Meteor.userId()) { |
||||
throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'getStatistics' }); |
||||
} |
||||
|
||||
if (hasPermission(Meteor.userId(), 'view-statistics') !== true) { |
||||
throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'getStatistics' }); |
||||
} |
||||
|
||||
if (refresh) { |
||||
return statistics.save(); |
||||
} |
||||
return Statistics.findLast(); |
||||
return Promise.await(getLastStatistics({ |
||||
userId: Meteor.userId(), |
||||
refresh, |
||||
})); |
||||
}, |
||||
}); |
||||
|
@ -1 +0,0 @@ |
||||
export const statistics = {}; |
@ -0,0 +1,15 @@ |
||||
export const downloadJsonAsAFile = (jsonData, name = 'jsonfile') => { |
||||
const filename = `${ name }.json`; |
||||
const contentType = 'application/json;charset=utf-8;'; |
||||
if (window.navigator && window.navigator.msSaveOrOpenBlob) { |
||||
const blob = new Blob([decodeURIComponent(encodeURI(JSON.stringify(jsonData)))], { type: contentType }); |
||||
return navigator.msSaveOrOpenBlob(blob, filename); |
||||
} |
||||
const aElement = document.createElement('a'); |
||||
aElement.download = filename; |
||||
aElement.href = `data:${ contentType },${ encodeURIComponent(JSON.stringify(jsonData)) }`; |
||||
aElement.target = '_blank'; |
||||
document.body.appendChild(aElement); |
||||
aElement.click(); |
||||
document.body.removeChild(aElement); |
||||
}; |
@ -0,0 +1,85 @@ |
||||
import { |
||||
getCredentials, |
||||
api, |
||||
request, |
||||
credentials, |
||||
} from '../../data/api-data.js'; |
||||
import { updatePermission } from '../../data/permissions.helper.js'; |
||||
|
||||
describe('[Statistics]', function() { |
||||
this.retries(0); |
||||
|
||||
before((done) => getCredentials(done)); |
||||
|
||||
describe('[/statistics]', () => { |
||||
let lastUptime; |
||||
it('should return an error when the user does not have the necessary permission', (done) => { |
||||
updatePermission('view-statistics', []).then(() => { |
||||
request.get(api('statistics')) |
||||
.set(credentials) |
||||
.expect(400) |
||||
.expect((res) => { |
||||
expect(res.body).to.have.property('success', false); |
||||
expect(res.body.error).to.be.equal('error-not-allowed'); |
||||
}) |
||||
.end(done); |
||||
}); |
||||
}); |
||||
it('should return an object with the statistics', (done) => { |
||||
updatePermission('view-statistics', ['admin']).then(() => { |
||||
request.get(api('statistics')) |
||||
.set(credentials) |
||||
.expect(200) |
||||
.expect((res) => { |
||||
expect(res.body).to.have.property('success', true); |
||||
expect(res.body).to.have.property('process'); |
||||
expect(res.body.process).to.have.property('uptime'); |
||||
lastUptime = res.body.process.uptime; |
||||
}) |
||||
.end(done); |
||||
}); |
||||
}); |
||||
it('should update the statistics when is provided the "refresh:true" query parameter', (done) => { |
||||
request.get(api('statistics?refresh=true')) |
||||
.set(credentials) |
||||
.expect(200) |
||||
.expect((res) => { |
||||
expect(res.body).to.have.property('success', true); |
||||
expect(res.body).to.have.property('process'); |
||||
expect(res.body.process).to.have.property('uptime'); |
||||
expect(lastUptime).to.not.be.equal(res.body.process.uptime); |
||||
}) |
||||
.end(done); |
||||
}); |
||||
}); |
||||
|
||||
describe('[/statistics.list]', () => { |
||||
it('should return an error when the user does not have the necessary permission', (done) => { |
||||
updatePermission('view-statistics', []).then(() => { |
||||
request.get(api('statistics.list')) |
||||
.set(credentials) |
||||
.expect(400) |
||||
.expect((res) => { |
||||
expect(res.body).to.have.property('success', false); |
||||
expect(res.body.error).to.be.equal('error-not-allowed'); |
||||
}) |
||||
.end(done); |
||||
}); |
||||
}); |
||||
it('should return an array with the statistics', (done) => { |
||||
updatePermission('view-statistics', ['admin']).then(() => { |
||||
request.get(api('statistics.list')) |
||||
.set(credentials) |
||||
.expect(200) |
||||
.expect((res) => { |
||||
expect(res.body).to.have.property('success', true); |
||||
expect(res.body).to.have.property('statistics').and.to.be.an('array'); |
||||
expect(res.body).to.have.property('offset'); |
||||
expect(res.body).to.have.property('total'); |
||||
expect(res.body).to.have.property('count'); |
||||
}) |
||||
.end(done); |
||||
}); |
||||
}); |
||||
}); |
||||
}); |
Loading…
Reference in new issue