diff --git a/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.test.tsx b/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.test.tsx
index abb614042..a0d6035a4 100644
--- a/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.test.tsx
+++ b/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.test.tsx
@@ -516,7 +516,7 @@ describe("CopyJobActionMenu", () => {
expect(screen.getByText("Cancel")).toBeInTheDocument();
});
- it("should handle complete action disabled state for online jobs", () => {
+ it("should disable complete action when job is being updated", () => {
const job = createMockJob({
Status: CopyJobStatusType.InProgress,
Mode: CopyJobMigrationType.Online,
@@ -530,8 +530,34 @@ describe("CopyJobActionMenu", () => {
const completeButton = screen.getByText("Complete");
fireEvent.click(completeButton);
+ // Simulate dialog confirmation to trigger state update
+ const [, , , onOkCallback] = mockShowOkCancelModalDialog.mock.calls[0];
+ onOkCallback();
+
fireEvent.click(actionButton);
- expect(screen.getByText("Complete")).toBeInTheDocument();
+ const completeButtonAfterClick = screen.getByText("Complete").closest("button");
+ expect(completeButtonAfterClick).toBeInTheDocument();
+ expect(completeButtonAfterClick).toHaveAttribute("aria-disabled", "true");
+ });
+
+ it("should disable complete action when any other action is being performed", () => {
+ const job = createMockJob({
+ Status: CopyJobStatusType.InProgress,
+ Mode: CopyJobMigrationType.Online,
+ });
+
+ render();
+
+ const actionButton = screen.getByRole("button", { name: "Actions" });
+ fireEvent.click(actionButton);
+
+ const pauseButton = screen.getByText("Pause");
+ fireEvent.click(pauseButton);
+ fireEvent.click(actionButton);
+
+ const completeButtonAfterClick = screen.getByText("Complete").closest("button");
+ expect(completeButtonAfterClick).toBeInTheDocument();
+ expect(completeButtonAfterClick).toHaveAttribute("aria-disabled", "true");
});
});
diff --git a/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.tsx b/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.tsx
index 058a717bb..682e20c9a 100644
--- a/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.tsx
+++ b/src/Explorer/ContainerCopy/MonitorCopyJobs/Components/CopyJobActionMenu.tsx
@@ -61,7 +61,6 @@ const CopyJobActionMenu: React.FC = ({ job, handleClick
const getMenuItems = (): IContextualMenuProps["items"] => {
const isThisJobUpdating = updatingJobAction?.jobName === job.Name;
- const updatingAction = updatingJobAction?.action;
const baseItems = [
{
@@ -105,7 +104,7 @@ const CopyJobActionMenu: React.FC = ({ job, handleClick
text: ContainerCopyMessages.MonitorJobs.Actions.complete,
iconProps: { iconName: "CheckMark" },
onClick: () => showActionConfirmationDialog(job, CopyJobActions.complete),
- disabled: isThisJobUpdating && updatingAction === CopyJobActions.complete,
+ disabled: isThisJobUpdating,
});
}
return filteredItems;
diff --git a/src/Main.tsx b/src/Main.tsx
index af3d462a7..c90f016ac 100644
--- a/src/Main.tsx
+++ b/src/Main.tsx
@@ -105,9 +105,12 @@ const App = (): JSX.Element => {
// Scenario-based health tracking: start ApplicationLoad and complete phases.
const { startScenario, completePhase } = useMetricScenario();
React.useEffect(() => {
- startScenario(MetricScenario.ApplicationLoad);
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
+ // Only start scenario after config is initialized to avoid race conditions
+ // with message handlers that depend on configContext.platform
+ if (config) {
+ startScenario(MetricScenario.ApplicationLoad);
+ }
+ }, [config, startScenario]);
React.useEffect(() => {
if (explorer) {
diff --git a/test/sql/indexAdvisor.spec.ts b/test/sql/indexAdvisor.spec.ts
index 4d9ac6aa2..dc6ee978c 100644
--- a/test/sql/indexAdvisor.spec.ts
+++ b/test/sql/indexAdvisor.spec.ts
@@ -10,7 +10,7 @@ let CONTAINER_ID: string;
// Set up test database and container with data before all tests
test.beforeAll(async () => {
- testContainer = await createTestSQLContainer(true);
+ testContainer = await createTestSQLContainer({ includeTestData: true });
DATABASE_ID = testContainer.database.id;
CONTAINER_ID = testContainer.container.id;
});