mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
1,271 lines (1,016 loc) • 49 kB
JavaScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import fs from 'fs';
import assert from 'assert';
import nock from 'nock';
import * as Actions from 'actions/admin';
import {Client4} from 'client';
import {RequestStatus, Stats} from '../constants';
import TestHelper from 'test/test_helper';
import configureStore from 'test/test_store';
const OK_RESPONSE = {status: 'OK'};
const NO_GROUPS_RESPONSE = {count: 0, groups: []};
const samlIdpUrl = 'http://idpurl';
const samlIdpDescriptorUrl = 'http://idpdescriptorurl';
const samlIdpPublicCertificateText = 'MIIC4jCCAcqgAwIBAgIQE9soWni/eL9ChsWeJCEKNDANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJBREZTIFNpZ25pbmcgLSBhZGZzLnBhcm5hc2FkZXYuY29tMB4XDTE2MDcwMTE1MDgwN1oXDTE3MDcwMTE1MDgwN1owLTErMCkGA1UEAxMiQURGUyBTaWduaW5nIC0gYWRmcy5wYXJuYXNhZGV2LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANDxoju4k5q4H6sQ5v4/4wQSgrE9+ybLnz6+HPdmGd9gAS0qVafy8P1FbciEe+cBkpConYAMdGcBjmEdFOu5OAjsBgov1GMIHaPy4SwEyfn/FDmYSjCUSm7s5pxouAMP5mRJLdApQNwGeNxQNuFCUu3aM6X29ba/twwyQVaKIf1U1HVOY2UEs/X7qKU4ECwTy3Nxt1gaMISTPwxRU+d5dHbbI+2GKqzTriJd4alMHqnbBNWuuIDggOYT/zaRnGl9DAW/F6XgloWdO6SROnXH056fTZs7O5nJ9en9F82r7NOq5rBr/KI+R9eUlJHhfr/FtCYRrnPfTuubRFF2XtmrFwECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAhZwCiYNFO2BuLH1UWmqG9lN7Ns/GjRDOuTt0hOUPHYFy2Es5iqmEakRrnecTz5KJxrO7SguaVK+VvTtssWszFnB2kRWIF98B2yjEjXjJHO1UhqjcKwbZScmmTukWf6lqlz+5uqyqPS/rxcNsBgNIwsJCl0z44Y5XHgpgGs+DXQx39RMyAvlmPWUY5dELVxAiEzKkOXAGDeJ5wIqiT61rmPkQuGjUBb/DZiFFBYmbp7npjVOb5XBrLErndIrHYiTZuIhpwCS+J3LHAOIL3eKD4iUcyB/lZjF6py1E2h+xVbpxHF9ENKQjsLkDjzIdhP269Gh8YUoOxkG63TXq8n6a3A==';
describe('Actions.Admin', () => {
let store;
beforeAll(async () => {
await TestHelper.initBasic(Client4);
});
beforeEach(async () => {
store = await configureStore();
});
afterAll(async () => {
await TestHelper.tearDown();
});
it('getLogs', async () => {
nock(Client4.getBaseRoute()).
get('/logs').
query(true).
reply(200, [
'[2017/04/04 14:56:19 EDT] [INFO] Starting Server...',
'[2017/04/04 14:56:19 EDT] [INFO] Server is listening on :8065',
'[2017/04/04 15:01:48 EDT] [INFO] Stopping Server...',
'[2017/04/04 15:01:48 EDT] [INFO] Closing SqlStore',
]);
await Actions.getLogs()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getLogs;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLogs request failed');
}
const logs = state.entities.admin.logs;
assert.ok(logs);
assert.ok(logs.length > 0);
});
it('getAudits', async () => {
nock(Client4.getBaseRoute()).
get('/audits').
query(true).
reply(200, [
{
id: 'z6ghakhm5brsub66cjhz9yb9za',
create_at: 1491331476323,
user_id: 'ua7yqgjiq3dabc46ianp3yfgty',
action: '/api/v4/teams/o5pjxhkq8br8fj6xnidt7hm3ja',
extra_info: '',
ip_address: '127.0.0.1',
session_id: 'u3yb6bqe6fg15bu4stzyto8rgh',
},
]);
await Actions.getAudits()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getAudits;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getAudits request failed');
}
const audits = state.entities.admin.audits;
assert.ok(audits);
assert.ok(Object.keys(audits).length > 0);
});
it('getConfig', async () => {
nock(Client4.getBaseRoute()).
get('/config').
reply(200, {
TeamSettings: {
SiteName: 'Mattermost',
},
});
nock(Client4.getBaseRoute()).
get('/terms_of_service').
reply(200, {
create_at: 1537976679426,
id: '1234',
text: 'Terms of Service',
user_id: '1',
});
await Actions.getConfig()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getConfig;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getConfig request failed');
}
const config = state.entities.admin.config;
assert.ok(config);
assert.ok(config.TeamSettings);
assert.ok(config.TeamSettings.SiteName === 'Mattermost');
});
it('updateConfig', async () => {
nock(Client4.getBaseRoute()).
get('/config').
reply(200, {
TeamSettings: {
SiteName: 'Mattermost',
},
});
nock(Client4.getBaseRoute()).
post('/terms_of_service').
reply(201, {
create_at: 1537976679426,
id: '1234',
text: 'Terms of Service',
user_id: '1',
});
const {data} = await Actions.getConfig()(store.dispatch, store.getState);
const updated = JSON.parse(JSON.stringify(data));
const oldSiteName = updated.TeamSettings.SiteName;
const testSiteName = 'MattermostReduxTest';
updated.TeamSettings.SiteName = testSiteName;
nock(Client4.getBaseRoute()).
put('/config').
reply(200, updated);
await Actions.updateConfig(updated)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.updateConfig;
if (request.status === RequestStatus.FAILURE) {
throw new Error('updateConfig request failed');
}
const config = state.entities.admin.config;
assert.ok(config);
assert.ok(config.TeamSettings);
assert.ok(config.TeamSettings.SiteName === testSiteName);
updated.TeamSettings.SiteName = oldSiteName;
nock(Client4.getBaseRoute()).
put('/config').
reply(200, updated);
await Actions.updateConfig(updated)(store.dispatch, store.getState);
});
it('reloadConfig', async () => {
nock(Client4.getBaseRoute()).
post('/config/reload').
reply(200, OK_RESPONSE);
await Actions.reloadConfig()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.reloadConfig;
if (request.status === RequestStatus.FAILURE) {
throw new Error('reloadConfig request failed');
}
});
it('getEnvironmentConfig', async () => {
nock(Client4.getBaseRoute()).
get('/config/environment').
reply(200, {
ServiceSettings: {
SiteURL: true,
},
TeamSettings: {
SiteName: true,
},
});
await store.dispatch(Actions.getEnvironmentConfig());
const state = store.getState();
const request = state.requests.admin.getEnvironmentConfig;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getEnvironmentConfig request failed');
}
const config = state.entities.admin.environmentConfig;
assert.ok(config);
assert.ok(config.ServiceSettings);
assert.ok(config.ServiceSettings.SiteURL);
assert.ok(config.TeamSettings);
assert.ok(config.TeamSettings.SiteName);
});
it('testEmail', async () => {
nock(Client4.getBaseRoute()).
get('/config').
reply(200, {});
const {data: config} = await Actions.getConfig()(store.dispatch, store.getState);
nock(Client4.getBaseRoute()).
post('/email/test').
reply(200, OK_RESPONSE);
await Actions.testEmail(config)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.testEmail;
if (request.status === RequestStatus.FAILURE) {
throw new Error('testEmail request failed');
}
});
it('testSiteURL', async () => {
nock(Client4.getBaseRoute()).
post('/site_url/test').
reply(200, OK_RESPONSE);
await Actions.testSiteURL('http://lo.cal')(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.testSiteURL;
if (request.status === RequestStatus.FAILURE) {
throw new Error('testSiteURL request failed');
}
});
it('testS3Connection', async () => {
nock(Client4.getBaseRoute()).
get('/config').
reply(200, {});
const {data: config} = await Actions.getConfig()(store.dispatch, store.getState);
nock(Client4.getBaseRoute()).
post('/file/s3_test').
reply(200, OK_RESPONSE);
await Actions.testS3Connection(config)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.testS3Connection;
if (request.status === RequestStatus.FAILURE) {
throw new Error('testS3Connection request failed');
}
});
it('invalidateCaches', async () => {
nock(Client4.getBaseRoute()).
post('/caches/invalidate').
reply(200, OK_RESPONSE);
await Actions.invalidateCaches()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.invalidateCaches;
if (request.status === RequestStatus.FAILURE) {
throw new Error('invalidateCaches request failed');
}
});
it('recycleDatabase', async () => {
nock(Client4.getBaseRoute()).
post('/database/recycle').
reply(200, OK_RESPONSE);
await Actions.recycleDatabase()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.recycleDatabase;
if (request.status === RequestStatus.FAILURE) {
throw new Error('recycleDatabase request failed');
}
});
it('createComplianceReport', async () => {
const job = {
desc: 'testjob',
emails: 'joram@example.com',
keywords: 'testkeyword',
start_at: 1457654400000,
end_at: 1458000000000,
};
nock(Client4.getBaseRoute()).
post('/compliance/reports').
reply(201, {
id: 'six4h67ja7ntdkek6g13dp3wka',
create_at: 1491399241953,
user_id: 'ua7yqgjiq3dabc46ianp3yfgty',
status: 'running',
count: 0,
desc: 'testjob',
type: 'adhoc',
start_at: 1457654400000,
end_at: 1458000000000,
keywords: 'testkeyword',
emails: 'joram@example.com',
});
const {data: created} = await Actions.createComplianceReport(job)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.createCompliance;
if (request.status === RequestStatus.FAILURE) {
throw new Error('createComplianceReport request failed');
}
const reports = state.entities.admin.complianceReports;
assert.ok(reports);
assert.ok(reports[created.id]);
});
it('getComplianceReport', async () => {
const job = {
desc: 'testjob',
emails: 'joram@example.com',
keywords: 'testkeyword',
start_at: 1457654400000,
end_at: 1458000000000,
};
nock(Client4.getBaseRoute()).
post('/compliance/reports').
reply(201, {
id: 'six4h67ja7ntdkek6g13dp3wka',
create_at: 1491399241953,
user_id: 'ua7yqgjiq3dabc46ianp3yfgty',
status: 'running',
count: 0,
desc: 'testjob',
type: 'adhoc',
start_at: 1457654400000,
end_at: 1458000000000,
keywords: 'testkeyword',
emails: 'joram@example.com',
});
const {data: report} = await Actions.createComplianceReport(job)(store.dispatch, store.getState);
nock(Client4.getBaseRoute()).
get(`/compliance/reports/${report.id}`).
reply(200, report);
await Actions.getComplianceReport(report.id)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getCompliance;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getComplianceReport request failed err=' + request.error);
}
const reports = state.entities.admin.complianceReports;
assert.ok(reports);
assert.ok(reports[report.id]);
});
it('getComplianceReports', async () => {
const job = {
desc: 'testjob',
emails: 'joram@example.com',
keywords: 'testkeyword',
start_at: 1457654400000,
end_at: 1458000000000,
};
nock(Client4.getBaseRoute()).
post('/compliance/reports').
reply(201, {
id: 'six4h67ja7ntdkek6g13dp3wka',
create_at: 1491399241953,
user_id: 'ua7yqgjiq3dabc46ianp3yfgty',
status: 'running',
count: 0,
desc: 'testjob',
type: 'adhoc',
start_at: 1457654400000,
end_at: 1458000000000,
keywords: 'testkeyword',
emails: 'joram@example.com',
});
const {data: report} = await Actions.createComplianceReport(job)(store.dispatch, store.getState);
nock(Client4.getBaseRoute()).
get('/compliance/reports').
query(true).
reply(200, [report]);
await Actions.getComplianceReports()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getCompliance;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getComplianceReports request failed err=' + request.error);
}
const reports = state.entities.admin.complianceReports;
assert.ok(reports);
assert.ok(reports[report.id]);
});
it('uploadBrandImage', async () => {
const testImageData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/brand/image').
reply(200, OK_RESPONSE);
await Actions.uploadBrandImage(testImageData)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadBrandImage;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadBrandImage request failed');
}
});
it('deleteBrandImage', async () => {
nock(Client4.getBaseRoute()).
delete('/brand/image').
reply(200, OK_RESPONSE);
await Actions.deleteBrandImage()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.deleteBrandImage;
if (request.status === RequestStatus.FAILURE) {
throw new Error('deleteBrandImage request failed');
}
});
it('getClusterStatus', async () => {
nock(Client4.getBaseRoute()).
get('/cluster/status').
reply(200, [
{
id: 'someid',
version: 'someversion',
},
]);
await Actions.getClusterStatus()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getClusterStatus;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getClusterStatus request failed');
}
const clusterInfo = state.entities.admin.clusterInfo;
assert.ok(clusterInfo);
assert.ok(clusterInfo.length === 1);
assert.ok(clusterInfo[0].id === 'someid');
});
it('testLdap', async () => {
nock(Client4.getBaseRoute()).
post('/ldap/test').
reply(200, OK_RESPONSE);
await Actions.testLdap()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.testLdap;
if (request.status === RequestStatus.FAILURE) {
throw new Error('testLdap request failed err=' + request.error);
}
});
it('syncLdap', async () => {
nock(Client4.getBaseRoute()).
post('/ldap/sync').
reply(200, OK_RESPONSE);
await Actions.syncLdap()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.syncLdap;
if (request.status === RequestStatus.FAILURE) {
throw new Error('syncLdap request failed err=' + request.error);
}
});
it('getSamlCertificateStatus', async () => {
nock(Client4.getBaseRoute()).
get('/saml/certificate/status').
reply(200, {
public_certificate_file: true,
private_key_file: true,
idp_certificate_file: true,
});
await Actions.getSamlCertificateStatus()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getSamlCertificateStatus;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getSamlCertificateStatus request failed err=' + request.error);
}
const certStatus = state.entities.admin.samlCertStatus;
assert.ok(certStatus);
assert.ok(certStatus.idp_certificate_file);
assert.ok(certStatus.private_key_file);
assert.ok(certStatus.public_certificate_file);
});
it('uploadPublicSamlCertificate', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/saml/certificate/public').
reply(200, OK_RESPONSE);
await Actions.uploadPublicSamlCertificate(testFileData)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadPublicSamlCertificate;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPublicSamlCertificate request failed err=' + request.error);
}
});
it('uploadPrivateSamlCertificate', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/saml/certificate/private').
reply(200, OK_RESPONSE);
await Actions.uploadPrivateSamlCertificate(testFileData)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadPrivateSamlCertificate;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPrivateSamlCertificate request failed err=' + request.error);
}
});
it('uploadIdpSamlCertificate', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/saml/certificate/idp').
reply(200, OK_RESPONSE);
await Actions.uploadIdpSamlCertificate(testFileData)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadIdpSamlCertificate;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadIdpSamlCertificate request failed err=' + request.error);
}
});
it('removePublicSamlCertificate', async () => {
nock(Client4.getBaseRoute()).
delete('/saml/certificate/public').
reply(200, OK_RESPONSE);
await Actions.removePublicSamlCertificate()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.removePublicSamlCertificate;
if (request.status === RequestStatus.FAILURE) {
throw new Error('removePublicSamlCertificate request failed err=' + request.error);
}
});
it('removePrivateSamlCertificate', async () => {
nock(Client4.getBaseRoute()).
delete('/saml/certificate/private').
reply(200, OK_RESPONSE);
await Actions.removePrivateSamlCertificate()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.removePrivateSamlCertificate;
if (request.status === RequestStatus.FAILURE) {
throw new Error('removePrivateSamlCertificate request failed err=' + request.error);
}
});
it('removeIdpSamlCertificate', async () => {
nock(Client4.getBaseRoute()).
delete('/saml/certificate/idp').
reply(200, OK_RESPONSE);
await Actions.removeIdpSamlCertificate()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.removeIdpSamlCertificate;
if (request.status === RequestStatus.FAILURE) {
throw new Error('removeIdpSamlCertificate request failed err=' + request.error);
}
});
it('uploadPublicLdapCertificate', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/ldap/certificate/public').
reply(200, OK_RESPONSE);
const request = await Actions.uploadPublicLdapCertificate(testFileData)(store.dispatch, store.getState);
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPublicLdapCertificate request failed err=' + request.error);
}
});
it('uploadPrivateLdapCertificate', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/ldap/certificate/private').
reply(200, OK_RESPONSE);
const request = await Actions.uploadPrivateLdapCertificate(testFileData)(store.dispatch, store.getState);
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPrivateLdapCertificate request failed err=' + request.error);
}
});
it('removePublicLdapCertificate', async () => {
nock(Client4.getBaseRoute()).
delete('/ldap/certificate/public').
reply(200, OK_RESPONSE);
const request = await Actions.removePublicLdapCertificate()(store.dispatch, store.getState);
if (request.status === RequestStatus.FAILURE) {
throw new Error('removePublicLdapCertificate request failed err=' + request.error);
}
});
it('removePrivateLdapCertificate', async () => {
nock(Client4.getBaseRoute()).
delete('/ldap/certificate/private').
reply(200, OK_RESPONSE);
const request = await Actions.removePrivateLdapCertificate()(store.dispatch, store.getState);
if (request.status === RequestStatus.FAILURE) {
throw new Error('removePrivateLdapCertificate request failed err=' + request.error);
}
});
it('testElasticsearch', async () => {
nock(Client4.getBaseRoute()).
post('/elasticsearch/test').
reply(200, OK_RESPONSE);
await Actions.testElasticsearch({})(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.testElasticsearch;
if (request.status === RequestStatus.FAILURE) {
throw new Error('testElasticsearch request failed err=' + request.error);
}
});
it('purgeElasticsearchIndexes', async () => {
nock(Client4.getBaseRoute()).
post('/elasticsearch/purge_indexes').
reply(200, OK_RESPONSE);
await Actions.purgeElasticsearchIndexes()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.purgeElasticsearchIndexes;
if (request.status === RequestStatus.FAILURE) {
throw new Error('purgeElasticsearchIndexes request failed err=' + request.error);
}
});
it('uploadLicense', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
nock(Client4.getBaseRoute()).
post('/license').
reply(200, OK_RESPONSE);
await Actions.uploadLicense(testFileData)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadLicense;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadLicense request failed err=' + request.error);
}
});
it('removeLicense', async () => {
nock(Client4.getBaseRoute()).
delete('/license').
reply(200, OK_RESPONSE);
await Actions.removeLicense()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.removeLicense;
if (request.status === RequestStatus.FAILURE) {
throw new Error('removeLicense request failed err=' + request.error);
}
});
it('getStandardAnalytics', async () => {
nock(Client4.getBaseRoute()).
get('/analytics/old').
query(true).
times(2).
reply(200, [{name: 'channel_open_count', value: 495}, {name: 'channel_private_count', value: 19}, {name: 'post_count', value: 2763}, {name: 'unique_user_count', value: 316}, {name: 'team_count', value: 159}, {name: 'total_websocket_connections', value: 1}, {name: 'total_master_db_connections', value: 8}, {name: 'total_read_db_connections', value: 0}, {name: 'daily_active_users', value: 22}, {name: 'monthly_active_users', value: 114}, {name: 'registered_users', value: 500}]);
await Actions.getStandardAnalytics()(store.dispatch, store.getState);
await Actions.getStandardAnalytics(TestHelper.basicTeam.id)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getAnalytics;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getAnalytics request failed');
}
const analytics = state.entities.admin.analytics;
assert.ok(analytics);
assert.ok(analytics[Stats.TOTAL_PUBLIC_CHANNELS] > 0);
const teamAnalytics = state.entities.admin.teamAnalytics;
assert.ok(teamAnalytics);
assert.ok(teamAnalytics[TestHelper.basicTeam.id]);
assert.ok(teamAnalytics[TestHelper.basicTeam.id][Stats.TOTAL_PUBLIC_CHANNELS] > 0);
});
it('getAdvancedAnalytics', async () => {
nock(Client4.getBaseRoute()).
get('/analytics/old').
query(true).
times(2).
reply(200, [{name: 'file_post_count', value: 24}, {name: 'hashtag_post_count', value: 876}, {name: 'incoming_webhook_count', value: 16}, {name: 'outgoing_webhook_count', value: 18}, {name: 'command_count', value: 14}, {name: 'session_count', value: 149}]);
await Actions.getAdvancedAnalytics()(store.dispatch, store.getState);
await Actions.getAdvancedAnalytics(TestHelper.basicTeam.id)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getAnalytics;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getAnalytics request failed');
}
const analytics = state.entities.admin.analytics;
assert.ok(analytics);
assert.ok(analytics[Stats.TOTAL_SESSIONS] > 0);
const teamAnalytics = state.entities.admin.teamAnalytics;
assert.ok(teamAnalytics);
assert.ok(teamAnalytics[TestHelper.basicTeam.id]);
assert.ok(teamAnalytics[TestHelper.basicTeam.id][Stats.TOTAL_SESSIONS] > 0);
});
it('getPostsPerDayAnalytics', async () => {
nock(Client4.getBaseRoute()).
get('/analytics/old').
query(true).
times(2).
reply(200, [{name: '2017-06-18', value: 16}, {name: '2017-06-16', value: 209}, {name: '2017-06-12', value: 35}, {name: '2017-06-08', value: 227}, {name: '2017-06-07', value: 27}, {name: '2017-06-06', value: 136}, {name: '2017-06-05', value: 127}, {name: '2017-06-04', value: 39}, {name: '2017-06-02', value: 3}, {name: '2017-05-31', value: 52}, {name: '2017-05-30', value: 52}, {name: '2017-05-29', value: 9}, {name: '2017-05-26', value: 198}, {name: '2017-05-25', value: 144}, {name: '2017-05-24', value: 1130}, {name: '2017-05-23', value: 146}]);
await Actions.getPostsPerDayAnalytics()(store.dispatch, store.getState);
await Actions.getPostsPerDayAnalytics(TestHelper.basicTeam.id)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getAnalytics;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getAnalytics request failed');
}
const analytics = state.entities.admin.analytics;
assert.ok(analytics);
assert.ok(analytics[Stats.POST_PER_DAY]);
const teamAnalytics = state.entities.admin.teamAnalytics;
assert.ok(teamAnalytics);
assert.ok(teamAnalytics[TestHelper.basicTeam.id]);
assert.ok(teamAnalytics[TestHelper.basicTeam.id][Stats.POST_PER_DAY]);
});
it('getUsersPerDayAnalytics', async () => {
nock(Client4.getBaseRoute()).
get('/analytics/old').
query(true).
times(2).
reply(200, [{name: '2017-06-18', value: 2}, {name: '2017-06-16', value: 47}, {name: '2017-06-12', value: 4}, {name: '2017-06-08', value: 55}, {name: '2017-06-07', value: 2}, {name: '2017-06-06', value: 1}, {name: '2017-06-05', value: 2}, {name: '2017-06-04', value: 13}, {name: '2017-06-02', value: 1}, {name: '2017-05-31', value: 3}, {name: '2017-05-30', value: 4}, {name: '2017-05-29', value: 3}, {name: '2017-05-26', value: 40}, {name: '2017-05-25', value: 26}, {name: '2017-05-24', value: 43}, {name: '2017-05-23', value: 3}]);
await Actions.getUsersPerDayAnalytics()(store.dispatch, store.getState);
await Actions.getUsersPerDayAnalytics(TestHelper.basicTeam.id)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getAnalytics;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getAnalytics request failed');
}
const analytics = state.entities.admin.analytics;
assert.ok(analytics);
assert.ok(analytics[Stats.USERS_WITH_POSTS_PER_DAY]);
const teamAnalytics = state.entities.admin.teamAnalytics;
assert.ok(teamAnalytics);
assert.ok(teamAnalytics[TestHelper.basicTeam.id]);
assert.ok(teamAnalytics[TestHelper.basicTeam.id][Stats.USERS_WITH_POSTS_PER_DAY]);
});
it('overwritePlugin', async () => {
const data1 = fs.createReadStream('test/setup.js');
const data2 = fs.createReadStream('test/setup.js');
const testPlugin = {id: 'testplugin', webapp: {bundle_path: '/static/somebundle.js'}};
nock(Client4.getBaseRoute()).
post('/plugins', (body) => {
return !body.match(/Content-Disposition: form-data; name="force"\r\n\r\ntrue\r\n/);
}).
reply(200, testPlugin);
await Actions.uploadPlugin(data1, false)(store.dispatch, store.getState);
nock(Client4.getBaseRoute()).
post('/plugins', (body) => {
return body.match(/Content-Disposition: form-data; name="force"\r\n\r\ntrue\r\n/);
}).
reply(200, testPlugin);
await Actions.uploadPlugin(data2, true)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadPlugin;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPlugin request failed err=' + request.error);
}
});
it('uploadPlugin', async () => {
const testFileData = fs.createReadStream('test/assets/images/test.png');
const testPlugin = {id: 'testplugin', webapp: {bundle_path: '/static/somebundle.js'}};
nock(Client4.getBaseRoute()).
post('/plugins').
reply(200, testPlugin);
await Actions.uploadPlugin(testFileData, false)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.uploadPlugin;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPlugin request failed err=' + request.error);
}
});
it('overwriteInstallPlugin', async () => {
const downloadUrl = 'testplugin.tar.gz';
const testPlugin = {id: 'testplugin', webapp: {bundle_path: '/static/somebundle.js'}};
let urlMatch = `/plugins/install_from_url?plugin_download_url=${downloadUrl}&force=false`;
nock(Client4.getBaseRoute()).
post(urlMatch).
reply(200, testPlugin);
await Actions.installPluginFromUrl(downloadUrl, false)(store.dispatch, store.getState);
let state = store.getState();
let request = state.requests.admin.installPluginFromUrl;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPlugin request failed err=' + request.error);
}
urlMatch = `/plugins/install_from_url?plugin_download_url=${downloadUrl}&force=true`;
nock(Client4.getBaseRoute()).
post(urlMatch).
reply(200, testPlugin);
await Actions.installPluginFromUrl(downloadUrl, true)(store.dispatch, store.getState);
state = store.getState();
request = state.requests.admin.installPluginFromUrl;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPlugin request failed err=' + request.error);
}
});
it('installPluginFromUrl', async () => {
const downloadUrl = 'testplugin.tar.gz';
const testPlugin = {id: 'testplugin', webapp: {bundle_path: '/static/somebundle.js'}};
const urlMatch = `/plugins/install_from_url?plugin_download_url=${downloadUrl}&force=false`;
nock(Client4.getBaseRoute()).
post(urlMatch).
reply(200, testPlugin);
await Actions.installPluginFromUrl(downloadUrl, false)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.installPluginFromUrl;
if (request.status === RequestStatus.FAILURE) {
throw new Error('uploadPlugin request failed err=' + request.error);
}
});
it('getPlugins', async () => {
const testPlugin = {id: 'testplugin', webapp: {bundle_path: '/static/somebundle.js'}};
const testPlugin2 = {id: 'testplugin2', webapp: {bundle_path: '/static/somebundle.js'}};
nock(Client4.getBaseRoute()).
get('/plugins').
reply(200, {active: [testPlugin], inactive: [testPlugin2]});
await Actions.getPlugins()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getPlugins;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getPlugins request failed err=' + request.error);
}
const plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(plugins[testPlugin.id]);
assert.ok(plugins[testPlugin.id].active);
assert.ok(plugins[testPlugin2.id]);
assert.ok(!plugins[testPlugin2.id].active);
});
it('getPluginStatuses', async () => {
const testPluginStatus = {
plugin_id: 'testplugin',
state: 1,
};
const testPluginStatus2 = {
plugin_id: 'testplugin2',
state: 0,
};
nock(Client4.getBaseRoute()).
get('/plugins/statuses').
reply(200, [testPluginStatus, testPluginStatus2]);
await Actions.getPluginStatuses()(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getPluginStatuses;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getPluginStatuses request failed err=' + request.error);
}
const pluginStatuses = state.entities.admin.pluginStatuses;
assert.ok(pluginStatuses);
assert.ok(pluginStatuses[testPluginStatus.plugin_id]);
assert.ok(pluginStatuses[testPluginStatus.plugin_id].active);
assert.ok(pluginStatuses[testPluginStatus2.plugin_id]);
assert.ok(!pluginStatuses[testPluginStatus2.plugin_id].active);
});
it('removePlugin', async () => {
const testPlugin = {id: 'testplugin3', webapp: {bundle_path: '/static/somebundle.js'}};
nock(Client4.getBaseRoute()).
get('/plugins').
reply(200, {active: [], inactive: [testPlugin]});
await Actions.getPlugins()(store.dispatch, store.getState);
let state = store.getState();
let plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(plugins[testPlugin.id]);
nock(Client4.getBaseRoute()).
delete(`/plugins/${testPlugin.id}`).
reply(200, OK_RESPONSE);
await Actions.removePlugin(testPlugin.id)(store.dispatch, store.getState);
const request = state.requests.admin.removePlugin;
if (request.status === RequestStatus.FAILURE) {
throw new Error('removePlugin request failed err=' + request.error);
}
state = store.getState();
plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(!plugins[testPlugin.id]);
});
it('enablePlugin', async () => {
const testPlugin = {id: TestHelper.generateId(), webapp: {bundle_path: '/static/somebundle.js'}};
nock(Client4.getBaseRoute()).
get('/plugins').
reply(200, {active: [], inactive: [testPlugin]});
await Actions.getPlugins()(store.dispatch, store.getState);
let state = store.getState();
let plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(plugins[testPlugin.id]);
assert.ok(!plugins[testPlugin.id].active);
nock(Client4.getBaseRoute()).
post(`/plugins/${testPlugin.id}/enable`).
reply(200, OK_RESPONSE);
await Actions.enablePlugin(testPlugin.id)(store.dispatch, store.getState);
const request = state.requests.admin.enablePlugin;
if (request.status === RequestStatus.FAILURE) {
throw new Error(request.error);
}
state = store.getState();
plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(plugins[testPlugin.id]);
assert.ok(plugins[testPlugin.id].active);
});
it('disablePlugin', async () => {
const testPlugin = {id: TestHelper.generateId(), webapp: {bundle_path: '/static/somebundle.js'}};
nock(Client4.getBaseRoute()).
get('/plugins').
reply(200, {active: [testPlugin], inactive: []});
await Actions.getPlugins()(store.dispatch, store.getState);
let state = store.getState();
let plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(plugins[testPlugin.id]);
assert.ok(plugins[testPlugin.id].active);
nock(Client4.getBaseRoute()).
post(`/plugins/${testPlugin.id}/disable`).
reply(200, OK_RESPONSE);
await Actions.disablePlugin(testPlugin.id)(store.dispatch, store.getState);
const request = state.requests.admin.disablePlugin;
if (request.status === RequestStatus.FAILURE) {
throw new Error(request.error);
}
state = store.getState();
plugins = state.entities.admin.plugins;
assert.ok(plugins);
assert.ok(plugins[testPlugin.id]);
assert.ok(!plugins[testPlugin.id].active);
});
it('getLdapGroups', async () => {
const ldapGroups = {
count: 2,
groups: [
{primary_key: 'test1', name: 'test1', mattermost_group_id: null, has_syncables: false},
{primary_key: 'test2', name: 'test2', mattermost_group_id: 'mattermost-id', has_syncables: true},
],
};
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100').
reply(200, ldapGroups);
await Actions.getLdapGroups(0, 100, null)(store.dispatch, store.getState);
const state = store.getState();
const request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
const groups = state.entities.admin.ldapGroups;
assert.ok(groups);
assert.ok(groups[ldapGroups.groups[0].primary_key]);
assert.ok(groups[ldapGroups.groups[1].primary_key]);
});
it('getLdapGroups is_linked', async () => {
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100&q=&is_linked=true').
reply(200, NO_GROUPS_RESPONSE);
await Actions.getLdapGroups(0, 100, {q: '', is_linked: true})(store.dispatch, store.getState);
let state = store.getState();
let request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100&q=&is_linked=false').
reply(200, NO_GROUPS_RESPONSE);
await Actions.getLdapGroups(0, 100, {q: '', is_linked: false})(store.dispatch, store.getState);
state = store.getState();
request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
});
it('getLdapGroups is_configured', async () => {
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100&q=&is_configured=true').
reply(200, NO_GROUPS_RESPONSE);
await Actions.getLdapGroups(0, 100, {q: '', is_configured: true})(store.dispatch, store.getState);
let state = store.getState();
let request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100&q=&is_configured=false').
reply(200, NO_GROUPS_RESPONSE);
await Actions.getLdapGroups(0, 100, {q: '', is_configured: false})(store.dispatch, store.getState);
state = store.getState();
request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
});
it('getLdapGroups with name query', async () => {
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100&q=est').
reply(200, NO_GROUPS_RESPONSE);
await Actions.getLdapGroups(0, 100, {q: 'est'})(store.dispatch, store.getState);
let state = store.getState();
let request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100&q=esta').
reply(200, NO_GROUPS_RESPONSE);
await Actions.getLdapGroups(0, 100, {q: 'esta'})(store.dispatch, store.getState);
state = store.getState();
request = state.requests.admin.getLdapGroups;
if (request.status === RequestStatus.FAILURE) {
throw new Error('getLdapGroups request failed err=' + request.error);
}
});
it('linkLdapGroup', async () => {
const ldapGroups = {
count: 2,
groups: [
{primary_key: 'test1', name: 'test1', mattermost_group_id: null, has_syncables: false},
{primary_key: 'test2', name: 'test2', mattermost_group_id: 'mattermost-id', has_syncables: true},
],
};
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100').
reply(200, ldapGroups);
await Actions.getLdapGroups(0, 100, null)(store.dispatch, store.getState);
const key = 'test1';
nock(Client4.getBaseRoute()).
post(`/ldap/groups/${key}/link`).
reply(200, {display_name: 'test1', id: 'new-mattermost-id'});
await Actions.linkLdapGroup(key)(store.dispatch, store.getState);
const state = store.getState();
const groups = state.entities.admin.ldapGroups;
assert.ok(groups[key]);
assert.ok(groups[key].mattermost_group_id === 'new-mattermost-id');
assert.ok(groups[key].has_syncables === false);
});
it('unlinkLdapGroup', async () => {
const ldapGroups = {
count: 2,
groups: [
{primary_key: 'test1', name: 'test1', mattermost_group_id: null, has_syncables: false},
{primary_key: 'test2', name: 'test2', mattermost_group_id: 'mattermost-id', has_syncables: true},
],
};
nock(Client4.getBaseRoute()).
get('/ldap/groups?page=0&per_page=100').
reply(200, ldapGroups);
await Actions.getLdapGroups(0, 100, null)(store.dispatch, store.getState);
const key = 'test2';
nock(Client4.getBaseRoute()).
delete(`/ldap/groups/${key}/link`).
reply(200, {ok: true});
await Actions.unlinkLdapGroup(key)(store.dispatch, store.getState);
const state = store.getState();
const groups = state.entities.admin.ldapGroups;
assert.ok(groups[key]);
assert.ok(groups[key].mattermost_group_id === undefined);
assert.ok(groups[key].has_syncables === undefined);
});
it('getSamlMetadataFromIdp', async () => {
nock(Client4.getBaseRoute()).
post('/saml/metadatafromidp').
reply(200, {
idp_url: samlIdpUrl,
idp_descriptor_url: samlIdpDescriptorUrl,
idp_public_certificate: samlIdpPublicCertificateText,
});
await Actions.getSamlMetadataFromIdp()(store.dispatch, store.getState);
const state = store.getState();
const metadataResponse = state.entities.admin.samlMetadataResponse;
assert.ok(metadataResponse);
assert.ok(metadataResponse.idp_url === samlIdpUrl);
assert.ok(metadataResponse.idp_descriptor_url === samlIdpDescriptorUrl);
assert.ok(metadataResponse.idp_public_certificate === samlIdpPublicCertificateText);
});
it('setSamlIdpCertificateFromMetadata', async () => {
nock(Client4.getBaseRoute()).
post('/saml/certificate/idp').
reply(200, OK_RESPONSE);
await Actions.setSamlIdpCertificateFromMetadata(samlIdpPublicCertificateText)(store.dispatch, store.getState);
// This test doesn't appear to actually check anything?
});
it('sendWarnMetricAck', async () => {
const warnMetricAck = {
id: 'metric1',
};
nock(Client4.getBaseRoute()).
post('/warn_metrics/ack').
reply(200, OK_RESPONSE);
await Actions.sendWarnMetricAck(warnMetricAck.id, false)(store.dispatch, store.getState);
});
});