c5ecca1e1d
Full scope: storagenode/{console,nodestats,notifications,reputation,storagenodedb}, web/storagenode These columns are deprecated. They used to be for the uptime reputation system which has been replaced by downtime tracking with audits. Change-Id: I151d6569577d89733ac97af21a1d885323522b21
352 lines
12 KiB
TypeScript
352 lines
12 KiB
TypeScript
// Copyright (C) 2020 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
import Vuex from 'vuex';
|
|
|
|
import { newNodeModule, NODE_ACTIONS, NODE_MUTATIONS, StatusOnline } from '@/app/store/modules/node';
|
|
import { StorageNodeApi } from '@/storagenode/api/storagenode';
|
|
import { StorageNodeService } from '@/storagenode/sno/service';
|
|
import {
|
|
BandwidthUsed,
|
|
Dashboard,
|
|
Egress,
|
|
EgressUsed,
|
|
Ingress,
|
|
IngressUsed,
|
|
Satellite,
|
|
SatelliteInfo,
|
|
Satellites,
|
|
SatelliteScores,
|
|
Stamp, Traffic,
|
|
} from '@/storagenode/sno/sno';
|
|
import { createLocalVue } from '@vue/test-utils';
|
|
|
|
const Vue = createLocalVue();
|
|
|
|
const nodeApi = new StorageNodeApi();
|
|
const nodeService = new StorageNodeService(nodeApi);
|
|
const nodeModule = newNodeModule(nodeService);
|
|
|
|
Vue.use(Vuex);
|
|
|
|
const store = new Vuex.Store({ modules: { node: nodeModule } });
|
|
|
|
const state = store.state as any;
|
|
|
|
describe('mutations', () => {
|
|
beforeEach(() => {
|
|
createLocalVue().use(Vuex);
|
|
});
|
|
|
|
it('set dashboard info', () => {
|
|
const dashboardInfo = new Dashboard(
|
|
'1',
|
|
'2',
|
|
[
|
|
new SatelliteInfo('3', 'url1', null, null),
|
|
new SatelliteInfo('4', 'url2', new Date(2020, 1, 1), new Date(2020, 0, 1)),
|
|
],
|
|
new Traffic(99, 100, 5),
|
|
new Traffic(50),
|
|
new Date(),
|
|
new Date(2019, 3, 1),
|
|
'0.1.1',
|
|
'0.2.2',
|
|
false,
|
|
);
|
|
|
|
store.commit(NODE_MUTATIONS.POPULATE_STORE, dashboardInfo);
|
|
|
|
expect(state.node.info.id).toBe(dashboardInfo.nodeID);
|
|
expect(state.node.utilization.bandwidth.used).toBe(dashboardInfo.bandwidth.used);
|
|
expect(state.node.utilization.diskSpace.used).toBe(dashboardInfo.diskSpace.used);
|
|
expect(state.node.utilization.diskSpace.trash).toBe(dashboardInfo.diskSpace.trash);
|
|
expect(state.node.satellites.length).toBe(dashboardInfo.satellites.length);
|
|
expect(state.node.disqualifiedSatellites.length).toBe(1);
|
|
expect(state.node.suspendedSatellites.length).toBe(1);
|
|
expect(state.node.info.status).toBe(StatusOnline);
|
|
});
|
|
|
|
it('selects single satellite', () => {
|
|
const satelliteInfo = new Satellite(
|
|
'3',
|
|
[new Stamp()],
|
|
[],
|
|
[],
|
|
[],
|
|
111,
|
|
222,
|
|
50,
|
|
70,
|
|
new SatelliteScores('', 1, 0, 0),
|
|
new Date(2019, 3, 1),
|
|
);
|
|
|
|
store.commit(NODE_MUTATIONS.SELECT_SATELLITE, satelliteInfo);
|
|
|
|
expect(state.node.selectedSatellite.id).toBe(satelliteInfo.id);
|
|
expect(state.node.audits.auditScore.label).toBe('100 %');
|
|
expect(state.node.audits.suspensionScore.label).toBe('0 %');
|
|
});
|
|
|
|
it('don`t selects wrong satellite', () => {
|
|
const satelliteInfo = new Satellite();
|
|
|
|
store.commit(NODE_MUTATIONS.SELECT_SATELLITE, satelliteInfo);
|
|
|
|
expect(state.node.selectedSatellite.id).toBe('3');
|
|
});
|
|
|
|
it('selects all satellites', () => {
|
|
const satelliteInfo = new Satellites();
|
|
satelliteInfo.satellitesScores = [
|
|
new SatelliteScores('name1', 0.7, 0.9, 1),
|
|
new SatelliteScores('name1', 0.8, 0.8, 0.8),
|
|
];
|
|
|
|
store.commit(NODE_MUTATIONS.SELECT_ALL_SATELLITES, satelliteInfo);
|
|
|
|
expect(state.node.selectedSatellite.id).toBe('');
|
|
expect(state.node.satellitesScores.length).toBe(satelliteInfo.satellitesScores.length);
|
|
expect(state.node.satellitesScores[0].auditScore.label).toBe('70 %');
|
|
expect(state.node.satellitesScores[0].iconClassName).toBe('warning');
|
|
});
|
|
|
|
it('sets daily data', () => {
|
|
const satelliteInfo = new Satellite(
|
|
'3',
|
|
[new Stamp(), new Stamp()],
|
|
[
|
|
new BandwidthUsed(
|
|
new Egress(),
|
|
new Ingress(),
|
|
new Date(),
|
|
),
|
|
new BandwidthUsed(
|
|
new Egress(),
|
|
new Ingress(),
|
|
new Date(),
|
|
),
|
|
],
|
|
[
|
|
new EgressUsed(new Egress(), new Date()),
|
|
new EgressUsed(new Egress(), new Date()),
|
|
],
|
|
[
|
|
new IngressUsed(new Ingress(), new Date()),
|
|
new IngressUsed(new Ingress(), new Date()),
|
|
],
|
|
111,
|
|
222,
|
|
50,
|
|
70,
|
|
new SatelliteScores('', 100, 200, 300),
|
|
new Date(2019, 3, 1),
|
|
);
|
|
|
|
store.commit(NODE_MUTATIONS.SET_DAILY_DATA, satelliteInfo);
|
|
|
|
expect(state.node.bandwidthChartData.length).toBe(2);
|
|
expect(state.node.egressChartData.length).toBe(2);
|
|
expect(state.node.ingressChartData.length).toBe(2);
|
|
expect(state.node.storageChartData.length).toBe(2);
|
|
expect(state.node.bandwidthSummary).toBe(satelliteInfo.bandwidthSummary);
|
|
expect(state.node.egressSummary).toBe(satelliteInfo.egressSummary);
|
|
expect(state.node.ingressSummary).toBe(satelliteInfo.ingressSummary);
|
|
expect(state.node.storageSummary).toBe(satelliteInfo.storageSummary);
|
|
});
|
|
});
|
|
|
|
describe('actions', () => {
|
|
beforeEach(() => {
|
|
jest.resetAllMocks();
|
|
});
|
|
|
|
it('throws error on failed node info fetch', async () => {
|
|
jest.spyOn(nodeApi, 'dashboard').mockImplementation(() => { throw new Error(); });
|
|
|
|
try {
|
|
await store.dispatch(NODE_ACTIONS.GET_NODE_INFO);
|
|
expect(true).toBe(false);
|
|
} catch (error) {
|
|
expect(state.node.info.id).toBe('1');
|
|
}
|
|
});
|
|
|
|
it('success get node info', async () => {
|
|
jest.spyOn(nodeApi, 'dashboard').mockReturnValue(
|
|
Promise.resolve(
|
|
new Dashboard(
|
|
'1',
|
|
'2',
|
|
[
|
|
new SatelliteInfo('3', 'url1', null, null),
|
|
new SatelliteInfo('4', 'url2', new Date(2020, 1, 1), new Date(2020, 0, 1)),
|
|
],
|
|
new Traffic(99, 100, 1),
|
|
new Traffic(50),
|
|
new Date(),
|
|
new Date(2019, 3, 1),
|
|
'0.1.1',
|
|
'0.2.2',
|
|
false,
|
|
),
|
|
),
|
|
);
|
|
|
|
await store.dispatch(NODE_ACTIONS.GET_NODE_INFO);
|
|
|
|
expect(state.node.info.id).toBe('1');
|
|
expect(state.node.utilization.bandwidth.used).toBe(50);
|
|
expect(state.node.utilization.diskSpace.used).toBe(99);
|
|
expect(state.node.utilization.diskSpace.trash).toBe(1);
|
|
expect(state.node.satellites.length).toBe(2);
|
|
expect(state.node.disqualifiedSatellites.length).toBe(1);
|
|
expect(state.node.suspendedSatellites.length).toBe(1);
|
|
expect(state.node.info.status).toBe(StatusOnline);
|
|
});
|
|
|
|
it('fetch satellite info throws error on api call fail', async () => {
|
|
jest.spyOn(nodeApi, 'satellite').mockImplementation(() => { throw new Error(); });
|
|
|
|
try {
|
|
await store.dispatch(NODE_ACTIONS.SELECT_SATELLITE, '3');
|
|
expect(true).toBe(false);
|
|
} catch (e) {
|
|
expect(state.node.selectedSatellite.id).toBe('');
|
|
}
|
|
});
|
|
|
|
it('success fetch single satellite info', async () => {
|
|
jest.spyOn(nodeApi, 'satellite').mockReturnValue(
|
|
Promise.resolve(
|
|
new Satellite(
|
|
'4',
|
|
[new Stamp(), new Stamp()],
|
|
[
|
|
new BandwidthUsed(
|
|
new Egress(),
|
|
new Ingress(),
|
|
new Date(),
|
|
),
|
|
],
|
|
[
|
|
new EgressUsed(new Egress(), new Date()),
|
|
],
|
|
[
|
|
new IngressUsed(new Ingress(), new Date()),
|
|
],
|
|
1111,
|
|
2221,
|
|
501,
|
|
701,
|
|
new SatelliteScores('', 100, 200, 0.2),
|
|
new Date(2019, 3, 1),
|
|
),
|
|
),
|
|
);
|
|
|
|
await store.dispatch(NODE_ACTIONS.SELECT_SATELLITE, '4');
|
|
|
|
expect(state.node.selectedSatellite.id).toBe('4');
|
|
expect(state.node.bandwidthChartData.length).toBe(1);
|
|
expect(state.node.egressChartData.length).toBe(1);
|
|
expect(state.node.ingressChartData.length).toBe(1);
|
|
expect(state.node.storageChartData.length).toBe(2);
|
|
expect(state.node.bandwidthSummary).toBe(2221);
|
|
expect(state.node.egressSummary).toBe(501);
|
|
expect(state.node.ingressSummary).toBe(701);
|
|
expect(state.node.storageSummary).toBe(1111);
|
|
expect(state.node.audits.onlineScore.label).toBe('20 %');
|
|
});
|
|
|
|
it('fetch all satellites info throws error on api call fail', async () => {
|
|
jest.spyOn(nodeApi, 'satellites').mockImplementation(
|
|
() => { throw new Error(); },
|
|
);
|
|
|
|
try {
|
|
await store.dispatch(NODE_ACTIONS.SELECT_SATELLITE);
|
|
expect(true).toBe(false);
|
|
} catch (e) {
|
|
expect(state.node.selectedSatellite.id).toBe('4');
|
|
}
|
|
});
|
|
|
|
it('success fetch all satellites info', async () => {
|
|
const satellitesInfo = new Satellites();
|
|
satellitesInfo.satellitesScores = [
|
|
new SatelliteScores('name1', 0.7, 0.9, 1),
|
|
new SatelliteScores('name1', 0.8, 0.8, 0.8),
|
|
];
|
|
|
|
jest.spyOn(nodeApi, 'satellites').mockReturnValue(
|
|
Promise.resolve(satellitesInfo),
|
|
);
|
|
|
|
await store.dispatch(NODE_ACTIONS.SELECT_SATELLITE);
|
|
|
|
expect(state.node.selectedSatellite.id).toBe('');
|
|
expect(state.node.satellitesScores.length).toBe(satellitesInfo.satellitesScores.length);
|
|
expect(state.node.satellitesScores[0].onlineScore.label).toBe('100 %');
|
|
expect(state.node.satellitesScores[0].auditScore.statusClassName).toBe('warning');
|
|
expect(state.node.satellitesScores[1].auditScore.label).toBe('80 %');
|
|
});
|
|
});
|
|
|
|
describe('getters', () => {
|
|
it('getter monthsOnNetwork returns correct value', () => {
|
|
const _Date = Date;
|
|
const testJoinAt = new Date(Date.UTC(2020, 0, 30));
|
|
|
|
const satelliteInfo = new Satellite(
|
|
'3',
|
|
[new Stamp()],
|
|
[],
|
|
[],
|
|
[],
|
|
111,
|
|
222,
|
|
50,
|
|
70,
|
|
new SatelliteScores('', 100, 200, 300),
|
|
testJoinAt,
|
|
);
|
|
|
|
const firstTestDate = new Date(2020, 1, 1);
|
|
const secondTestDate = new Date(Date.UTC(2019, 10, 29));
|
|
|
|
const mockedDate = new Date(1580522290000);
|
|
global.Date = jest.fn(() => mockedDate); // Sat Feb 01 2020
|
|
|
|
const dashboardInfo = new Dashboard(
|
|
'1',
|
|
'2',
|
|
[
|
|
new SatelliteInfo('3', 'url1', null, null),
|
|
new SatelliteInfo('4', 'url2', firstTestDate, new Date(2020, 0, 1)),
|
|
],
|
|
new Traffic(99, 100, 4),
|
|
new Traffic(50),
|
|
new Date(),
|
|
firstTestDate,
|
|
'0.1.1',
|
|
'0.2.2',
|
|
false,
|
|
);
|
|
|
|
store.commit(NODE_MUTATIONS.POPULATE_STORE, dashboardInfo);
|
|
store.commit(NODE_MUTATIONS.SELECT_SATELLITE, satelliteInfo);
|
|
|
|
expect(store.getters.monthsOnNetwork).toBe(2);
|
|
|
|
satelliteInfo.joinDate = secondTestDate;
|
|
|
|
store.commit(NODE_MUTATIONS.SELECT_SATELLITE, satelliteInfo);
|
|
|
|
expect(store.getters.monthsOnNetwork).toBe(4);
|
|
|
|
global.Date = _Date;
|
|
});
|
|
});
|