diff --git a/cypress.json b/cypress.json index f5ecd62f70..e9457ef4a4 100644 --- a/cypress.json +++ b/cypress.json @@ -11,5 +11,6 @@ }, "defaultCommandTimeout": 10000, "videoCompression": false, + "numTestsKeptInMemory": 0, "videoUploadOnPasses": false } diff --git a/cypress/integration/realm_settings_test.spec.ts b/cypress/integration/realm_settings_test.spec.ts index f62f53bfb8..6b0e114ea9 100644 --- a/cypress/integration/realm_settings_test.spec.ts +++ b/cypress/integration/realm_settings_test.spec.ts @@ -435,68 +435,130 @@ describe("Realm settings tests", () => { 9 ); }); - }); - describe("Realm settings client profiles tab tests", () => { - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-clientPolicies-tab").click(); - cy.findByTestId("rs-policies-clientProfiles-tab").click(); - }); + describe("Realm settings client profiles tab tests", () => { + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientProfiles-tab").click(); + }); - it("Go to client policies profiles tab", () => { - realmSettingsPage.shouldDisplayProfilesTab(); - }); + it("Go to client policies profiles tab", () => { + realmSettingsPage.shouldDisplayProfilesTab(); + }); - it("Check new client form is displaying", () => { - realmSettingsPage.shouldDisplayNewClientProfileForm(); - }); + it("Check new client form is displaying", () => { + realmSettingsPage.shouldDisplayNewClientProfileForm(); + }); - it("Complete new client form and cancel", () => { - realmSettingsPage.shouldCompleteAndCancelCreateNewClientProfile(); - }); + it("Complete new client form and cancel", () => { + realmSettingsPage.shouldCompleteAndCancelCreateNewClientProfile(); + }); - it("Complete new client form and submit", () => { - realmSettingsPage.shouldCompleteAndCreateNewClientProfile(); - }); + it("Complete new client form and submit", () => { + realmSettingsPage.shouldCompleteAndCreateNewClientProfile(); + }); - it("Should perform client profile search by profile name", () => { - realmSettingsPage.shouldSearchClientProfile(); - }); + it("Should perform client profile search by profile name", () => { + realmSettingsPage.shouldSearchClientProfile(); + }); - it("Check cancelling the client profile deletion", () => { - realmSettingsPage.shouldDisplayDeleteClientProfileDialog(); - }); + it("Check cancelling the client profile deletion", () => { + realmSettingsPage.shouldDisplayDeleteClientProfileDialog(); + }); - it("Check deleting the client profile", () => { - realmSettingsPage.shouldDeleteClientProfileDialog(); - }); + it("Check deleting the client profile", () => { + realmSettingsPage.shouldDeleteClientProfileDialog(); + }); - it("Check navigating between Form View and JSON editor", () => { - realmSettingsPage.shouldNavigateBetweenFormAndJSONView(); - }); + it("Check navigating between Form View and JSON editor", () => { + realmSettingsPage.shouldNavigateBetweenFormAndJSONView(); + }); - it("Check saving changed JSON profiles", () => { - realmSettingsPage.shouldSaveChangedJSONProfiles(); - realmSettingsPage.shouldDeleteClientProfileDialog(); - }); + it("Check saving changed JSON profiles", () => { + realmSettingsPage.shouldSaveChangedJSONProfiles(); + realmSettingsPage.shouldDeleteClientProfileDialog(); + }); - it("Should not create duplicate client profile", () => { - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-clientPolicies-tab").click(); - cy.findByTestId("rs-policies-clientProfiles-tab").click(); - realmSettingsPage.shouldCompleteAndCreateNewClientProfile(); - realmSettingsPage.shouldNotCreateDuplicateClientProfile(); - }); + it("Should not create duplicate client profile", () => { + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientProfiles-tab").click(); + realmSettingsPage.shouldCompleteAndCreateNewClientProfile(); + realmSettingsPage.shouldNotCreateDuplicateClientProfile(); + }); - it("Check deleting newly created client profile from create view via dropdown", () => { - realmSettingsPage.shouldRemoveClientFromCreateView(); - }); + describe("Realm settings client policies tab tests", () => { + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientPolicies-tab").click(); + }); - it("Check reloading JSON profiles", () => { - realmSettingsPage.shouldReloadJSONProfiles(); + it("Go to client policies tab", () => { + realmSettingsPage.shouldDisplayPoliciesTab(); + }); + + it("Check new client form is displaying", () => { + realmSettingsPage.shouldDisplayNewClientPolicyForm(); + }); + + it("Complete new client form and cancel", () => { + realmSettingsPage.shouldCompleteAndCancelCreateNewClientPolicy(); + }); + + it("Complete new client form and submit", () => { + realmSettingsPage.shouldCompleteAndCreateNewClientPolicyFromEmptyState(); + }); + + it("Should perform client profile search by profile name", () => { + realmSettingsPage.shouldSearchClientPolicy(); + }); + + it("Check cancelling the client policy deletion", () => { + realmSettingsPage.shouldDisplayDeleteClientPolicyDialog(); + }); + + it("Check deleting the client policy", () => { + realmSettingsPage.shouldDeleteClientPolicyDialog(); + }); + + it("Check navigating between Form View and JSON editor", () => { + realmSettingsPage.shouldNavigateBetweenFormAndJSONViewPolicies(); + }); + + /* it("Check saving changed JSON policies", () => { + realmSettingsPage.shouldSaveChangedJSONPolicies(); + realmSettingsPage.shouldDeleteClientPolicyDialog(); + }); */ + + it("Should not create duplicate client profile", () => { + realmSettingsPage.shouldCompleteAndCreateNewClientPolicyFromEmptyState(); + + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientPolicies-tab").click(); + realmSettingsPage.shouldCompleteAndCreateNewClientPolicy(); + realmSettingsPage.shouldNotCreateDuplicateClientPolicy(); + + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientPolicies-tab").click(); + realmSettingsPage.shouldDeleteClientProfileDialog(); + }); + + it("Check deleting newly created client policy from create view via dropdown", () => { + realmSettingsPage.shouldRemoveClientPolicyFromCreateView(); + }); + + it("Check reloading JSON policies", () => { + realmSettingsPage.shouldReloadJSONPolicies(); + }); + }); }); }); }); diff --git a/cypress/support/pages/admin_console/manage/realm_settings/RealmSettingsPage.ts b/cypress/support/pages/admin_console/manage/realm_settings/RealmSettingsPage.ts index 0a757f37fd..dda60dd607 100644 --- a/cypress/support/pages/admin_console/manage/realm_settings/RealmSettingsPage.ts +++ b/cypress/support/pages/admin_console/manage/realm_settings/RealmSettingsPage.ts @@ -148,10 +148,18 @@ export default class RealmSettingsPage { private createProfileBtn = "createProfile"; private formViewSelect = "formView-profilesView"; private jsonEditorSelect = "jsonEditor-profilesView"; + private formViewSelectPolicies = "formView-policiesView"; + private jsonEditorSelectPolicies = "jsonEditor-policiesView"; private newClientProfileNameInput = "client-profile-name"; private newClientProfileDescriptionInput = "client-profile-description"; private saveNewClientProfileBtn = "saveCreateProfile"; private cancelNewClientProfile = "cancelCreateProfile"; + private createPolicyEmptyStateBtn = "no-client-policies-empty-action"; + private createPolicyBtn = "createPolicy"; + private newClientPolicyNameInput = "client-policy-name"; + private newClientPolicyDescriptionInput = "client-policy-description"; + private saveNewClientPolicyBtn = "saveCreatePolicy"; + private cancelNewClientPolicyBtn = "cancelCreatePolicy"; private alertMessage = ".pf-c-alert__title"; private moreDrpDwn = ".pf-c-dropdown__toggle.pf-m-plain"; private moreDrpDwnItems = ".pf-c-dropdown__menu-item"; @@ -159,10 +167,12 @@ export default class RealmSettingsPage { private deleteDialogBodyText = ".pf-c-modal-box__body"; private deleteDialogCancelBtn = ".pf-c-button.pf-m-link"; private jsonEditorSaveBtn = "jsonEditor-saveBtn"; + private jsonEditorSavePoliciesBtn = "jsonEditor-policies-saveBtn"; private jsonEditorReloadBtn = "jsonEditor-reloadBtn"; private jsonEditor = ".monaco-scrollable-element.editor-scrollable.vs"; private createClientDrpDwn = ".pf-c-dropdown.pf-m-align-right"; private searchFld = "[id^=realm-settings][id$=profilesinput]"; + private searchFldPolicies = "[id^=realm-settings][id$=clientPoliciesinput]"; selectLoginThemeType(themeType: string) { cy.get(this.selectLoginTheme).click(); @@ -516,12 +526,12 @@ export default class RealmSettingsPage { cy.get(this.searchFld).click({ force: true }).clear(); } - shouldDisplayDeleteClientProfileDialog() { + shouldDisplayDeleteClientPolicyDialog() { cy.get(this.moreDrpDwn).last().click(); cy.get(this.moreDrpDwnItems).click(); - cy.get(this.deleteDialogTitle).contains("Delete profile?"); + cy.get(this.deleteDialogTitle).contains("Delete policy?"); cy.get(this.deleteDialogBodyText).contains( - "This action will permanently delete the profile custom-profile. This cannot be undone." + "This action will permanently delete the policy Test. This cannot be undone." ); cy.findByTestId("modalConfirm").contains("Delete"); cy.get(this.deleteDialogCancelBtn).contains("Cancel").click(); @@ -568,6 +578,13 @@ export default class RealmSettingsPage { ); } + shouldNotCreateDuplicateClientPolicy() { + cy.get(this.alertMessage).should( + "be.visible", + "Could not create client policy: 'proposed client policy name duplicated.'" + ); + } + shouldRemoveClientFromCreateView() { cy.findByTestId(this.createProfileBtn).click(); cy.findByTestId(this.newClientProfileNameInput).type("Test again"); @@ -592,4 +609,140 @@ export default class RealmSettingsPage { cy.findByTestId(this.jsonEditorSaveBtn).contains("Save"); cy.findByTestId(this.jsonEditorReloadBtn).contains("Reload"); } + + shouldSaveChangedJSONPolicies() { + cy.findByTestId(this.jsonEditorSelectPolicies).check(); + cy.findByTestId(this.jsonEditorReloadBtn).click(); + + cy.get(this.jsonEditor).type(`{pageup}{del} [{ + "name": "Reload", + }, {downarrow}{end}{backspace}{backspace}{backspace}{backspace}`); + + cy.findByTestId(this.jsonEditorReloadBtn).click(); + + cy.get(this.jsonEditor).type(`{pageup}{del} [{ + "name": "Test", + "description": "Test Description", + "enabled": false, + "conditions": [], + "profiles": [], + }, {downarrow}{end}{backspace}{backspace}{backspace}{backspace}`); + + cy.findByTestId(this.jsonEditorSavePoliciesBtn).click(); + + cy.get(this.alertMessage).should( + "be.visible", + "The client policy configuration was updated" + ); + cy.findByTestId(this.formViewSelectPolicies).check(); + cy.get("table").should("be.visible").contains("td", "Test"); + } + + shouldNavigateBetweenFormAndJSONViewPolicies() { + cy.findByTestId(this.jsonEditorSelectPolicies).check(); + cy.findByTestId(this.jsonEditorSavePoliciesBtn).contains("Save"); + cy.findByTestId(this.jsonEditorReloadBtn).contains("Reload"); + cy.findByTestId(this.formViewSelectPolicies).check(); + cy.findByTestId(this.createPolicyEmptyStateBtn).contains( + "Create client policy" + ); + } + + shouldDisplayPoliciesTab() { + cy.findByTestId(this.createPolicyEmptyStateBtn).should("exist"); + cy.findByTestId(this.formViewSelectPolicies).should("exist"); + cy.findByTestId(this.jsonEditorSelectPolicies).should("exist"); + } + + shouldDisplayNewClientPolicyForm() { + cy.findByTestId(this.createPolicyEmptyStateBtn).click(); + cy.findByTestId(this.newClientPolicyNameInput).should("exist"); + cy.findByTestId(this.newClientPolicyDescriptionInput).should("exist"); + cy.findByTestId(this.saveNewClientPolicyBtn).should("exist"); + cy.findByTestId(this.cancelNewClientPolicyBtn).should("exist"); + } + + shouldCompleteAndCancelCreateNewClientPolicy() { + cy.findByTestId(this.createPolicyEmptyStateBtn).click(); + cy.findByTestId(this.newClientPolicyNameInput).type("Test"); + cy.findByTestId(this.newClientPolicyDescriptionInput).type( + "Test Description" + ); + cy.findByTestId(this.cancelNewClientPolicyBtn).click(); + cy.get("table").should("not.have.text", "Test"); + } + + shouldCompleteAndCreateNewClientPolicy() { + cy.findByTestId(this.createPolicyBtn).click(); + cy.findByTestId(this.newClientPolicyNameInput).type("Test"); + cy.findByTestId(this.newClientPolicyDescriptionInput).type( + "Test Description" + ); + cy.findByTestId(this.saveNewClientPolicyBtn).click(); + cy.get(this.alertMessage).should( + "be.visible", + "New client profile created" + ); + } + + shouldCompleteAndCreateNewClientPolicyFromEmptyState() { + cy.findByTestId(this.createPolicyEmptyStateBtn).click(); + cy.findByTestId(this.newClientPolicyNameInput).type("Test"); + cy.findByTestId(this.newClientPolicyDescriptionInput).type( + "Test Description" + ); + cy.findByTestId(this.saveNewClientPolicyBtn).click(); + cy.get(this.alertMessage).should( + "be.visible", + "New client profile created" + ); + } + + shouldSearchClientPolicy() { + cy.get(this.searchFldPolicies).click({ force: true }).type("Test").click(); + cy.get("table").should("be.visible").contains("td", "Test"); + cy.get(this.searchFldPolicies).click({ force: true }).clear(); + } + + shouldDisplayDeleteClientProfileDialog() { + cy.get(this.moreDrpDwn).last().click(); + cy.get(this.moreDrpDwnItems).click(); + cy.get(this.deleteDialogTitle).contains("Delete profile?"); + cy.get(this.deleteDialogBodyText).contains( + "This action will permanently delete the profile custom-profile. This cannot be undone." + ); + cy.findByTestId("modalConfirm").contains("Delete"); + cy.get(this.deleteDialogCancelBtn).contains("Cancel").click(); + cy.get("table").should("not.have.text", "Test"); + } + + shouldDeleteClientPolicyDialog() { + cy.get(this.moreDrpDwn).last().click(); + cy.get(this.moreDrpDwnItems).click(); + cy.findByTestId("modalConfirm").contains("Delete").click(); + cy.get(this.alertMessage).should("be.visible", "Client profile deleted"); + cy.get("table").should("not.have.text", "Test"); + } + + shouldRemoveClientPolicyFromCreateView() { + cy.findByTestId(this.createPolicyEmptyStateBtn).click(); + cy.findByTestId(this.newClientPolicyNameInput).type("Test again"); + cy.findByTestId(this.newClientPolicyDescriptionInput).type( + "Test Again Description" + ); + cy.findByTestId(this.saveNewClientPolicyBtn).click(); + cy.get(this.alertMessage).should("be.visible", "New client policy created"); + cy.get(this.createClientDrpDwn).contains("Action").click(); + cy.findByTestId("deleteClientPolicyDropdown").click(); + cy.findByTestId("modalConfirm").contains("Delete").click(); + cy.get(this.alertMessage).should("be.visible", "Client profile deleted"); + cy.get("table").should("not.have.text", "Test Again Description"); + } + + shouldReloadJSONPolicies() { + cy.findByTestId(this.jsonEditorSelectPolicies).check(); + cy.findByTestId(this.jsonEditorReloadBtn).contains("Reload").click(); + cy.findByTestId(this.jsonEditorSavePoliciesBtn).contains("Save"); + cy.findByTestId(this.jsonEditorReloadBtn).contains("Reload"); + } } diff --git a/src/realm-settings/NewClientPolicyForm.tsx b/src/realm-settings/NewClientPolicyForm.tsx index e4cbca9c44..e7cffb32cc 100644 --- a/src/realm-settings/NewClientPolicyForm.tsx +++ b/src/realm-settings/NewClientPolicyForm.tsx @@ -119,23 +119,25 @@ export const NewClientPolicyForm = () => { }; const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ - titleKey: t("deleteClientProfileConfirmTitle"), - messageKey: t("deleteClientProfileConfirm"), + titleKey: t("deleteClientPolicyConfirmTitle"), + messageKey: t("deleteClientPolicyConfirm", { + policyName: policyName, + }), continueButtonLabel: t("delete"), continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { const updatedPolicies = policies.filter( - (policy) => policy.name !== createdPolicy?.name + (policy) => policy.name !== policyName ); try { await adminClient.clientPolicies.updatePolicy({ policies: updatedPolicies, }); - addAlert(t("deleteClientSuccess"), AlertVariant.success); + addAlert(t("deleteClientPolicySuccess"), AlertVariant.success); history.push(toClientPolicies({ realm })); } catch (error) { - addError(t("deleteClientError"), error); + addError(t("deleteClientPolicyError"), error); } }, }); @@ -151,17 +153,17 @@ export const NewClientPolicyForm = () => { } divider dropdownItems={ - showAddConditionsAndProfilesForm + showAddConditionsAndProfilesForm || policyName ? [ { - toggleDeleteDialog; + toggleDeleteDialog(); }} - data-testid="deleteClientProfileDropdown" + data-testid="deleteClientPolicyDropdown" > - {t("deleteClientProfile")} + {t("deleteClientPolicy")} , ] : undefined diff --git a/src/realm-settings/messages.ts b/src/realm-settings/messages.ts index a072efe084..5a54de80d1 100644 --- a/src/realm-settings/messages.ts +++ b/src/realm-settings/messages.ts @@ -203,6 +203,7 @@ export default { formView: "Form view", jsonEditor: "JSON editor", }, + deleteClientPolicy: "Delete client policy", deleteClientPolicyConfirmTitle: "Delete policy?", deleteClientPolicyConfirm: "This action will permanently delete the policy {{policyName}}. This cannot be undone.",