Repository: opendatahub-io/odh-dashboard
Pull request #3999: Cypress Mock tests for InstructLab
Author: login: dpanshug
Labels: name: lgtm
name: approved
Created: 2025-04-01T13:57:46Z | Merged: 2025-04-03T19:34:15Z

[RHOAIENG-22105](https://issues.redhat.com/browse/RHOAIENG-22105)

## Description
Cypress tests for ilab

## How Has This Been Tested?
Just added mock tests

## Test Impact
* Added test for sections in ilab form
* Added test for testing errors
* Added test for Registered model label in pipeline run tables
* Added test for Artifacts to check registered model label and URL in details page.

## Request review criteria:
<!--- This PR will be merged by any repository approver when it meets all the points in the checklist -->
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->

Self checklist (all need to be checked):
- [x] The developer has manually tested the changes and verified that the changes work
- [x] Testing instructions have been added in the PR body (for PRs involving changes that are not immediately obvious).
- [x] The developer has added tests or explained why testing cannot be added (unit or cypress tests for related changes)

If you have UI changes: 
<!--- You can ignore these if you are doing manifest, backend, internal logic, etc changes; aka non-UI / visual changes -->
- [ ] Included any necessary screenshots or gifs if it was a UI change.
- [ ] Included tags to the UX team if it was a UI/UX change.

After the PR is posted & before it merges:
- [ ] The developer has tested their solution on a cluster by using the image produced by the PR to `main`



Diff:
diff --git a/frontend/src/__mocks__/mlmd/mockGetArtifacts.ts b/frontend/src/__mocks__/mlmd/mockGetArtifacts.ts
index 0dabbb244c..7af27e8907 100644
--- a/frontend/src/__mocks__/mlmd/mockGetArtifacts.ts
+++ b/frontend/src/__mocks__/mlmd/mockGetArtifacts.ts
@@ -355,6 +355,23 @@ export const mockedArtifactsResponse: GetArtifactsResponse = {
       createTimeSinceEpoch: 1611399342384,
       lastUpdateTimeSinceEpoch: 1611399342384,
     },
+    {
+      id: 8,
+      typeId: 15,
+      uri: 's3://scalar-metrics-uri-scalar-metrics-uri',
+      customProperties: {
+        display_name: { stringValue: 'registered model metrics' },
+        registeredModelName: { stringValue: 'model' },
+        registeredModelId: { stringValue: '1' },
+        modelVersionName: { stringValue: '1' },
+        modelVersionId: { stringValue: '1' },
+        modelRegistryName: { stringValue: 'model-registry' },
+      },
+      state: 2,
+      properties: {},
+      createTimeSinceEpoch: 1611399342384,
+      lastUpdateTimeSinceEpoch: 1611399342384,
+    },
   ],
 };
 
diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/artifacts.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/artifacts.ts
index c29ab94975..ec5954e14e 100644
--- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/artifacts.ts
+++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/artifacts.ts
@@ -85,6 +85,10 @@ class ArtifactsTableRow extends Contextual<HTMLTableRowElement> {
   findCreated() {
     return this.find().find(`[data-label=Created]`);
   }
+
+  findLabel() {
+    return this.find().findByTestId('model-registered-label');
+  }
 }
 
 class ArtifactDetails {
@@ -136,6 +140,14 @@ class ArtifactDetails {
     return cy.findByTestId('artifact-custom-properties-section');
   }
 
+  findRegisteredModelSection() {
+    return cy.findByTestId('registered-model-details');
+  }
+
+  findModelVersionLink() {
+    return cy.findByTestId('model-version-link').invoke('attr', 'href');
+  }
+
   mockGetArtifactById(projectName: string, response: GrpcResponse) {
     return cy.interceptOdh(
       'POST /api/service/mlmd/:namespace/:serviceName/ml_metadata.MetadataStoreService/GetArtifactsByID',
diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/modelCustomizationForm.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/modelCustomizationForm.ts
index d3b440347b..7d233b2157 100644
--- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/modelCustomizationForm.ts
+++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/modelCustomizationForm.ts
@@ -62,6 +62,10 @@ class ModelCustomizationFormGlobal {
     return cy.findByTestId('empty-state-title');
   }
 
+  findEmptyErrorState() {
+    return cy.findByTestId('error-empty-state-body');
+  }
+
   findExpandableSectionButton() {
     return cy.findByTestId('hyperparameters-expandable').findByRole('button');
   }
@@ -143,6 +147,22 @@ class HardwareSection {
 }
 
 class BaseModelSection {
+  findModelName() {
+    return cy.findByTestId('base-model-name');
+  }
+
+  findModelRegistry() {
+    return cy.findByTestId('base-registry-name');
+  }
+
+  findModelVersion() {
+    return cy.findByTestId('base-model-version');
+  }
+
+  findModelURI() {
+    return cy.findByTestId('base-model-uri').find('[data-testid="inline-edit-text-content"]');
+  }
+
   findEditInlineTextInput() {
     return cy.findByTestId('edit-inline-text-input');
   }
@@ -166,9 +186,27 @@ class BaseModelSection {
   }
 }
 
+class DataScienceProjectSection {
+  findProjectName() {
+    return cy.findByTestId('data-science-project-name');
+  }
+}
+
+class PipelineSection {
+  findPipelineName() {
+    return cy.findByTestId('pipeline-name');
+  }
+
+  findPipelineVersion() {
+    return cy.findByTestId('pipeline-version');
+  }
+}
+
 export const modelCustomizationFormGlobal = new ModelCustomizationFormGlobal();
 export const teacherModelSection = new TeacherModelSection();
 export const baseModelSection = new BaseModelSection();
 export const judgeModelSection = new JudgeModelSection();
 export const taxonomySection = new TaxonomySection();
 export const hardwareSection = new HardwareSection();
+export const dataScienceProjectSection = new DataScienceProjectSection();
+export const pipelineSection = new PipelineSection();
diff --git a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts
index 8ba105985a..b687b98853 100644
--- a/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts
+++ b/frontend/src/__tests__/cypress/cypress/pages/pipelines/pipelineRunTable.ts
@@ -17,6 +17,10 @@ class PipelineRunTableRow extends PipelineRunsRow {
     this.find().findKebab().click();
     return cy.findByTestId('pipeline-run-table-row-actions').findByRole('menuitem', { name });
   }
+
+  findModelRegisteredLabel() {
+    return this.find().findByTestId('model-registered-label');
+  }
 }
 
 class PipelineRecurringRunTableRow extends PipelineRunsRow {
@@ -165,6 +169,16 @@ class ActiveRunsTable extends PipelineRunsTable {
       this.find().find(`[data-label=Name]`).contains(name).parents('tr'),
     );
   }
+
+  getLabelInRowByName(name: string) {
+    return new PipelineRunTableRow(() =>
+      this.find().find(`[data-label=Name]`).contains(name).parents('tr'),
+    );
+  }
+
+  findModelRegisteredLabel(name: string) {
+    return this.getLabelInRowByName(name).findModelRegisteredLabel();
+  }
 }
 class ArchivedRunsTable extends PipelineRunsTable {
   constructor() {
diff --git a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/artifacts.cy.ts b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/artifacts.cy.ts
index 8fae948579..f96c6c5e72 100644
--- a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/artifacts.cy.ts
+++ b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/artifacts.cy.ts
@@ -93,6 +93,18 @@ describe('Artifacts', () => {
       cy.url().should('include', `/artifacts/${projectName}/1`);
     });
 
+    it('it has label Registered for fine tune artifact', () => {
+      artifactsTable.mockGetArtifacts(
+        projectName,
+        mockGetArtifactsResponse(mockedArtifactsResponse),
+      );
+      artifactsGlobal.visit(projectName);
+      artifactsTable
+        .getRowByName('registered model metrics')
+        .findLabel()
+        .should('have.text', 'Registered');
+    });
+
     describe('filters data by', () => {
       beforeEach(() => {
         artifactsTable.mockGetArtifacts(
@@ -101,7 +113,7 @@ describe('Artifacts', () => {
           3,
         );
         artifactsGlobal.visit(projectName);
-        artifactsTable.findRows().should('have.length', 6);
+        artifactsTable.findRows().should('have.length', 7);
       });
 
       it('name', () => {
@@ -118,7 +130,7 @@ describe('Artifacts', () => {
           1,
         );
         artifactsGlobal.findFilterFieldInput().type('metrics');
-        artifactsTable.findRows().should('have.length', 3);
+        artifactsTable.findRows().should('have.length', 4);
         artifactsTable.getRowByName('scalar metrics').find().should('be.visible');
         artifactsTable.getRowByName('confidence metrics').find().should('be.visible');
       });
@@ -195,6 +207,23 @@ describe('Artifacts', () => {
       artifactDetails.findExecutionLink('execution/211').click();
       verifyRelativeURL('/executions/test-project-name/211');
     });
+
+    it('Registered models section', () => {
+      artifactDetails.mockGetArtifactById(
+        projectName,
+        mockGetArtifactsById({
+          artifacts: [mockedArtifactsResponse.artifacts[6]],
+          artifactTypes: [],
+        }),
+      );
+      artifactDetails.visit(projectName, 'registered model metrics', '8');
+      artifactDetails
+        .findRegisteredModelSection()
+        .should('have.text', 'model (1) in model-registry registry');
+      artifactDetails
+        .findModelVersionLink()
+        .should('eq', '/modelRegistry/model-registry/registeredModels/1/versions/1');
+    });
   });
 
   describe('artifact in pipeline run details page', () => {
diff --git a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/modelCustomizationForm.cy.ts b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/modelCustomizationForm.cy.ts
index 9569009580..0fa51d0f87 100644
--- a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/modelCustomizationForm.cy.ts
+++ b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/modelCustomizationForm.cy.ts
@@ -7,6 +7,8 @@ import {
   taxonomySection,
   hardwareSection,
   baseModelSection,
+  dataScienceProjectSection,
+  pipelineSection,
 } from '~/__tests__/cypress/cypress/pages/pipelines/modelCustomizationForm';
 import {
   buildMockPipeline,
@@ -93,6 +95,36 @@ describe('Model Customization Form', () => {
     modelCustomizationFormGlobal.findEmptyState().should('exist');
   });
 
+  it('Section Project details', () => {
+    initIntercepts({});
+    modelCustomizationFormGlobal.visit(projectName, true);
+    dataScienceProjectSection.findProjectName().should('have.text', 'Test Project 2');
+  });
+
+  it('Section Pipeline details', () => {
+    initIntercepts({});
+    modelCustomizationFormGlobal.visit(projectName, true);
+    pipelineSection.findPipelineName().should('have.text', 'instructlab');
+    pipelineSection.findPipelineVersion().should('have.text', 'Test pipeline version');
+  });
+
+  it('Section Base model', () => {
+    initIntercepts({});
+    setupModelRegistryIntercepts({ modelRegistryServiceName: 'modelregistry-sample' });
+    visitModelVersionDetails({ serviceName: 'modelregistry-sample', versionNo: '1' });
+    cy.wait('@getIlabPipeline');
+    cy.wait('@getPipelineVersions');
+    baseModelSection.findModelRegistry().should('have.text', 'modelregistry-sample');
+    baseModelSection.findModelName().should('have.text', 'test');
+    baseModelSection.findModelVersion().should('have.text', 'Version 1');
+    baseModelSection
+      .findModelURI()
+      .should(
+        'have.text',
+        's3://test-bucket/demo-models/test-path?endpoint=test-endpoint&defaultRegion=test-region',
+      );
+  });
+
   it('Should submit', () => {
     initIntercepts({});
     setupModelRegistryIntercepts({ modelRegistryServiceName: 'modelregistry-sample' });
@@ -126,7 +158,8 @@ describe('Model Customization Form', () => {
 
     modelCustomizationFormGlobal.findErrorMessage().should('exist');
   });
-  it('Should not submit', () => {
+
+  it('Should show error when pipeline is invalid', () => {
     initIntercepts({});
     cy.interceptOdh(
       'GET /api/service/pipelines/:namespace/:serviceName/apis/v2beta1/pipelines/names/:pipelineName',
@@ -141,6 +174,9 @@ describe('Model Customization Form', () => {
     ).as('getIlabPipeline');
     modelCustomizationFormGlobal.visit(projectName);
     cy.wait('@getIlabPipeline');
+    modelCustomizationFormGlobal
+      .findEmptyErrorState()
+      .should('have.text', 'Error communicating with pipeline server');
     modelCustomizationFormGlobal.findSubmitButton().should('not.exist');
   });
 
diff --git a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/runs/pipelineRuns.cy.ts b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/runs/pipelineRuns.cy.ts
index 0f42238f05..e24912fd68 100644
--- a/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/runs/pipelineRuns.cy.ts
+++ b/frontend/src/__tests__/cypress/cypress/tests/mocked/pipelines/runs/pipelineRuns.cy.ts
@@ -33,6 +33,10 @@ import { be } from '~/__tests__/cypress/cypress/utils/should';
 import { ProjectModel } from '~/__tests__/cypress/cypress/utils/models';
 import { tablePagination } from '~/__tests__/cypress/cypress/pages/components/Pagination';
 import { dspaIntercepts } from '~/__tests__/cypress/cypress/tests/mocked/pipelines/intercepts';
+import {
+  mockedArtifactsResponse,
+  mockGetArtifactsResponse,
+} from '~/__mocks__/mlmd/mockGetArtifacts';
 
 const projectName = 'test-project-filters';
 const pipelineId = 'test-pipeline';
@@ -582,6 +586,15 @@ describe('Pipeline runs', () => {
           pipelineRunFilterBar.findSortButtonForActive('Run').should(be.sortDescending);
         });
       });
+
+      describe('Labels', () => {
+        it('shows model registered label when fine tuning and model registry is enabled', () => {
+          pipelineRunsGlobal.visit(projectName, 'active');
+          activeRunsTable
+            .findModelRegisteredLabel('Test active run 1')
+            .should('have.text', 'Model registered');
+        });
+      });
     });
   });
 
@@ -1192,4 +1205,12 @@ const initIntercepts = () => {
       ),
     ]),
   );
+
+  cy.interceptOdh(
+    'POST /api/service/mlmd/:namespace/:serviceName/ml_metadata.MetadataStoreService/GetArtifacts',
+    { path: { namespace: projectName, serviceName: 'dspa' } },
+    mockGetArtifactsResponse({
+      artifacts: mockedArtifactsResponse.artifacts.filter((mockArtifact) => mockArtifact.id === 8),
+    }),
+  );
 };
diff --git a/frontend/src/concepts/pipelines/content/PipelineRunTypeLabel.tsx b/frontend/src/concepts/pipelines/content/PipelineRunTypeLabel.tsx
index 7086b7e413..6660ae9880 100644
--- a/frontend/src/concepts/pipelines/content/PipelineRunTypeLabel.tsx
+++ b/frontend/src/concepts/pipelines/content/PipelineRunTypeLabel.tsx
@@ -34,7 +34,7 @@ const PipelineRunTypeLabel: React.FC<PipelineRunTypeLabelProps> = ({
     {isModelRegistered && (
       <>
         {' '}
-        <Label color="green" isCompact={isCompact}>
+        <Label color="green" isCompact={isCompact} data-testid="model-registered-label">
           Model registered
         </Label>
       </>
diff --git a/frontend/src/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunRegisteredModelDetails.tsx b/frontend/src/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunRegisteredModelDetails.tsx
index 6d137a3e7b..0ad2948308 100644
--- a/frontend/src/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunRegisteredModelDetails.tsx
+++ b/frontend/src/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunRegisteredModelDetails.tsx
@@ -10,7 +10,7 @@ type PipelineRunRegisteredModelDeatilsProps = {
 const PipelineRunRegisteredModelDetails = ({
   artifactModelData,
 }: PipelineRunRegisteredModelDeatilsProps): React.ReactNode => (
-  <>
+  <div data-testid="registered-model-details">
     <strong>
       <Link
         to={modelVersionUrl(
@@ -18,12 +18,13 @@ const PipelineRunRegisteredModelDetails = ({
           artifactModelData.registeredModelId,
           artifactModelData.modelRegistryName,
         )}
+        data-testid="model-version-link"
       >
         {artifactModelData.registeredModelName} ({artifactModelData.modelVersionName ?? 'N/A'})
       </Link>
     </strong>{' '}
     in <strong>{artifactModelData.modelRegistryName ?? 'N/A'}</strong> registry
-  </>
+  </div>
 );
 
 export default PipelineRunRegisteredModelDetails;
diff --git a/frontend/src/pages/ApplicationsPage.tsx b/frontend/src/pages/ApplicationsPage.tsx
index 727410b2b9..0e03e231c8 100644
--- a/frontend/src/pages/ApplicationsPage.tsx
+++ b/frontend/src/pages/ApplicationsPage.tsx
@@ -91,7 +91,9 @@ const ApplicationsPage: React.FC<ApplicationsPageProps> = ({
             variant={EmptyStateVariant.lg}
             data-id="error-empty-state"
           >
-            <EmptyStateBody>{loadError.message}</EmptyStateBody>
+            <EmptyStateBody data-testid="error-empty-state-body">
+              {loadError.message}
+            </EmptyStateBody>
           </EmptyState>
         </PageSection>
       ) : (
diff --git a/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactsTableRow.tsx b/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactsTableRow.tsx
index 8c1271d673..14a38f4795 100644
--- a/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactsTableRow.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactsTableRow.tsx
@@ -31,7 +31,7 @@ const ArtifactsTableRow: React.FC<ArtifactsTableRowProps> = ({ artifact }) => {
           {isArtifactModelRegistered && (
             <>
               {' '}
-              <Label color="green" isCompact>
+              <Label color="green" isCompact data-testid="model-registered-label">
                 Registered
               </Label>
             </>
diff --git a/frontend/src/pages/pipelines/global/modelCustomization/FineTunePage.tsx b/frontend/src/pages/pipelines/global/modelCustomization/FineTunePage.tsx
index 4f18da4017..455cb9349f 100644
--- a/frontend/src/pages/pipelines/global/modelCustomization/FineTunePage.tsx
+++ b/frontend/src/pages/pipelines/global/modelCustomization/FineTunePage.tsx
@@ -79,7 +79,9 @@ const FineTunePage: React.FC<FineTunePageProps> = ({
             fieldId="model-customization-projectName"
             isRequired
           >
-            <div>{getDisplayNameFromK8sResource(project)}</div>
+            <div data-testid="data-science-project-name">
+              {getDisplayNameFromK8sResource(project)}
+            </div>
           </FormGroup>
         </FormSection>
         <PipelineDetailsSection
diff --git a/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/BaseModelSection.tsx b/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/BaseModelSection.tsx
index 533122328a..14d6ed3530 100644
--- a/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/BaseModelSection.tsx
+++ b/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/BaseModelSection.tsx
@@ -63,18 +63,19 @@ const BaseModelSection: React.FC<BaseModelSectionProps> = ({
         </FlexItem>
       </Flex>
       <FormGroup label="Model registry name" fieldId={`${FIELD_ID_PREFIX}-registryName`}>
-        {registryName ?? '-'}
+        <div data-testid="base-registry-name">{registryName ?? '-'}</div>
       </FormGroup>
       <FormGroup label="Model name" fieldId={`${FIELD_ID_PREFIX}-name`}>
-        {inputModelName ?? '-'}
+        <div data-testid="base-model-name">{inputModelName ?? '-'}</div>
       </FormGroup>
       <FormGroup label="Model version" fieldId={`${FIELD_ID_PREFIX}-version`}>
-        {inputModelVersionName ?? '-'}
+        <div data-testid="base-model-version">{inputModelVersionName ?? '-'}</div>
       </FormGroup>
       <FormGroup
         label="Model input storage location URI"
         fieldId={`${FIELD_ID_PREFIX}-inputStorageLocationUri`}
         isRequired
+        data-testid="base-model-uri"
       >
         <InlineEditText
           onSave={(text) => {
diff --git a/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/InlineEditText.tsx b/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/InlineEditText.tsx
index 0c88c1becb..de97045247 100644
--- a/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/InlineEditText.tsx
+++ b/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/InlineEditText.tsx
@@ -102,7 +102,13 @@ const InlineEditText: React.FC<InlineEditTextProps> = ({
           </>
         ) : (
           <>
-            <FlexItem>{isEmpty ? <i>Set a value ...</i> : <Content>{text}</Content>}</FlexItem>
+            <FlexItem>
+              {isEmpty ? (
+                <i>Set a value ...</i>
+              ) : (
+                <Content data-testid="inline-edit-text-content">{text}</Content>
+              )}
+            </FlexItem>
             <FlexItem>
               <Button
                 data-testid="edit-inline-text-button"
diff --git a/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/PipelineDetailsSection.tsx b/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/PipelineDetailsSection.tsx
index 9890d75eae..35b134d9e1 100644
--- a/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/PipelineDetailsSection.tsx
+++ b/frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/PipelineDetailsSection.tsx
@@ -55,11 +55,13 @@ export const PipelineDetailsSection: React.FC<PipelineDetailsSectionProps> = ({
       {ilabPipelineLoaded ? (
         <>
           <FormGroup label="Pipeline name" fieldId="pipeline-name" isRequired>
-            {ilabPipeline?.display_name ?? '-'}
+            <div data-testid="pipeline-name">{ilabPipeline?.display_name ?? '-'}</div>
           </FormGroup>
           <FormGroup label="Pipeline version" fieldId="pipeline-version" isRequired>
             <Stack hasGutter>
-              <StackItem>{ilabPipelineVersion?.display_name ?? '-'}</StackItem>
+              <StackItem data-testid="pipeline-version">
+                {ilabPipelineVersion?.display_name ?? '-'}
+              </StackItem>
               <StackItem>
                 {hasValidationErrors && (
                   <Alert


Reviews:
user: login: pnaik1
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-02T07:53:55Z
user: login: dpanshug
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-02T11:51:20Z
user: login: Gkrumbach07
body: /lgtm

coverage looks good
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-03T18:35:12Z

Review comments:
diff_hunk: @@ -63,18 +63,19 @@ const BaseModelSection: React.FC<BaseModelSectionProps> = ({
         </FlexItem>
       </Flex>
       <FormGroup label="Model registry name" fieldId={`${FIELD_ID_PREFIX}-registryName`}>
-        {registryName ?? '-'}
+        <div data-testid="base-registry-name">{registryName ?? '-'}</div>
path: frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/BaseModelSection.tsx
user: login: pnaik1
body: Just checking if we can directly add `data-testid` to FormGroup or if we can use label value as a selector here instead of having a extra div
The same applies to the following
created_at: 2025-04-02T07:52:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -63,18 +63,19 @@ const BaseModelSection: React.FC<BaseModelSectionProps> = ({
         </FlexItem>
       </Flex>
       <FormGroup label="Model registry name" fieldId={`${FIELD_ID_PREFIX}-registryName`}>
-        {registryName ?? '-'}
+        <div data-testid="base-registry-name">{registryName ?? '-'}</div>
path: frontend/src/pages/pipelines/global/modelCustomization/baseModelSection/BaseModelSection.tsx
user: login: dpanshug
body: I've tried but with Fromgroup it also fetches the label in it. 
created_at: 2025-04-02T11:51:20Z
author_association: CONTRIBUTOR

PR comments:
user: login: openshift-ci[bot]
created_at: 2025-04-03T18:35:18Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/opendatahub-io/odh-dashboard/pull/3999#pullrequestreview-2740807232" title="LGTM">Gkrumbach07</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=opendatahub-io%2Fodh-dashboard).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[frontend/OWNERS](https://github.com/opendatahub-io/odh-dashboard/blob/main/frontend/OWNERS)~~ [Gkrumbach07]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-04-03T18:35:47Z
body: ## [Codecov](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/pull/3999?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 0.00%. Comparing base [(`3031a7b`)](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/commit/3031a7b1710d7bbb29a9b672ef02929d733230df?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io) to head [(`4577db3`)](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/commit/4577db360d07790555cd6c8b37620790fd39d8b6?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io).
> Report is 19 commits behind head on main.

<details><summary>Additional details and impacted files</summary>


[![Impacted file tree graph](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/pull/3999/graphs/tree.svg?width=650&height=150&src=pr&token=UQM7NLQUXJ&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io)](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/pull/3999?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io)

```diff
@@     Coverage Diff      @@
##   main   #3999   +/-   ##
============================
============================

```

------

[Continue to review full report in Codecov by Sentry](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/pull/3999?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/pull/3999?dropdown=coverage&src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io). Last update [3031a7b...4577db3](https://app.codecov.io/gh/opendatahub-io/odh-dashboard/pull/3999?dropdown=coverage&src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=opendatahub-io).

</details>
<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE