/**
|
* @file S&OP Gauge component to wrap common methods the team encounter during development
|
* @description Gauge class extending e2elib's Gauge.
|
* All S&OP page objects inherit from our own class (inheriting e2e/Abstraction API), but we can propose common methods to them.
|
* @author Pethaperumal Natarajan (Pethaperumal.NATARAJAN.intern@3ds.com)
|
* @copyright Dassault Systèmes
|
*/
|
|
import { QConsole } from '../e2elib/lib/src/helper/qconsole';
|
import { Gauge } from '../e2elib/lib/src/pageobjects/gauge.component';
|
import { ElementFinder } from '../e2elib/node_modules/protractor';
|
import { browser } from '../e2elib/node_modules/protractor/built';
|
|
export class GaugeSOP extends Gauge {
|
public constructor(componentPath: string, isCustomPath?: boolean, elementObject?: ElementFinder, isDashboardGauge?: boolean) {
|
super(componentPath, isCustomPath, elementObject, isDashboardGauge);
|
}
|
|
/**
|
* Get gauge count. e2elib has no such method thus we implement by incrementaly query gauge index until we hit error.
|
* To prevent infinite loop, we set threshold to query.
|
*
|
* @returns Gauge count.
|
*/
|
public async getGaugeCount(): Promise<number> {
|
let index = 0;
|
let gaugeCount = 0;
|
const maxLoop = 50; // Increase this if there's more gauge, but safe to say infeasible to show that much gauge on screen to be readable (this threshold to prevent infinite loop)
|
while (index < maxLoop) {
|
try {
|
await this.getTitle(index);
|
index++;
|
gaugeCount++;
|
} catch (e) {
|
// Break loop as there's no more gauge
|
index = maxLoop;
|
}
|
}
|
return gaugeCount;
|
}
|
|
/**
|
* Verify the gauges present in the dashboard. Performs exact match.
|
*
|
* @param expectedGaugeNames Gauges that are expected to be present in the dashboard.
|
* @param exactMatch If true verify only the expected gauge(s) present in dashboard.
|
*/
|
public async verifyGaugesPresent(expectedGaugeNames: string[], exactMatch: boolean = false): Promise<void> {
|
await QConsole.waitForStable();
|
await this.waitForScreenUpdate();
|
|
const actualCount = await this.getGaugeCount();
|
|
// Verify gauge count exactly what we expect
|
if (exactMatch) {
|
expect(actualCount).toBe(expectedGaugeNames.length, `Expected exacly ${expectedGaugeNames.length} KPI gauges.`);
|
}
|
|
// Retrieve currently shown gauge names
|
const actualGaugeNames: string[] = [];
|
for (let i = 0; i < actualCount; i++) {
|
actualGaugeNames.push(await this.getTitle(i));
|
}
|
|
// Find gauge(s) that are not shown
|
const missingGaugeNames = expectedGaugeNames.filter((x: string): boolean => !actualGaugeNames.includes(x));
|
expect(missingGaugeNames.length).toBe(0, `Missing gauge(s): ${missingGaugeNames.join(', ')}`);
|
}
|
|
/**
|
* Wait for KPI to show the expected value
|
*
|
* @param value the value to wait for the KPI to show
|
* @param durationInSecond the duration to wait for the KPI value, default 20 seconds
|
*/
|
public async waitForKPI(name: string, value: string, durationInSecond: number = 20): Promise<void> {
|
await browser.wait(async () => (await this.getValue()) === value, durationInSecond * 1000, `${name} KPI should be at ${value}% within ${durationInSecond} seconds`);
|
}
|
}
|
|
const stepGauge = {
|
verifyGaugesPresent: (gaugeTitle: string, gaugeNames: string[], exactMatch: boolean): string => {
|
const ifExactMatchString = exactMatch ? 'only these ' : '';
|
return `In dashboard gauge "${gaugeTitle}", verify ${ifExactMatchString}gauge present ("${gaugeNames}").`;
|
},
|
};
|
|
export { stepGauge as StepGauge };
|