diff --git a/cypress/e2e/blueprints/global_settings/settings-data.ts b/cypress/e2e/blueprints/global_settings/settings-data.ts index a8c45896d19..cc457aedb5f 100644 --- a/cypress/e2e/blueprints/global_settings/settings-data.ts +++ b/cypress/e2e/blueprints/global_settings/settings-data.ts @@ -61,3 +61,20 @@ export const settings = { new: 'true' } }; +export const serverUrlLocalhostCases = [ + 'http://LOCALhosT:8005', + 'http://localhost:8005', + 'https://localhost:8005', + 'localhost', + 'http://127.0.0.1', + 'https://127.0.0.1', + '127.0.0.1' +]; +export const urlWithTrailingForwardSlash = 'https://test.com/'; +export const httpUrl = 'http://test.com'; +export const nonUrlCases = [ + 'test', + 'https', + 'test.com', + 'a.test.com' +]; diff --git a/cypress/e2e/po/edit/settings.po.ts b/cypress/e2e/po/edit/settings.po.ts index a8595339656..425f64ac3a3 100644 --- a/cypress/e2e/po/edit/settings.po.ts +++ b/cypress/e2e/po/edit/settings.po.ts @@ -3,6 +3,7 @@ import LabeledInputPo from '@/cypress/e2e/po/components/labeled-input.po'; import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po'; import RadioGroupInputPo from '@/cypress/e2e/po/components/radio-group-input.po'; import LabeledSelectPo from '@/cypress/e2e/po/components/labeled-select.po'; +import BannersPo from '@/cypress/e2e/po/components/banners.po'; export default class SettingsEditPo extends PagePo { private static createPath(clusterId: string, setting: string) { @@ -36,6 +37,14 @@ export default class SettingsEditPo extends PagePo { selectSettings.clickOptionWithLabel(label); } + serverUrlLocalhostWarningBanner(): BannersPo { + return new BannersPo('[data-testid="setting-serverurl-localhost-warning"]'); + } + + errorBannerContent(label: string): Cypress.Chainable { + return new BannersPo('[data-testid="setting-error-banner"]', this.self()).banner().contains(label); + } + useDefaultButton(): Cypress.Chainable { return cy.getId('advanced_settings_use_default'); } diff --git a/cypress/e2e/po/pages/rancher-setup-configure.po.ts b/cypress/e2e/po/pages/rancher-setup-configure.po.ts index 00278801209..df6628de24d 100644 --- a/cypress/e2e/po/pages/rancher-setup-configure.po.ts +++ b/cypress/e2e/po/pages/rancher-setup-configure.po.ts @@ -4,6 +4,7 @@ import CheckboxInputPo from '@/cypress/e2e/po/components/checkbox-input.po'; import RadioGroupInputPo from '@/cypress/e2e/po/components/radio-group-input.po'; import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po'; import PasswordPo from '@/cypress/e2e/po/components/password.po'; +import BannersPo from '@/cypress/e2e/po/components/banners.po'; export class RancherSetupConfigurePage extends PagePo { static url = '/auth/setup' @@ -31,6 +32,14 @@ export class RancherSetupConfigurePage extends PagePo { return new LabeledInputPo(cy.getId('setup-server-url')); } + serverUrlLocalhostWarningBanner(): BannersPo { + return new BannersPo('[data-testid="setup-serverurl-localhost-warning"]'); + } + + errorBannerContent(label: string): Cypress.Chainable { + return new BannersPo('[data-testid="setup-error-banner"]', this.self()).banner().contains(label); + } + termsAgreement(): CheckboxInputPo { return new CheckboxInputPo(cy.getId('setup-agreement')); } diff --git a/cypress/e2e/tests/pages/global-settings/settings-p2.spec.ts b/cypress/e2e/tests/pages/global-settings/settings-p2.spec.ts index 69e94357cb0..79795718f98 100644 --- a/cypress/e2e/tests/pages/global-settings/settings-p2.spec.ts +++ b/cypress/e2e/tests/pages/global-settings/settings-p2.spec.ts @@ -4,7 +4,9 @@ import BurgerMenuPo from '@/cypress/e2e/po/side-bars/burger-side-menu.po'; import ClusterManagerCreateRke2CustomPagePo from '@/cypress/e2e/po/edit/provisioning.cattle.io.cluster/create/cluster-create-rke2-custom.po'; import AccountPagePo from '@/cypress/e2e/po/pages/account-api-keys.po'; import ClusterManagerListPagePo from '@/cypress/e2e/po/pages/cluster-manager/cluster-manager-list.po'; -import { settings } from '@/cypress/e2e/blueprints/global_settings/settings-data'; +import { + settings, serverUrlLocalhostCases, urlWithTrailingForwardSlash, httpUrl, nonUrlCases +} from '@/cypress/e2e/blueprints/global_settings/settings-data'; const settingsPage = new SettingsPagePo('local'); const homePage = new HomePagePo(); @@ -82,6 +84,36 @@ describe('Settings', { testIsolation: 'off' }, () => { }); }); + it('can validate server-url', { tags: ['@globalSettings', '@adminUser'] }, () => { + SettingsPagePo.navTo(); + + settingsPage.editSettingsByLabel('server-url'); + + const settingsEdit = settingsPage.editSettings('local', 'server-url'); + + settingsEdit.waitForPage(); + settingsEdit.title().contains('Setting: server-url').should('be.visible'); + + // Check showing localhost warning banner + serverUrlLocalhostCases.forEach((url) => { + settingsEdit.settingsInput().set(url); + settingsEdit.serverUrlLocalhostWarningBanner().banner().should('exist').and('be.visible'); + }); + // Check showing error banner when the urls has trailing forward slash + settingsEdit.settingsInput().set(urlWithTrailingForwardSlash); + settingsEdit.errorBannerContent('Server URL should not have a trailing forward slash.').should('exist').and('be.visible'); + // Check showing error banner when the url is not HTTPS + settingsEdit.settingsInput().set(httpUrl); + settingsEdit.errorBannerContent('Server URL must be https.').should('exist').and('be.visible'); + // // Check showing error banner when the input value is not a url + nonUrlCases.forEach((inputValue) => { + settingsEdit.settingsInput().set(inputValue); + settingsEdit.errorBannerContent('Server URL must be an URL.').should('exist').and('be.visible'); + // A non-url is also a non-https + settingsEdit.errorBannerContent('Server URL must be https.').should('exist').and('be.visible'); + }); + }); + it('can update ui-index', { tags: ['@globalSettings', '@adminUser'] }, () => { // Update setting SettingsPagePo.navTo(); diff --git a/cypress/e2e/tests/setup/rancher-setup.spec.ts b/cypress/e2e/tests/setup/rancher-setup.spec.ts index 80d5730feef..908543f3b65 100644 --- a/cypress/e2e/tests/setup/rancher-setup.spec.ts +++ b/cypress/e2e/tests/setup/rancher-setup.spec.ts @@ -1,7 +1,8 @@ import { RancherSetupLoginPagePo } from '@/cypress/e2e/po/pages/rancher-setup-login.po'; -import { RancherSetupConfigurePage } from '~/cypress/e2e/po/pages/rancher-setup-configure.po'; -import HomePagePo from '~/cypress/e2e/po/pages/home.po'; -import { PARTIAL_SETTING_THRESHOLD } from '~/cypress/support/utils/settings-utils'; +import { RancherSetupConfigurePage } from '@/cypress/e2e/po/pages/rancher-setup-configure.po'; +import HomePagePo from '@/cypress/e2e/po/pages/home.po'; +import { PARTIAL_SETTING_THRESHOLD } from '@/cypress/support/utils/settings-utils'; +import { serverUrlLocalhostCases, urlWithTrailingForwardSlash, httpUrl, nonUrlCases } from '@/cypress/e2e/blueprints/global_settings/settings-data'; // Cypress or the GrepTags avoid to run multiples times the same test for each tag used. // This is a temporary solution till initialization is not handled as a test @@ -58,6 +59,30 @@ describe('Rancher setup', { tags: ['@adminUserSetup', '@standardUserSetup', '@se rancherSetupConfigurePage.waitForPage(); rancherSetupConfigurePage.canSubmit().should('eq', false); + // Check server url validation + rancherSetupConfigurePage.serverUrl().self().should('be.visible'); + rancherSetupConfigurePage.serverUrl().self().invoke('val').then((initialServerUrl) => { + // Check showing localhost warning banner + serverUrlLocalhostCases.forEach((url) => { + rancherSetupConfigurePage.serverUrl().set(url); + rancherSetupConfigurePage.serverUrlLocalhostWarningBanner().banner().should('exist').and('be.visible'); + }); + // Check showing error banner when the urls has trailing forward slash + rancherSetupConfigurePage.serverUrl().set(urlWithTrailingForwardSlash); + rancherSetupConfigurePage.errorBannerContent('Server URL should not have a trailing forward slash.').should('exist').and('be.visible'); + // Check showing error banner when the url is not HTTPS + rancherSetupConfigurePage.serverUrl().set(httpUrl); + rancherSetupConfigurePage.errorBannerContent('Server URL must be https.').should('exist').and('be.visible'); + // // Check showing error banner when the input value is not a url + nonUrlCases.forEach((inputValue) => { + rancherSetupConfigurePage.serverUrl().set(inputValue); + rancherSetupConfigurePage.errorBannerContent('Server URL must be an URL.').should('exist').and('be.visible'); + // A non-url is also a non-https + rancherSetupConfigurePage.errorBannerContent('Server URL must be https.').should('exist').and('be.visible'); + }); + rancherSetupConfigurePage.serverUrl().set(initialServerUrl); + }); + rancherSetupConfigurePage.termsAgreement().set(); rancherSetupConfigurePage.canSubmit().should('eq', true); rancherSetupConfigurePage.submit(); diff --git a/shell/edit/management.cattle.io.setting.vue b/shell/edit/management.cattle.io.setting.vue index 734e303e89f..1d6d00321e6 100644 --- a/shell/edit/management.cattle.io.setting.vue +++ b/shell/edit/management.cattle.io.setting.vue @@ -160,6 +160,7 @@ export default { v-if="showLocalhostWarning" color="warning" :label="t('validation.setting.serverUrl.localhost')" + data-testid="setting-serverurl-localhost-warning" />
diff --git a/shell/pages/auth/setup.vue b/shell/pages/auth/setup.vue index d4466df3b3b..e7f0fb40dd4 100644 --- a/shell/pages/auth/setup.vue +++ b/shell/pages/auth/setup.vue @@ -389,12 +389,14 @@ export default { v-if="showLocalhostWarning" color="warning" :label="t('validation.setting.serverUrl.localhost')" + data-testid="setup-serverurl-localhost-warning" />