Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cypress e2e Maintenance - PF6/Test Enhancements/General Maintenance #3591

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
cacbfe5
Initial WIP version of resource creation test
antowaddle Nov 20, 2024
0fa2201
Experimental changes to poll the UI for updates
antowaddle Nov 21, 2024
af87ad1
Working version if resource is present
antowaddle Nov 21, 2024
0e9868a
increase card timeout and delete active wait
FedeAlonso Nov 21, 2024
429f086
Merge pull request #1 from FedeAlonso/fix/active_wait
antowaddle Nov 21, 2024
443e530
Added changes to find namespace from variables
antowaddle Nov 22, 2024
966917f
Final changes to read variables, cleaned up utils
antowaddle Nov 22, 2024
69db944
Merge branch 'main' into cypress-RHOAIENG-14368
antowaddle Nov 22, 2024
a9ecfa3
Small change to a comment
antowaddle Nov 22, 2024
6cd6a3e
Dummy change to trigger mocks
antowaddle Nov 22, 2024
fcc6d18
Merge branch 'opendatahub-io:main' into main
antowaddle Nov 22, 2024
c7d471a
Merge branch 'main' into cypress-RHOAIENG-14368
antowaddle Nov 22, 2024
7628316
Save changes on cypress-RHOAIENG-12649
antowaddle Nov 25, 2024
847ad11
Changed file directories and names as requested on a PR comment
antowaddle Nov 25, 2024
552a516
Merge branch 'main' into cypress-RHOAIENG-14368
antowaddle Nov 25, 2024
80cc894
Merge branch 'cypress-RHOAIENG-14368' of https://github.com/antowaddl…
antowaddle Nov 25, 2024
163ed94
Merge remote-tracking branch 'origin/main' into cypress-RHOAIENG-12649
antowaddle Nov 25, 2024
0f7eead
Saving changes to current branch
antowaddle Nov 25, 2024
48c7435
Additional directory/file name changes
antowaddle Nov 25, 2024
14a39de
Additional changes to save
antowaddle Nov 25, 2024
6a93ec2
Resolving timeout issue breaking mock tests, also resolved latest PR …
antowaddle Nov 25, 2024
31b9723
Further changes for this test
antowaddle Nov 25, 2024
f2b636d
Changes to revert the exist method appended to getCardView.
antowaddle Nov 25, 2024
a9feb1b
Fixed linting
antowaddle Nov 25, 2024
aa9430e
Linting fixes
antowaddle Nov 25, 2024
eddd7d8
Merge branch 'main' into cypress-RHOAIENG-12649Merge branch 'main' of…
antowaddle Nov 25, 2024
680a0ee
Final comments added
antowaddle Nov 25, 2024
b6bc5b3
Merge branch 'main' into cypress-RHOAIENG-12649
antowaddle Nov 26, 2024
781e952
Fixed merge conflict
antowaddle Nov 26, 2024
b05b676
Small change to page object name
antowaddle Nov 26, 2024
3681244
dummy commit
antowaddle Nov 26, 2024
fb11cc5
Removed RHOAI bug workaround
antowaddle Nov 26, 2024
e0b9cca
Removed comments
antowaddle Nov 26, 2024
06167d8
Last comment change
antowaddle Nov 26, 2024
ae51479
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 9, 2024
dac0574
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 10, 2024
2cd1f7e
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 11, 2024
645dca1
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 13, 2024
f044a29
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 16, 2024
7aa9059
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 16, 2024
ff28a5d
Merge branch 'main' of github.com:opendatahub-io/odh-dashboard
antowaddle Dec 18, 2024
bca2ef3
Merge branch 'main' of https://github.com/antowaddle/odh-dashboard
antowaddle Dec 18, 2024
6005b3e
Added a further exclusion for Manifest checker, updated cluster stora…
antowaddle Dec 18, 2024
d8ac06b
Fede cypress rhoaieng 17124 (#2)
FedeAlonso Dec 18, 2024
263a607
Merge branch 'cypress-RHOAIENG-17124' of https://github.com/antowaddl…
antowaddle Dec 18, 2024
1ae3b35
Added further steps to storageClasses
antowaddle Dec 18, 2024
a31c55e
Linting, linting, linting....
antowaddle Dec 18, 2024
2742612
Merge branch 'main' into cypress-RHOAIENG-17124
antowaddle Dec 18, 2024
e27efca
Merge branch 'main' into cypress-RHOAIENG-17124
FedeAlonso Dec 19, 2024
7e6c67f
Made changes to align with RHOAIENG-7610
antowaddle Dec 19, 2024
fe046c0
Merge branch 'cypress-RHOAIENG-17124' of https://github.com/antowaddl…
antowaddle Dec 19, 2024
180611e
workbenches.cy.ts - use common image for RHODS and RHOAI
FedeAlonso Dec 19, 2024
0b811fe
workbenches.cy.ts - Change image verification to code-server
FedeAlonso Dec 19, 2024
a7d9740
Merge branch 'main' into cypress-RHOAIENG-17124
FedeAlonso Dec 19, 2024
cda65db
Merge branch 'main' into cypress-RHOAIENG-17124
FedeAlonso Dec 20, 2024
f6036ea
fix workbenches dropdown issue (#3)
FedeAlonso Dec 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ excludedSubstrings:
- localhost
- console-openshift-console.apps.test-cluster.example.com/
- console-openshift-console.apps.test-cluster.example.com
- repo.anaconda.cloud/repo/t/$
- repo.anaconda.cloud/repo/t/$
- figma.com/figma/ns
- scikit-learn.org/stable/getting_started.html
13 changes: 13 additions & 0 deletions frontend/src/__tests__/cypress/cypress/pages/workbench.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,19 @@ class AttachExistingStorageModal extends Modal {
cy.findByTestId('persistent-storage-typeahead').contains(name).click();
}

verifyPSDropdownIsDisabled(): void {
cy.get('[data-testid="persistent-storage-group"] .pf-v6-c-menu-toggle')
.should('have.class', 'pf-m-disabled')
.and('have.attr', 'disabled');
}

verifyPSDropdownText(expectedText: string): void {
cy.get('[data-testid="persistent-storage-group"] .pf-v6-c-text-input-group__text-input').should(
'have.value',
expectedText,
);
}

findStandardPathInput() {
return cy.findByTestId('mount-path-folder-value');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { HTPASSWD_CLUSTER_ADMIN_USER } from '~/__tests__/cypress/cypress/utils/e
import {
getDashboardConfig,
getNotebookControllerConfig,
getNotebookControllerCullerConfig,
} from '~/__tests__/cypress/cypress/utils/oc_commands/project';

/* eslint-disable @typescript-eslint/no-namespace */
Expand Down Expand Up @@ -155,6 +156,20 @@ declare global {
* @returns A Cypress.Chainable that resolves to the requested config value or the full config object.
*/
getNotebookControllerConfig: (key?: string) => Cypress.Chainable<DashboardConfig | unknown>;

/**
* Retrieves the Notebook Controller Culler Config from OpenShift and returns either the full config or a specific value.
*
* When no key is provided, returns the entire Notebook Controller Culler Config object.
* When a key is provided, returns the specific value for that key.
*
* @param key Optional. The specific config key to retrieve. Use dot notation for nested properties.
*
* @returns A Cypress.Chainable that resolves to the requested config value or the full config object.
*/
getNotebookControllerCullerConfig: (
key?: string,
) => Cypress.Chainable<DashboardConfig | unknown>;
}
}
}
Expand Down Expand Up @@ -290,6 +305,7 @@ Cypress.Commands.overwriteQuery('findAllByTestId', function findAllByTestId(...a
});
Cypress.Commands.add('getNotebookControllerConfig', getNotebookControllerConfig);
Cypress.Commands.add('getDashboardConfig', getDashboardConfig);
Cypress.Commands.add('getNotebookControllerCullerConfig', getNotebookControllerCullerConfig);

const enhancedFindByTestId = (
command: Cypress.Command,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,17 +72,18 @@ describe('Workbench and PVSs tests', () => {
cy.step(`Create Workbench ${projectName} using storage ${PVCDisplayName}`);
workbenchPage.findCreateButton().click();
createSpawnerPage.getNameInput().fill(workbenchName);
createSpawnerPage.findNotebookImage('jupyter-minimal-notebook').click();
createSpawnerPage.findNotebookImage('code-server-notebook').click();
createSpawnerPage.findAttachExistingStorageButton().click();
attachExistingStorageModal.selectExistingPersistentStorage(PVCDisplayName);
attachExistingStorageModal.verifyPSDropdownIsDisabled();
attachExistingStorageModal.verifyPSDropdownText(PVCDisplayName);
attachExistingStorageModal.findStandardPathInput().fill(workbenchName);
attachExistingStorageModal.findAttachButton().click();
createSpawnerPage.findSubmitButton().click();

cy.step(`Wait for Workbench ${workbenchName} to display a "Running" status`);
const notebookRow = workbenchPage.getNotebookRow(workbenchName);
notebookRow.expectStatusLabelToBe('Running', 120000);
notebookRow.shouldHaveNotebookImageName('Minimal Python');
notebookRow.shouldHaveNotebookImageName('code-server');
notebookRow.shouldHaveContainerSize('Small');

cy.step(`Check the cluster storage ${PVCDisplayName} is now connected to ${workbenchName}`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import {
} from '~/__tests__/cypress/cypress/utils/e2eUsers';
import { clusterSettings } from '~/__tests__/cypress/cypress/pages/clusterSettings';
import { pageNotfound } from '~/__tests__/cypress/cypress/pages/pageNotFound';
import type { DashboardConfig, NotebookControllerConfig } from '~/__tests__/cypress/cypress/types';
import type {
DashboardConfig,
NotebookControllerConfig,
NotebookControllerCullerConfig,
} from '~/__tests__/cypress/cypress/types';
import {
validateModelServingPlatforms,
validatePVCSize,
Expand All @@ -15,6 +19,7 @@ import {
describe('Verify that only the Cluster Admin can access Cluster Settings', () => {
let dashboardConfig: DashboardConfig;
let notebookControllerConfig: NotebookControllerConfig;
let notebookControllerCullerConfig: NotebookControllerCullerConfig | string;

before(() => {
// Retrieve the dashboard configuration
Expand All @@ -27,6 +32,21 @@ describe('Verify that only the Cluster Admin can access Cluster Settings', () =>
notebookControllerConfig = config as NotebookControllerConfig;
cy.log('Controller Config:', JSON.stringify(notebookControllerConfig, null, 2));
});
// Retrieve the Notebook controller culler configuration
cy.getNotebookControllerCullerConfig().then((config) => {
cy.log('Raw Controller Culler Config Response:', JSON.stringify(config));

if (typeof config === 'object' && config !== null) {
notebookControllerCullerConfig = config as NotebookControllerCullerConfig;
cy.log(
'Controller Culler Config:',
JSON.stringify(notebookControllerCullerConfig, null, 2),
);
} else {
notebookControllerCullerConfig = config as string;
cy.log('Controller Culler Config (Error):', config);
}
});
});

it('Admin should access Cluster Settings and see UI fields matching OpenShift configurations', () => {
Expand All @@ -47,12 +67,14 @@ describe('Verify that only the Cluster Admin can access Cluster Settings', () =>

// Validate Stop idle notebooks based on OpenShift command to 'notebook-controller' to validate configuration
cy.step('Validate Stop idle notebooks displays and fields are enabled/disabled');
validateStopIdleNotebooks(notebookControllerConfig);
cy.log('Notebook Controller Culler Config:', JSON.stringify(notebookControllerCullerConfig));
validateStopIdleNotebooks(notebookControllerCullerConfig);

// Validate notebook pod tolerations displays based on OpenShift command to 'get OdhDashboardConfig' to validate configuration
cy.step('Validate Notebook pod tolerations displays and fields are enabled/disabled');
validateNotebookPodTolerations(dashboardConfig);
});

it('Test User - should not have access rights to view the Cluster Settings tab', () => {
cy.step('Log into the application');
cy.visitWithLogin('/', LDAP_CONTRIBUTOR_USER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,23 @@ describe('Regular Users can make use of the Storage Classes in the Cluster Stora
// TODO: This test is failing due to https://issues.redhat.com/browse/RHOAIENG-16609

it('If all SC are disabled except one, the SC dropdown should be disabled', () => {
// Authentication and navigation
cy.visitWithLogin('/projects', LDAP_CONTRIBUTOR_USER);
// Open the project
cy.step(`Navigate to the Project list tab and search for ${dspName}`);
projectListPage.filterProjectByName(dspName);
projectListPage.findProjectLink(dspName).click();
cy.step('Navigate to the Cluster Storage tab and disable all non-default storage classes');
// Go to cluster storage tab
projectDetails.findSectionTab('cluster-storages').click();
// Disable all non-default storage classes
disableNonDefaultStorageClasses().then(() => {
// Open the Create cluster storage Modal
findAddClusterStorageButton().click();

cy.step(
'Checking that Storage Classes Dropdown is disabled - 🐛 RHOAIENG-16609 will fail this test in RHOAI',
);
// Check that the SC Dropdown is disabled
addClusterStorageModal.findStorageClassSelect().should('be.disabled');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,72 +26,86 @@ describe('An admin user can manage Storage Classes from Settings -> Storage clas
});

it('An admin user can enable a disabled Storage Class', () => {
cy.step('Navigate to Storage Classes view');
cy.visitWithLogin('/', HTPASSWD_CLUSTER_ADMIN_USER);
storageClassesPage.navigate();
const scDisabledName = `${scName}-disabled-non-default`;
cy.step('Check SC row exists');
// SC row exist
storageClassesTable.findRowByName(scDisabledName).should('be.visible');
const scDisabledRow = storageClassesTable.getRowByConfigName(scDisabledName);
cy.step("Check there's no Default label");
// There's no Default label
scDisabledRow.findOpenshiftDefaultLabel().should('not.exist');
cy.step('Check the Enable switch is set to disabled');
// The Enable switch is set to disabled
scDisabledRow.findEnableSwitchInput().should('have.attr', 'aria-checked', 'false');
cy.step('Check the Default radio button is disabled');
// The Default radio button is disabled
scDisabledRow.findDefaultRadioInput().should('be.disabled');

cy.step('Enable the Storage Class');
// Enable the SC
scDisabledRow.findEnableSwitchInput().click({ force: true });

cy.step('Check the Enable switch is set to Enabled');
// The Enable switch is set to enabled
scDisabledRow.findEnableSwitchInput().should('have.attr', 'aria-checked', 'true');
cy.step('Check the Default radio button is disabled');
// The Default radio button is enabled but not checked
scDisabledRow.findDefaultRadioInput().should('be.enabled');
scDisabledRow.findDefaultRadioInput().should('not.have.attr', 'checked');
verifyStorageClassConfig(scDisabledName, false, true);
});

it('An admin user can disable an enabled Storage Class', () => {
cy.step('Navigate to Storage Classes view');
cy.visitWithLogin('/', HTPASSWD_CLUSTER_ADMIN_USER);
storageClassesPage.navigate();

const scEnabledName = `${scName}-enabled-non-default`;
// SC row exist

cy.step('Check SC row exists');
storageClassesTable.findRowByName(scEnabledName).should('be.visible');
const scEnabledRow = storageClassesTable.getRowByConfigName(scEnabledName);
// There's no Default label
cy.step("Check there's no Default label");
scEnabledRow.findOpenshiftDefaultLabel().should('not.exist');
// The Enable switch is set to enabled
cy.step('Check the Enable switch is set to enabled');
scEnabledRow.findEnableSwitchInput().should('have.attr', 'aria-checked', 'true');
// The Default radio button is enabled but not checked
cy.step('Check the Default radio button is enabled but not checked');
scEnabledRow.findDefaultRadioInput().should('be.enabled');
scEnabledRow.findDefaultRadioInput().should('not.have.attr', 'checked');

// Enable the SC
cy.step('Enable the Storage Class');
scEnabledRow.findEnableSwitchInput().click({ force: true });

// The Enable switch is set to disabled
cy.step('Check the Enable switch is set to disabled');
scEnabledRow.findEnableSwitchInput().should('have.attr', 'aria-checked', 'false');
// The Default radio button is disabled
cy.step('Check the Default radio button is disabled');
scEnabledRow.findDefaultRadioInput().should('be.disabled');
verifyStorageClassConfig(scEnabledName, false, false);
});

it('An admin user can set an enabled Storage Class as the default one', () => {
cy.step('Navigate to Storage Classes view');
cy.visitWithLogin('/', HTPASSWD_CLUSTER_ADMIN_USER);
storageClassesPage.navigate();

const scToDefaultName = `${scName}-enabled-to-default`;
const scToDefaultRow = storageClassesTable.getRowByConfigName(scToDefaultName);
// There's no Default label

cy.step("Check there's no Default label");
scToDefaultRow.findOpenshiftDefaultLabel().should('not.exist');
// The Default radio button is enabled but not checked
cy.step('Check the Default radio button is enabled but not checked');
scToDefaultRow.findDefaultRadioInput().should('be.enabled');
scToDefaultRow.findDefaultRadioInput().should('not.have.attr', 'checked');

// Set the SC to be the default one
cy.step('Set the SC to be the default one');
scToDefaultRow.findDefaultRadioInput().click();

// The Default radio button is enabled
cy.step('Check the Default radio button is enabled');
scToDefaultRow.findDefaultRadioInput().should('be.enabled');
// The Enable switch is disabled
cy.step('Check the Enable switch is disabled');
scToDefaultRow.findEnableSwitchInput().should('be.disabled');
verifyStorageClassConfig(scToDefaultName, true, true);
});
Expand Down
8 changes: 8 additions & 0 deletions frontend/src/__tests__/cypress/cypress/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ export type NotebookController = {
export type DashboardConfig = {
dashboardConfig: {
disableModelServing: boolean;
disableModelMesh: boolean;
disableKServe: boolean;
};
notebookController: NotebookController;
[key: string]: unknown;
Expand All @@ -145,6 +147,12 @@ export type NotebookControllerConfig = {
USE_ISTIO: string;
};

export type NotebookControllerCullerConfig = {
CULL_IDLE_TIME: string;
ENABLE_CULLING: string;
IDLENESS_CHECK_PERIOD: string;
};

export type ResourceData = {
kind: string;
labelSelector: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,60 @@ import {
cullerSettings,
notebookTolerationSettings,
} from '~/__tests__/cypress/cypress/pages/clusterSettings';
import type { DashboardConfig, NotebookControllerConfig } from '~/__tests__/cypress/cypress/types';
import type {
DashboardConfig,
NotebookControllerCullerConfig,
} from '~/__tests__/cypress/cypress/types';

/**
* Validates the Model Serving Platform checkboxes display in the Cluster Settings.
* @param dashboardConfig The Model Serving Platform configuration object.
* Validates the visibility and state of Model Serving Platform checkboxes
* in the Cluster Settings based on the provided dashboard configuration.
*
* This function checks whether the Model Serving feature is enabled or disabled,
* and subsequently verifies the state of the Multi-Platform and Single-Platform
* checkboxes based on their respective enable/disable flags.
*
* - If Model Serving is disabled, both checkboxes should not be visible.
* - If Model Serving is enabled:
* - The Multi-Platform Checkbox will be checked if Model Mesh is enabled;
* otherwise, it will not be checked.
* - The Single-Platform Checkbox will be checked if KServe is enabled;
* otherwise, it will not be checked.
*
* @param dashboardConfig The Model Serving Platform configuration object containing
* settings related to model serving, model mesh, and KServe.
*/
export const validateModelServingPlatforms = (dashboardConfig: DashboardConfig): void => {
const isModelServingEnabled = dashboardConfig.dashboardConfig.disableModelServing;
cy.log(`Value of isModelServingDisabled: ${String(isModelServingEnabled)}`);
const isModelMeshEnabled = dashboardConfig.dashboardConfig.disableModelMesh;
const isKServeEnabled = dashboardConfig.dashboardConfig.disableKServe;

cy.log(`Value of isModelServingEnabled: ${String(isModelServingEnabled)}`);
cy.log(`Value of isModelMeshEnabled: ${String(isModelMeshEnabled)}`);
cy.log(`Value of isKServeEnabled: ${String(isKServeEnabled)}`);

if (isModelServingEnabled) {
modelServingSettings.findSinglePlatformCheckbox().should('not.exist');
modelServingSettings.findMultiPlatformCheckbox().should('not.exist');
cy.log('Model Serving is disabled, checkboxes should not be visible');
} else {
modelServingSettings.findSinglePlatformCheckbox().should('be.checked');
modelServingSettings.findMultiPlatformCheckbox().should('be.checked');
cy.log('Model Serving is enabled, checkboxes should be checked');
// Validate Multi-Platform Checkbox based on disableModelMesh
if (isModelMeshEnabled) {
modelServingSettings.findMultiPlatformCheckbox().should('not.be.checked');
cy.log('Multi-Platform Checkbox is disabled, it should not be checked');
} else {
modelServingSettings.findMultiPlatformCheckbox().should('be.checked');
cy.log('Multi-Platform Checkbox is enabled, it should be checked');
}

// Validate Single-Platform Checkbox based on disableKServe
if (isKServeEnabled) {
modelServingSettings.findSinglePlatformCheckbox().should('not.be.checked');
cy.log('Single-Platform Checkbox is disabled, it should not be checked');
} else {
modelServingSettings.findSinglePlatformCheckbox().should('be.checked');
cy.log('Single-Platform Checkbox is enabled, it should be checked');
}
}
};

Expand Down Expand Up @@ -53,20 +89,25 @@ export const validatePVCSize = (dashboardConfig: DashboardConfig): void => {

/**
* Validates the Stop Idle Notebooks displays in the Cluster Settings.
* @param notebookControllerConfig The notebook controller configuration object.
* @param notebookControllerCullerConfig The notebook controller culler configuration object or error message.
*/
export const validateStopIdleNotebooks = (
notebookControllerConfig: NotebookControllerConfig,
notebookControllerCullerConfig: NotebookControllerCullerConfig | string,
): void => {
const isCullingEnabled = notebookControllerConfig.ENABLE_CULLING;
cy.log(`Value of ENABLE_CULLING: ${isCullingEnabled}`);

if (isCullingEnabled) {
cullerSettings.findStopIdleNotebooks().should('exist');
cy.log('Culling is enabled; Stop Idle Notebooks setting should exist in the UI.');
if (typeof notebookControllerCullerConfig === 'string') {
cy.log('Culler config not found or error occurred:', notebookControllerCullerConfig);
cullerSettings.findUnlimitedOption().should('be.checked');
cullerSettings.findLimitedOption().should('not.be.checked');
cy.log('Do not stop idle notebooks option should be checked when culler config is not found');
} else {
cullerSettings.findStopIdleNotebooks().should('not.exist');
cy.log('Culling is disabled; Stop Idle Notebooks setting should not exist in the UI.');
const isCullingEnabled = 'ENABLE_CULLING' in notebookControllerCullerConfig;
cy.log(`Value of ENABLE_CULLING: ${isCullingEnabled}`);

if (isCullingEnabled) {
cullerSettings.findLimitedOption().should('be.checked');
cullerSettings.findUnlimitedOption().should('not.be.checked');
cy.log('Stop idle notebooks after should be checked when culling is enabled');
}
}
};

Expand Down
Loading
Loading