adding tests. Make sure that device status depends on the configured threshold.

pull/343/head
Jason Kulatunga 2 years ago
parent e41ee47371
commit 2e768fb491

@ -10,6 +10,10 @@ import {TREO_APP_CONFIG} from '@treo/services/config/config.constants';
import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model';
import * as moment from 'moment'; import * as moment from 'moment';
import {HttpClientTestingModule} from '@angular/common/http/testing'; import {HttpClientTestingModule} from '@angular/common/http/testing';
import {HttpClient} from '@angular/common/http';
import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service';
import {of} from 'rxjs';
import {MetricsStatusThreshold} from 'app/core/config/app.config';
describe('DashboardDeviceComponent', () => { describe('DashboardDeviceComponent', () => {
let component: DashboardDeviceComponent; let component: DashboardDeviceComponent;
@ -17,9 +21,14 @@ describe('DashboardDeviceComponent', () => {
const matDialogSpy = jasmine.createSpyObj('MatDialog', ['open']); const matDialogSpy = jasmine.createSpyObj('MatDialog', ['open']);
// const configServiceSpy = jasmine.createSpyObj('ScrutinyConfigService', ['config$']); // const configServiceSpy = jasmine.createSpyObj('ScrutinyConfigService', ['config$']);
let configService: ScrutinyConfigService;
let httpClientSpy: jasmine.SpyObj<HttpClient>;
beforeEach(async(() => { beforeEach(async(() => {
httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']);
configService = new ScrutinyConfigService(httpClientSpy, {});
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
MatButtonModule, MatButtonModule,
@ -30,7 +39,8 @@ describe('DashboardDeviceComponent', () => {
], ],
providers: [ providers: [
{provide: MatDialog, useValue: matDialogSpy}, {provide: MatDialog, useValue: matDialogSpy},
{provide: TREO_APP_CONFIG, useValue: {dashboard_display: 'name'}} {provide: TREO_APP_CONFIG, useValue: {dashboard_display: 'name', metrics: {status_threshold: 3}}},
{provide: ScrutinyConfigService, useValue: configService}
], ],
declarations: [DashboardDeviceComponent] declarations: [DashboardDeviceComponent]
}) })
@ -50,25 +60,53 @@ describe('DashboardDeviceComponent', () => {
describe('#classDeviceLastUpdatedOn()', () => { describe('#classDeviceLastUpdatedOn()', () => {
it('if non-zero device status, should be red', () => { it('if non-zero device status, should be red', () => {
httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
// component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel // component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel
expect(component.classDeviceLastUpdatedOn({ expect(component.classDeviceLastUpdatedOn({
device: { device: {
device_status: 2 device_status: 2,
} },
smart: {
collector_date: moment().subtract(13, 'days').toISOString()
},
} as DeviceSummaryModel)).toBe('text-red') } as DeviceSummaryModel)).toBe('text-red')
}); });
it('if non-zero device status, should be red', () => { it('if non-zero device status, should be red', () => {
// component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
expect(component.classDeviceLastUpdatedOn({ expect(component.classDeviceLastUpdatedOn({
device: { device: {
device_status: 2 device_status: 2
} },
smart: {
collector_date: moment().subtract(13, 'days').toISOString()
},
} as DeviceSummaryModel)).toBe('text-red') } as DeviceSummaryModel)).toBe('text-red')
}); });
it('if healthy device status and updated in the last two weeks, should be green', () => { it('if healthy device status and updated in the last two weeks, should be green', () => {
// component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
expect(component.classDeviceLastUpdatedOn({ expect(component.classDeviceLastUpdatedOn({
device: { device: {
device_status: 0 device_status: 0
@ -80,7 +118,14 @@ describe('DashboardDeviceComponent', () => {
}); });
it('if healthy device status and updated more than two weeks ago, but less than 1 month, should be yellow', () => { it('if healthy device status and updated more than two weeks ago, but less than 1 month, should be yellow', () => {
// component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
expect(component.classDeviceLastUpdatedOn({ expect(component.classDeviceLastUpdatedOn({
device: { device: {
device_status: 0 device_status: 0
@ -92,7 +137,14 @@ describe('DashboardDeviceComponent', () => {
}); });
it('if healthy device status and updated more 1 month ago, should be red', () => { it('if healthy device status and updated more 1 month ago, should be red', () => {
// component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
expect(component.classDeviceLastUpdatedOn({ expect(component.classDeviceLastUpdatedOn({
device: { device: {
device_status: 0 device_status: 0
@ -104,4 +156,114 @@ describe('DashboardDeviceComponent', () => {
}); });
}) })
describe('#deviceStatusString()', () => {
it('if healthy device, should be passing', () => {
httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
expect(component.deviceStatusString({
device: {
device_status: 0
},
smart: {
collector_date: moment().subtract(13, 'days').toISOString()
},
} as DeviceSummaryModel)).toBe('passed')
});
it('if device with no smart data, should be unknown', () => {
httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: MetricsStatusThreshold.Both,
}
}
}));
component.ngOnInit()
expect(component.deviceStatusString({
device: {
device_status: 0
},
} as DeviceSummaryModel)).toBe('unknown')
});
const testCases = [
{
'deviceStatus': 1,
'threshold': MetricsStatusThreshold.Smart,
'result': 'failed'
},
{
'deviceStatus': 1,
'threshold': MetricsStatusThreshold.Scrutiny,
'result': 'passed'
},
{
'deviceStatus': 1,
'threshold': MetricsStatusThreshold.Both,
'result': 'failed'
},
{
'deviceStatus': 2,
'threshold': MetricsStatusThreshold.Smart,
'result': 'passed'
},
{
'deviceStatus': 2,
'threshold': MetricsStatusThreshold.Scrutiny,
'result': 'failed'
},
{
'deviceStatus': 2,
'threshold': MetricsStatusThreshold.Both,
'result': 'failed'
},
{
'deviceStatus': 3,
'threshold': MetricsStatusThreshold.Smart,
'result': 'failed'
},
{
'deviceStatus': 3,
'threshold': MetricsStatusThreshold.Scrutiny,
'result': 'failed'
},
{
'deviceStatus': 3,
'threshold': MetricsStatusThreshold.Both,
'result': 'failed'
}
]
testCases.forEach((test, index) => {
it(`if device with status (${test.deviceStatus}) and threshold (${test.threshold}), should be ${test.result}`, () => {
httpClientSpy.get.and.returnValue(of({
settings: {
metrics: {
status_threshold: test.threshold,
}
}
}));
component.ngOnInit()
expect(component.deviceStatusString({
device: {
device_status: test.deviceStatus
},
smart: {
collector_date: moment().subtract(13, 'days').toISOString()
},
} as DeviceSummaryModel)).toBe(test.result)
});
});
})
}); });

@ -10,6 +10,8 @@ import {DashboardDeviceDeleteDialogComponent} from 'app/layout/common/dashboard-
import {DeviceTitlePipe} from 'app/shared/device-title.pipe'; import {DeviceTitlePipe} from 'app/shared/device-title.pipe';
import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model';
export type deviceStatusName = 'unknown' | 'passed' | 'failed'
@Component({ @Component({
selector: 'app-dashboard-device', selector: 'app-dashboard-device',
templateUrl: './dashboard-device.component.html', templateUrl: './dashboard-device.component.html',
@ -50,9 +52,10 @@ export class DashboardDeviceComponent implements OnInit {
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
classDeviceLastUpdatedOn(deviceSummary: DeviceSummaryModel): string { classDeviceLastUpdatedOn(deviceSummary: DeviceSummaryModel): string {
if (deviceSummary.device.device_status !== 0) { const deviceStatus = this.deviceStatusString(deviceSummary)
if (deviceStatus === 'failed') {
return 'text-red' // if the device has failed, always highlight in red return 'text-red' // if the device has failed, always highlight in red
} else if (deviceSummary.device.device_status === 0 && deviceSummary.smart) { } else if (deviceStatus === 'passed') {
if (moment().subtract(14, 'days').isBefore(deviceSummary.smart.collector_date)) { if (moment().subtract(14, 'days').isBefore(deviceSummary.smart.collector_date)) {
// this device was updated in the last 2 weeks. // this device was updated in the last 2 weeks.
return 'text-green' return 'text-green'
@ -68,7 +71,8 @@ export class DashboardDeviceComponent implements OnInit {
} }
} }
deviceStatusString(deviceSummary: DeviceSummaryModel): string {
deviceStatusString(deviceSummary: DeviceSummaryModel): deviceStatusName {
// no smart data, so treat the device status as unknown // no smart data, so treat the device status as unknown
if (!deviceSummary.smart) { if (!deviceSummary.smart) {
return 'unknown' return 'unknown'

Loading…
Cancel
Save