From 1695096a07dcbb62fb328df3b0a7a4c23e5c76ad Mon Sep 17 00:00:00 2001 From: Gabriel Weyer Date: Sat, 13 Jan 2024 09:04:30 +1100 Subject: [PATCH] Harden Azure Hybrid Benefit toggling --- parser/src/azurePortalExtensions.ts | 28 ++++++++++++++++++++++------ parser/src/puppeteerExtensions.ts | 5 +++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/parser/src/azurePortalExtensions.ts b/parser/src/azurePortalExtensions.ts index 5b23260..df86fce 100644 --- a/parser/src/azurePortalExtensions.ts +++ b/parser/src/azurePortalExtensions.ts @@ -1,10 +1,10 @@ import * as puppeteer from 'puppeteer'; import { PartialVmPricing, VmPricing } from "./vmPricing"; -import { isSelectedSelect, setSelect } from './puppeteerExtensions'; -import { json } from 'stream/consumers'; +import { isSelectedSelect, setSelect, isSelectedCheckbox } from './puppeteerExtensions'; export class AzurePortal { private p: puppeteer.Page; + private azureHybridBenefitButtonSelector = 'button#isAhb'; constructor(page: puppeteer.Page) { this.p = page; @@ -73,8 +73,7 @@ export class AzurePortal { if (hasHybridBenefit) { savingsPlanWithHybridBenefits = savingsPlanPricing; - await this.p.click('button#isAhb'); - await this.waitForPriceWithoutHybridBenefits(); + await this.hideAzureHybridBenefit(); savingsPlansWithoutHybridBenefits = await this.p.evaluate(() => getPricing()); if (savingsPlanWithHybridBenefits.length !== savingsPlansWithoutHybridBenefits.length) { @@ -110,8 +109,7 @@ export class AzurePortal { if (hasHybridBenefit) { reservedWithoutHybridBenefits = reservedPricing; - await this.p.click('button#isAhb'); - await this.waitForPriceWithHybridBenefits(); + await this.showAzureHybridBenefit(); reservedWithHybridBenefits = await this.p.evaluate(() => getPricing()); if (reservedWithoutHybridBenefits.length !== reservedWithHybridBenefits.length) { @@ -229,6 +227,24 @@ export class AzurePortal { ); } + private async hideAzureHybridBenefit(): Promise { + if (!await isSelectedCheckbox(this.p, this.azureHybridBenefitButtonSelector)) { + return; + } + + await this.p.click(this.azureHybridBenefitButtonSelector); + await this.waitForPriceWithoutHybridBenefits(); + } + + private async showAzureHybridBenefit(): Promise { + if (await isSelectedCheckbox(this.p, this.azureHybridBenefitButtonSelector)) { + return; + } + + await this.p.click(this.azureHybridBenefitButtonSelector); + await this.waitForPriceWithHybridBenefits(); + } + private async waitForPriceWithoutHybridBenefits(): Promise { await this.p.waitForFunction( () => { diff --git a/parser/src/puppeteerExtensions.ts b/parser/src/puppeteerExtensions.ts index 27ec4ae..8e2f82b 100644 --- a/parser/src/puppeteerExtensions.ts +++ b/parser/src/puppeteerExtensions.ts @@ -19,6 +19,11 @@ export async function isSelectedSelect(page: puppeteer.Page, selector: string, v return selectedValue === value; } +export async function isSelectedCheckbox(page: puppeteer.Page, selector: string): Promise { + const value = await page.$eval(selector, node => ( node).value); + return value === 'true'; +} + async function getSelectedValue(page: puppeteer.Page, selector: string): Promise { const fullSelector = getSelectFullSelector(selector); await page.waitForSelector(fullSelector, { visible: true });