feat: Add combined build (#5895)

* Add combined build

* Link script location update

* Security and validation fixes

* Allow specifying target path in PR description

* fix: Version match

* Fix build detection issue

* fix: Playwright deploy

* Separate out the branch merge guard

* Update docs and link info

* test: Update the layout change to wait for network idle

* Move audit late so the rest of the build can be worked on

* Add text with network check to ensure we see this change is updated

* Attempt to fix the mpr loading on ohif-downstream

* PR review comments

* Update docs

* Update to CS3D 4.20.0

* PR comments

* Add log on ohif-integration builds

* Update build test

* Removed unused space to kickoff build
This commit is contained in:
Bill Wallace authored and GitHub committed 2026-03-17 07:52:17 -04:00
1 parent 15ef4c2e0f
commit 1df671e9ab
36 files changed
+1047 -301

No files matched your search

+1 -1
View File
@@ -19,7 +19,7 @@ test.describe('3D four up Test', async () => {
await attemptAction(() => reduce3DViewportSize(page), 10, 100);
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(
page,
+1 -1
View File
@@ -17,7 +17,7 @@ test.describe('3D main Test', async () => {
test('should render 3D main correctly.', async ({ page, mainToolbarPageObject }) => {
await mainToolbarPageObject.layoutSelection.threeDMain.click();
await attemptAction(() => reduce3DViewportSize(page), 10, 100);
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(page, page, screenShotPaths.threeDMain.threeDMainDisplayedCorrectly);
});
});
+1 -1
View File
@@ -17,7 +17,7 @@ test.describe('3D only Test', async () => {
test('should render 3D only correctly.', async ({ page, mainToolbarPageObject }) => {
await mainToolbarPageObject.layoutSelection.threeDOnly.click();
await attemptAction(() => reduce3DViewportSize(page), 10, 100);
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
// Use a 4 percent diff pixel ratio to account for slight color differences in the 3D viewport
await checkForScreenshot({
page,
+1 -1
View File
@@ -18,7 +18,7 @@ test.describe('3D primary Test', async () => {
await mainToolbarPageObject.layoutSelection.threeDPrimary.click();
await attemptAction(() => reduce3DViewportSize(page), 10, 100);
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(
page,
page,
+3 -3
View File
@@ -28,7 +28,7 @@ test('should display the arrow tool and allow free-form text to be entered', asy
await DOMOverlayPageObject.viewport.measurementTracking.confirm.click();
await page.waitForTimeout(2000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot({
page,
@@ -42,7 +42,7 @@ test('should display the arrow tool and allow free-form text to be entered', asy
await DOMOverlayPageObject.dialog.input.fillAndSave('Neil Peart was the drummer for Rush');
await page.waitForTimeout(2000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot({
page,
@@ -56,7 +56,7 @@ test('should display the arrow tool and allow free-form text to be entered', asy
.nthMeasurement(0)
.actions.rename('Drummer annotation arrow');
await page.waitForTimeout(2000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot({
page,
+1
View File
@@ -39,6 +39,7 @@ test('should display the long series name properly within the series select butt
const mode = 'viewer';
await visitStudy(page, studyInstanceUID, mode, 2000);
await mainToolbarPageObject.waitForVolumeLoad();
await mainToolbarPageObject.moreTools.tagBrowser.click();
const dicomTagBrowser = DOMOverlayPageObject.dialog.dicomTagBrowser;
+1
View File
@@ -8,5 +8,6 @@ test.beforeEach(async ({ page }) => {
test('should invert the image', async ({ page, mainToolbarPageObject }) => {
await mainToolbarPageObject.moreTools.invert.click();
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(page, page, screenShotPaths.invert.invertDisplayedCorrectly);
});
+2 -4
View File
@@ -14,8 +14,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me
}) => {
await mainToolbarPageObject.layoutSelection.MPR.click();
// Wait 5 seconds for MPR to load. This is necessary in particular when screen shots are added or replaced.
await page.waitForTimeout(10000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(
page,
@@ -35,8 +34,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me
// Adding an overlay should not show the LOAD button.
await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 });
// Wait 5 seconds for RT to load. This is necessary in particular when screen shots are added or replaced.
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot({
page,
@@ -10,6 +10,7 @@ test.beforeEach(async ({ page }) => {
test('should display multiple segmentation overlays (both SEG and RT)', async ({
page,
mainToolbarPageObject,
rightPanelPageObject,
viewportPageObject,
}) => {
@@ -20,24 +21,21 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({
await dataOverlayPageObject.toggle();
await dataOverlayPageObject.addSegmentation('2d-tta_nnU-Net_Segmentation');
// A short wait after each overlay is selected to ensure it loads.
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
// Adding an overlay should not show the LOAD button.
assertNumberOfModalityLoadBadges({ page, expectedCount: 0 });
await dataOverlayPageObject.addSegmentation('Segmentation');
// A short wait after each overlay is selected to ensure it loads.
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
// Adding an overlay should not show the LOAD button.
assertNumberOfModalityLoadBadges({ page, expectedCount: 0 });
await dataOverlayPageObject.addSegmentation('3d_lowres-tta_nnU-Net_Segmentation');
// A short wait after each overlay is selected to ensure it loads.
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
// Adding an overlay should not show the LOAD button.
assertNumberOfModalityLoadBadges({ page, expectedCount: 0 });
@@ -61,7 +59,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({
// Navigate to image 56.
await press({ page, key: 'ArrowDown', nTimes: 55 });
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot({
page,
@@ -73,8 +71,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({
await dataOverlayPageObject.addSegmentation('Series 3 - RTSTRUCT');
// A short wait after each overlay is selected to ensure it loads.
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
// Adding an overlay should not show the LOAD button.
assertNumberOfModalityLoadBadges({ page, expectedCount: 0 });
@@ -24,7 +24,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me
// Hide the overlay menu.
await dataOverlayPageObject.toggle();
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(
page,
@@ -34,7 +34,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me
await mainToolbarPageObject.layoutSelection.MPR.click();
await page.waitForTimeout(5000);
await mainToolbarPageObject.waitForVolumeLoad();
await checkForScreenshot(
page,
+3 -3
View File
@@ -1,5 +1,4 @@
import { test } from 'playwright-test-coverage';
import { visitStudy, checkForScreenshot, screenShotPaths } from './utils';
import { test, visitStudy, checkForScreenshot, screenShotPaths } from './utils';
test.beforeEach(async ({ page }) => {
const studyInstanceUID =
@@ -8,7 +7,8 @@ test.beforeEach(async ({ page }) => {
await visitStudy(page, studyInstanceUID, mode, 10000);
});
test('should properly display MPR for MR', async ({ page }) => {
test('should properly display MPR for MR', async ({ page, mainToolbarPageObject }) => {
await mainToolbarPageObject.waitForVolumeLoad();
await page.getByTestId('side-panel-header-right').click();
// await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
await checkForScreenshot(page, page, screenShotPaths.mpr2.mprDisplayedCorrectly);
+11
View File
@@ -7,6 +7,11 @@ export class MainToolbarPageObject {
this.page = page;
}
async waitForVolumeLoad(): Promise<void> {
await this.page.waitForTimeout(2000);
await this.page.waitForLoadState('networkidle', { timeout: 120000 });
}
get crosshairs() {
const button = this.page.getByTestId('Crosshairs');
return {
@@ -18,6 +23,7 @@ export class MainToolbarPageObject {
}
get layoutSelection() {
const page = this.page;
const self = this;
const button = page.getByTestId('Layout');
const layoutSelection = {
@@ -46,6 +52,7 @@ export class MainToolbarPageObject {
async click() {
await layoutSelection.click();
await button.click();
await self.waitForVolumeLoad();
},
};
},
@@ -56,6 +63,7 @@ export class MainToolbarPageObject {
async click() {
await layoutSelection.click();
await button.click();
await self.waitForVolumeLoad();
},
};
},
@@ -66,6 +74,7 @@ export class MainToolbarPageObject {
async click() {
await layoutSelection.click();
await button.click();
await self.waitForVolumeLoad();
},
};
},
@@ -76,6 +85,7 @@ export class MainToolbarPageObject {
async click() {
await layoutSelection.click();
await button.click();
await self.waitForVolumeLoad();
},
};
},
@@ -86,6 +96,7 @@ export class MainToolbarPageObject {
async click() {
await layoutSelection.click();
await button.click();
await self.waitForVolumeLoad();
},
};
},