From 92011c587f2d1bc9312197fa9ff4e2bf39e268e4 Mon Sep 17 00:00:00 2001 From: Ghadeer Albattarni <165973963+GhadeerAlbattarni@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:12:28 -0500 Subject: [PATCH] chore(test): add FreehandROI test that MEASUREMENT_ADDED does not fire when clicking annotation text (#5846) --- tests/FreehandROI.spec.ts | 34 +++++++++++++++++++++++++++ tests/pages/MainToolbarPageObject.ts | 11 +++++++++ tests/pages/ViewportPageObject.ts | 11 +++++++++ tests/utils/index.ts | 2 ++ tests/utils/subscribeToMeasurement.ts | 34 +++++++++++++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 tests/FreehandROI.spec.ts create mode 100644 tests/utils/subscribeToMeasurement.ts diff --git a/tests/FreehandROI.spec.ts b/tests/FreehandROI.spec.ts new file mode 100644 index 000000000..eed68b3b6 --- /dev/null +++ b/tests/FreehandROI.spec.ts @@ -0,0 +1,34 @@ +import { expect, test, visitStudy, subscribeToMeasurementAdded } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5'; + const mode = 'viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should not fire MEASUREMENT_ADDED when clicking the annotation text', async ({ + page, + DOMOverlayPageObject, + mainToolbarPageObject, + viewportPageObject, +}) => { + await mainToolbarPageObject.measurementTools.freehandROI.click(); + await viewportPageObject.active.normalizedDragAt({ + start: { x: 0.35, y: 0.35 }, + end: { x: 0.6, y: 0.55 }, + config: { steps: 20, delay: 30 }, + }); + + await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); + + const measurementAdded = await subscribeToMeasurementAdded(page); + try { + const annotation = viewportPageObject.active.nthAnnotation(0); + await annotation.text.click(); + + await expect(measurementAdded.waitFired(1000)).rejects.toThrow(); + + } finally { + await measurementAdded.unsubscribe(); + } +}); diff --git a/tests/pages/MainToolbarPageObject.ts b/tests/pages/MainToolbarPageObject.ts index dd5c42e48..f783d71c9 100644 --- a/tests/pages/MainToolbarPageObject.ts +++ b/tests/pages/MainToolbarPageObject.ts @@ -194,6 +194,17 @@ export class MainToolbarPageObject { }, }; }, + + get freehandROI() { + const button = page.getByTestId('PlanarFreehandROI'); + return { + button, + async click() { + await measurementTools.click(); + await button.click(); + }, + }; + }, }; } diff --git a/tests/pages/ViewportPageObject.ts b/tests/pages/ViewportPageObject.ts index a5b38dfcb..7a8fd0c40 100644 --- a/tests/pages/ViewportPageObject.ts +++ b/tests/pages/ViewportPageObject.ts @@ -24,6 +24,10 @@ export interface IViewportPageObject { contextMenu: { open: () => Promise; }; + text: { + locator: Locator; + click: () => Promise; + }; }; clickAt: ( points: { x: number; y: number }[], @@ -75,6 +79,7 @@ export class ViewportPageObject { const page = this.page; const domOverlayPageObject = new DOMOverlayPageObject(page); const annotation = viewport.locator('g[data-annotation-uid]').nth(nth); + const textLocator = annotation.locator('text').first(); return { locator: annotation, @@ -86,6 +91,12 @@ export class ViewportPageObject { await domOverlayPageObject.viewport.annotationContextMenu.open(annotation); }, }, + text: { + locator: textLocator, + click: async () => { + await textLocator.click({ force: true }); + }, + }, }; } diff --git a/tests/utils/index.ts b/tests/utils/index.ts index 7501286f9..6366b2a9c 100644 --- a/tests/utils/index.ts +++ b/tests/utils/index.ts @@ -17,6 +17,7 @@ import { scrollVolumeViewport } from './scrollVolumeViewport'; import { attemptAction } from './attemptAction'; import { addLengthMeasurement } from './addLengthMeasurement'; import { test, expect } from './fixture'; +import { subscribeToMeasurementAdded } from './subscribeToMeasurement'; export { visitStudy, @@ -36,6 +37,7 @@ export { scrollVolumeViewport, attemptAction, addLengthMeasurement, + subscribeToMeasurementAdded, test, expect, }; diff --git a/tests/utils/subscribeToMeasurement.ts b/tests/utils/subscribeToMeasurement.ts new file mode 100644 index 000000000..514412564 --- /dev/null +++ b/tests/utils/subscribeToMeasurement.ts @@ -0,0 +1,34 @@ +export const subscribeToMeasurementAdded = async (page: any) => { + let measurementAddedFired = false; + let unsubscribeMeasurementAdded: () => void; + + await page.evaluate( + ({ services }: AppTypes.Test) => { + const { measurementService } = services; + + const { unsubscribe } = measurementService.subscribe( + measurementService.EVENTS.MEASUREMENT_ADDED, + () => { + measurementAddedFired = true; + } + ); + + unsubscribeMeasurementAdded = unsubscribe; + }, + await page.evaluateHandle('window') + ); + + return { + waitFired: async (timeout?: number) => + await page.waitForFunction( + () => measurementAddedFired === true, + timeout != null ? { timeout } : undefined + ), + + unsubscribe: async () => { + await page.evaluate(() => { + unsubscribeMeasurementAdded?.(); + }); + }, + }; +};