From a9d958106240846cff1222b4837d4d3de24b8500 Mon Sep 17 00:00:00 2001 From: mfrances17 <39063664+mfrances17@users.noreply.github.com> Date: Mon, 6 Dec 2021 05:50:29 -0500 Subject: [PATCH] Cypress test fixes (#1628) --- cypress.json | 2 +- cypress/integration/clients_saml_test.spec.ts | 165 +++++ cypress/integration/clients_test.spec.ts | 149 ---- .../integration/identity_providers.spec.ts | 365 ---------- .../identity_providers_oidc_test.spec.ts | 98 +++ .../identity_providers_saml_test.spec.ts | 163 +++++ .../identity_providers_test.spec.ts | 148 ++++ ...ealm_settings_client_policies_test.spec.ts | 120 ++++ ...ealm_settings_client_profiles_test.spec.ts | 125 ++++ .../realm_settings_events_test.spec.ts | 364 ++++++++++ .../realm_settings_tabs_test.spec.ts | 94 +++ .../integration/realm_settings_test.spec.ts | 676 ------------------ .../user_fed_kerberos_test.spec.ts | 8 +- ...ser_fed_ldap_hardcoded_mapper_test.spec.ts | 228 ++++++ .../user_fed_ldap_mapper_test.spec.ts | 110 +-- .../integration/user_fed_ldap_test.spec.ts | 5 +- cypress/plugins/index.ts | 14 + .../manage/providers/ProviderPage.ts | 8 + .../realm_settings/RealmSettingsPage.ts | 4 +- package-lock.json | 182 ++--- package.json | 1 + 21 files changed, 1612 insertions(+), 1417 deletions(-) create mode 100644 cypress/integration/clients_saml_test.spec.ts delete mode 100644 cypress/integration/identity_providers.spec.ts create mode 100644 cypress/integration/identity_providers_oidc_test.spec.ts create mode 100644 cypress/integration/identity_providers_saml_test.spec.ts create mode 100644 cypress/integration/identity_providers_test.spec.ts create mode 100644 cypress/integration/realm_settings_client_policies_test.spec.ts create mode 100644 cypress/integration/realm_settings_client_profiles_test.spec.ts create mode 100644 cypress/integration/realm_settings_events_test.spec.ts create mode 100644 cypress/integration/realm_settings_tabs_test.spec.ts delete mode 100644 cypress/integration/realm_settings_test.spec.ts create mode 100644 cypress/integration/user_fed_ldap_hardcoded_mapper_test.spec.ts diff --git a/cypress.json b/cypress.json index e9457ef4a4..b86c28d21d 100644 --- a/cypress.json +++ b/cypress.json @@ -11,6 +11,6 @@ }, "defaultCommandTimeout": 10000, "videoCompression": false, - "numTestsKeptInMemory": 0, + "numTestsKeptInMemory": 30, "videoUploadOnPasses": false } diff --git a/cypress/integration/clients_saml_test.spec.ts b/cypress/integration/clients_saml_test.spec.ts new file mode 100644 index 0000000000..dc13fe0019 --- /dev/null +++ b/cypress/integration/clients_saml_test.spec.ts @@ -0,0 +1,165 @@ +import LoginPage from "../support/pages/LoginPage"; +import Masthead from "../support/pages/admin_console/Masthead"; +import ListingPage from "../support/pages/admin_console/ListingPage"; +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import ModalUtils from "../support/util/ModalUtils"; +import AdminClient from "../support/util/AdminClient"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import AuthenticationTab from "../support/pages/admin_console/manage/clients/Authentication"; + +const loginPage = new LoginPage(); +const masthead = new Masthead(); +const sidebarPage = new SidebarPage(); +const listingPage = new ListingPage(); +const modalUtils = new ModalUtils(); + +describe("Clients SAML tests", () => { + describe("SAML test", () => { + const samlClientName = "saml"; + + before(() => { + new AdminClient().createClient({ + protocol: "saml", + clientId: samlClientName, + publicClient: false, + }); + }); + + after(() => { + new AdminClient().deleteClient(samlClientName); + }); + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToClients(); + listingPage.searchItem(samlClientName).goToItemDetails(samlClientName); + }); + + it("should display the saml sections on details screen", () => { + cy.get(".pf-c-jump-links__list").should(($ul) => { + expect($ul) + .to.contain("SAML capabilities") + .to.contain("Signature and Encryption"); + }); + }); + + it("should save force name id format", () => { + const load = "auth/admin/realms/master/client-scopes"; + cy.intercept(load).as("load"); + + cy.get(".pf-c-jump-links__list").contains("SAML capabilities").click(); + cy.wait("@load"); + + cy.findByTestId("forceNameIdFormat").click({ + force: true, + }); + cy.findByTestId("settingsSave").click(); + masthead.checkNotificationMessage("Client successfully updated"); + }); + }); + + describe("SAML keys tab", () => { + const clientId = "saml-keys"; + + before(() => { + new AdminClient().createClient({ + clientId, + protocol: "saml", + }); + }); + + after(() => { + new AdminClient().deleteClient(clientId); + }); + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToClients(); + listingPage.searchItem(clientId).goToItemDetails(clientId); + cy.get("#pf-tab-keys-keys").click(); + }); + + it("doesn't disable when no", () => { + cy.findByTestId("clientSignature").click({ force: true }); + + modalUtils + .checkModalTitle('Disable "Client signature required"') + .cancelModal(); + + cy.findAllByTestId("certificate").should("have.length", 1); + }); + + it("disable client signature", () => { + cy.findByTestId("clientSignature").click({ force: true }); + + modalUtils + .checkModalTitle('Disable "Client signature required"') + .confirmModal(); + + masthead.checkNotificationMessage("Client successfully updated"); + cy.findAllByTestId("certificate").should("have.length", 0); + }); + + it("should enable Encryption keys config", () => { + cy.findByTestId("encryptAssertions").click({ force: true }); + + cy.findByTestId("generate").click(); + masthead.checkNotificationMessage( + "New key pair and certificate generated successfully" + ); + + modalUtils.confirmModal(); + cy.findAllByTestId("certificate").should("have.length", 1); + }); + }); + + describe("Authentication tab", () => { + const clientName = "authenticationTabClient"; + const authenticationTab = new AuthenticationTab(); + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToClients(); + }); + + before(async () => { + await new AdminClient().createClient({ + protocol: "openid-connect", + clientId: clientName, + publicClient: false, + authorizationServicesEnabled: true, + serviceAccountsEnabled: true, + standardFlowEnabled: true, + }); + }); + + after(() => { + new AdminClient().deleteClient(clientName); + }); + + it("Should update the resource server settings", () => { + listingPage.searchItem(clientName).goToItemDetails(clientName); + authenticationTab.goToTab(); + }); + + it("Should create a resource", () => { + listingPage.searchItem(clientName).goToItemDetails(clientName); + authenticationTab.goToTab().goToResourceSubTab(); + authenticationTab.assertDefaultResource(); + + authenticationTab + .goToCreateResource() + .fillResourceForm({ + name: "Resource", + displayName: "The display name", + type: "type", + uris: ["one", "two"], + }) + .save(); + + masthead.checkNotificationMessage("Resource created successfully"); + }); + }); +}); diff --git a/cypress/integration/clients_test.spec.ts b/cypress/integration/clients_test.spec.ts index c715e7b4aa..682723810b 100644 --- a/cypress/integration/clients_test.spec.ts +++ b/cypress/integration/clients_test.spec.ts @@ -10,7 +10,6 @@ import InitialAccessTokenTab from "../support/pages/admin_console/manage/clients import { keycloakBefore } from "../support/util/keycloak_before"; import RoleMappingTab from "../support/pages/admin_console/manage/RoleMappingTab"; import KeysTab from "../support/pages/admin_console/manage/clients/KeysTab"; -import AuthenticationTab from "../support/pages/admin_console/manage/clients/Authentication"; let itemId = "client_crud"; const loginPage = new LoginPage(); @@ -327,152 +326,4 @@ describe("Clients test", () => { cy.findByTestId("jump-link-capability-config").should("not.exist"); }); }); - describe("SAML test", () => { - const samlClientName = "saml"; - - before(() => { - new AdminClient().createClient({ - protocol: "saml", - clientId: samlClientName, - publicClient: false, - }); - }); - - after(() => { - new AdminClient().deleteClient(samlClientName); - }); - - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToClients(); - listingPage.searchItem(samlClientName).goToItemDetails(samlClientName); - }); - - it("should display the saml sections on details screen", () => { - cy.get(".pf-c-jump-links__list").should(($ul) => { - expect($ul) - .to.contain("SAML capabilities") - .to.contain("Signature and Encryption"); - }); - }); - - it("should save force name id format", () => { - const load = "auth/admin/realms/master/client-scopes"; - cy.intercept(load).as("load"); - - cy.get(".pf-c-jump-links__list").contains("SAML capabilities").click(); - cy.wait("@load"); - - cy.findByTestId("forceNameIdFormat").click({ - force: true, - }); - cy.findByTestId("settingsSave").click(); - masthead.checkNotificationMessage("Client successfully updated"); - }); - }); - - describe("SAML keys tab", () => { - const clientId = "saml-keys"; - - before(() => { - new AdminClient().createClient({ - clientId, - protocol: "saml", - }); - }); - - after(() => { - new AdminClient().deleteClient(clientId); - }); - - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToClients(); - listingPage.searchItem(clientId).goToItemDetails(clientId); - cy.get("#pf-tab-keys-keys").click(); - }); - - it("doesn't disable when no", () => { - cy.findByTestId("clientSignature").click({ force: true }); - - modalUtils - .checkModalTitle('Disable "Client signature required"') - .cancelModal(); - - cy.findAllByTestId("certificate").should("have.length", 1); - }); - - it("disable client signature", () => { - cy.findByTestId("clientSignature").click({ force: true }); - - modalUtils - .checkModalTitle('Disable "Client signature required"') - .confirmModal(); - - masthead.checkNotificationMessage("Client successfully updated"); - cy.findAllByTestId("certificate").should("have.length", 0); - }); - - it("should enable Encryption keys config", () => { - cy.findByTestId("encryptAssertions").click({ force: true }); - - cy.findByTestId("generate").click(); - masthead.checkNotificationMessage( - "New key pair and certificate generated successfully" - ); - - modalUtils.confirmModal(); - cy.findAllByTestId("certificate").should("have.length", 1); - }); - }); - - describe("Authentication tab", () => { - const clientName = "authenticationTabClient"; - const authenticationTab = new AuthenticationTab(); - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToClients(); - }); - - before(async () => { - await new AdminClient().createClient({ - protocol: "openid-connect", - clientId: clientName, - publicClient: false, - authorizationServicesEnabled: true, - serviceAccountsEnabled: true, - standardFlowEnabled: true, - }); - }); - - after(() => { - new AdminClient().deleteClient(clientName); - }); - - it("Should update the resource server settings", () => { - listingPage.searchItem(clientName).goToItemDetails(clientName); - authenticationTab.goToTab(); - }); - - it("Should create a resource", () => { - listingPage.searchItem(clientName).goToItemDetails(clientName); - authenticationTab.goToTab().goToResourceSubTab(); - authenticationTab.assertDefaultResource(); - - authenticationTab - .goToCreateResource() - .fillResourceForm({ - name: "Resource", - displayName: "The display name", - type: "type", - uris: ["one", "two"], - }) - .save(); - - masthead.checkNotificationMessage("Resource created successfully"); - }); - }); }); diff --git a/cypress/integration/identity_providers.spec.ts b/cypress/integration/identity_providers.spec.ts deleted file mode 100644 index 5fc7875e34..0000000000 --- a/cypress/integration/identity_providers.spec.ts +++ /dev/null @@ -1,365 +0,0 @@ -import Masthead from "../support/pages/admin_console/Masthead"; -import SidebarPage from "../support/pages/admin_console/SidebarPage"; -import LoginPage from "../support/pages/LoginPage"; -import { keycloakBefore } from "../support/util/keycloak_before"; -import ListingPage from "../support/pages/admin_console/ListingPage"; - -import CreateProviderPage from "../support/pages/admin_console/manage/identity_providers/CreateProviderPage"; -import ModalUtils from "../support/util/ModalUtils"; -import OrderDialog from "../support/pages/admin_console/manage/identity_providers/OrderDialog"; -import AddMapperPage from "../support/pages/admin_console/manage/identity_providers/AddMapperPage"; - -describe("Identity provider test", () => { - const loginPage = new LoginPage(); - const sidebarPage = new SidebarPage(); - const masthead = new Masthead(); - const listingPage = new ListingPage(); - const createProviderPage = new CreateProviderPage(); - const addMapperPage = new AddMapperPage(); - - const createSuccessMsg = "Identity provider successfully created"; - const createMapperSuccessMsg = "Mapper created successfully."; - const saveMapperSuccessMsg = "Mapper saved successfully."; - - const changeSuccessMsg = - "Successfully changed display order of identity providers"; - const deletePrompt = "Delete provider?"; - const deleteSuccessMsg = "Provider successfully deleted"; - - const keycloakServer = Cypress.env("KEYCLOAK_SERVER"); - const discoveryUrl = `${keycloakServer}/auth/realms/master/.well-known/openid-configuration`; - const samlDiscoveryUrl = `${keycloakServer}/auth/realms/master/protocol/saml/descriptor`; - const authorizationUrl = `${keycloakServer}/auth/realms/master/protocol/openid-connect/auth`; - - describe("Identity provider creation", () => { - const identityProviderName = "github"; - - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToIdentityProviders(); - }); - - it("should create provider", () => { - createProviderPage.checkGitHubCardVisible().clickGitHubCard(); - - createProviderPage.checkAddButtonDisabled(); - createProviderPage - .fill(identityProviderName) - .clickAdd() - .checkClientIdRequiredMessage(true); - createProviderPage.fill(identityProviderName, "123").clickAdd(); - masthead.checkNotificationMessage(createSuccessMsg); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist(identityProviderName); - }); - - it("should create facebook provider", () => { - createProviderPage - .clickCreateDropdown() - .clickItem("facebook") - .fill("facebook", "123") - .clickAdd(); - masthead.checkNotificationMessage(createSuccessMsg); - }); - - it("should change order of providers", () => { - const orderDialog = new OrderDialog(); - const providers = [identityProviderName, "facebook", "bitbucket"]; - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist("facebook"); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist(identityProviderName); - - createProviderPage - .clickCreateDropdown() - .clickItem("bitbucket") - .fill("bitbucket", "123") - .clickAdd(); - - cy.wait(2000); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist(identityProviderName); - - orderDialog.openDialog().checkOrder(providers); - orderDialog.moveRowTo("facebook", identityProviderName); - - orderDialog.checkOrder(["bitbucket", identityProviderName, "facebook"]); - - orderDialog.clickSave(); - masthead.checkNotificationMessage(changeSuccessMsg); - }); - - it("should create a oidc provider using discovery url", () => { - const oidcProviderName = "oidc"; - createProviderPage - .clickCreateDropdown() - .clickItem(oidcProviderName) - .fillDiscoveryUrl(discoveryUrl) - .shouldBeSuccessful() - .fill("oidc", "123") - .clickAdd(); - masthead.checkNotificationMessage(createSuccessMsg); - createProviderPage.shouldHaveAuthorizationUrl(authorizationUrl); - }); - - it("should create a SAML provider using SSO service url", () => { - const samlProviderName = "saml"; - createProviderPage - .clickCreateDropdown() - .clickItem(samlProviderName) - .fillDiscoveryUrl(samlDiscoveryUrl) - .shouldBeSuccessful() - .clickAdd(); - masthead.checkNotificationMessage(createSuccessMsg); - }); - - it("should delete provider", () => { - const modalUtils = new ModalUtils(); - listingPage.deleteItem(identityProviderName); - modalUtils.checkModalTitle(deletePrompt).confirmModal(); - - masthead.checkNotificationMessage(deleteSuccessMsg); - }); - - it("should add facebook social mapper", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("facebook"); - - addMapperPage.goToMappersTab(); - - addMapperPage.emptyStateAddMapper(); - - addMapperPage.fillSocialMapper("facebook mapper"); - - addMapperPage.saveNewMapper(); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type Advanced Attribute to Role", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.emptyStateAddMapper(); - - addMapperPage.addAdvancedAttrToRoleMapper("SAML mapper"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type Username Template Importer", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addUsernameTemplateImporterMapper( - "SAML Username Template Importer Mapper" - ); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type Hardcoded User Session Attribute", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addHardcodedUserSessionAttrMapper( - "Hardcoded User Session Attribute" - ); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type Attribute Importer", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addSAMLAttrImporterMapper("Attribute Importer"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type Hardcoded Role", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addHardcodedRoleMapper("Hardcoded Role"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type Hardcoded Attribute", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addHardcodedAttrMapper("Hardcoded Attribute"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add SAML mapper of type SAML Attribute To Role", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addSAMLAttributeToRoleMapper("SAML Attribute To Role"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add OIDC mapper of type Attribute Importer", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("oidc"); - - addMapperPage.goToMappersTab(); - - addMapperPage.emptyStateAddMapper(); - - addMapperPage.addOIDCAttrImporterMapper("OIDC Attribute Importer"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add OIDC mapper of type Claim To Role", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("oidc"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.addOIDCClaimToRoleMapper("OIDC Claim to Role"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should add Social mapper of type Attribute Importer", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("facebook"); - - addMapperPage.goToMappersTab(); - - addMapperPage.addMapper(); - - addMapperPage.fillSocialMapper("facebook attribute importer"); - - masthead.checkNotificationMessage(createMapperSuccessMsg); - }); - - it("should edit Username Template Importer mapper", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - listingPage.goToItemDetails("SAML Username Template Importer Mapper"); - - addMapperPage.editUsernameTemplateImporterMapper(); - - masthead.checkNotificationMessage(saveMapperSuccessMsg); - }); - - it("should edit facebook mapper", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("facebook"); - - addMapperPage.goToMappersTab(); - - listingPage.goToItemDetails("facebook attribute importer"); - - addMapperPage.editSocialMapper(); - }); - - it("should delete facebook mapper", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("facebook"); - - addMapperPage.goToMappersTab(); - - listingPage.deleteItem("facebook attribute importer"); - - cy.findByTestId("modalConfirm").click(); - }); - - it("should edit SAML mapper", () => { - sidebarPage.goToIdentityProviders(); - - listingPage.goToItemDetails("saml"); - - addMapperPage.goToMappersTab(); - - listingPage.goToItemDetails("SAML mapper"); - - addMapperPage.editSAMLorOIDCMapper(); - - masthead.checkNotificationMessage(saveMapperSuccessMsg); - }); - - it("clean up providers", () => { - const modalUtils = new ModalUtils(); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist("bitbucket").deleteItem("bitbucket"); - modalUtils.checkModalTitle(deletePrompt).confirmModal(); - masthead.checkNotificationMessage(deleteSuccessMsg); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist("facebook").deleteItem("facebook"); - modalUtils.checkModalTitle(deletePrompt).confirmModal(); - masthead.checkNotificationMessage(deleteSuccessMsg); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist("oidc").deleteItem("oidc"); - modalUtils.checkModalTitle(deletePrompt).confirmModal(); - masthead.checkNotificationMessage(deleteSuccessMsg); - - sidebarPage.goToIdentityProviders(); - listingPage.itemExist("saml").deleteItem("saml"); - modalUtils.checkModalTitle(deletePrompt).confirmModal(); - masthead.checkNotificationMessage(deleteSuccessMsg); - }); - }); -}); diff --git a/cypress/integration/identity_providers_oidc_test.spec.ts b/cypress/integration/identity_providers_oidc_test.spec.ts new file mode 100644 index 0000000000..f238dfd231 --- /dev/null +++ b/cypress/integration/identity_providers_oidc_test.spec.ts @@ -0,0 +1,98 @@ +import Masthead from "../support/pages/admin_console/Masthead"; +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import ListingPage from "../support/pages/admin_console/ListingPage"; +import CreateProviderPage from "../support/pages/admin_console/manage/identity_providers/CreateProviderPage"; +import ModalUtils from "../support/util/ModalUtils"; +import AddMapperPage from "../support/pages/admin_console/manage/identity_providers/AddMapperPage"; + +describe("OIDC identity provider test", () => { + const loginPage = new LoginPage(); + const sidebarPage = new SidebarPage(); + const masthead = new Masthead(); + const listingPage = new ListingPage(); + const createProviderPage = new CreateProviderPage(); + const addMapperPage = new AddMapperPage(); + + const createSuccessMsg = "Identity provider successfully created"; + const createMapperSuccessMsg = "Mapper created successfully."; + + const deletePrompt = "Delete provider?"; + const deleteSuccessMsg = "Provider successfully deleted"; + + const keycloakServer = Cypress.env("KEYCLOAK_SERVER"); + const discoveryUrl = `${keycloakServer}/auth/realms/master/.well-known/openid-configuration`; + const authorizationUrl = `${keycloakServer}/auth/realms/master/protocol/openid-connect/auth`; + + describe("OIDC Identity provider creation", () => { + const identityProviderName = "github"; + const oidcProviderName = "oidc"; + const secret = "123"; + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToIdentityProviders(); + }); + + it("should create provider", () => { + createProviderPage.checkGitHubCardVisible().clickGitHubCard(); + + createProviderPage.checkAddButtonDisabled(); + createProviderPage + .fill(identityProviderName) + .clickAdd() + .checkClientIdRequiredMessage(true); + createProviderPage.fill(identityProviderName, secret).clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(identityProviderName); + }); + + it("should create an OIDC provider using discovery url", () => { + createProviderPage + .clickCreateDropdown() + .clickItem(oidcProviderName) + .fillDiscoveryUrl(discoveryUrl) + .shouldBeSuccessful() + .fill(oidcProviderName, secret) + .clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + createProviderPage.shouldHaveAuthorizationUrl(authorizationUrl); + }); + + it("should add OIDC mapper of type Attribute Importer", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(oidcProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.emptyStateAddMapper(); + addMapperPage.addOIDCAttrImporterMapper("OIDC Attribute Importer"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add OIDC mapper of type Claim To Role", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(oidcProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addOIDCClaimToRoleMapper("OIDC Claim to Role"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("clean up providers", () => { + const modalUtils = new ModalUtils(); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(oidcProviderName).deleteItem(oidcProviderName); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + listingPage + .itemExist(identityProviderName) + .deleteItem(identityProviderName); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + }); + }); +}); diff --git a/cypress/integration/identity_providers_saml_test.spec.ts b/cypress/integration/identity_providers_saml_test.spec.ts new file mode 100644 index 0000000000..73bd845d56 --- /dev/null +++ b/cypress/integration/identity_providers_saml_test.spec.ts @@ -0,0 +1,163 @@ +import Masthead from "../support/pages/admin_console/Masthead"; +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import ListingPage from "../support/pages/admin_console/ListingPage"; +import CreateProviderPage from "../support/pages/admin_console/manage/identity_providers/CreateProviderPage"; +import ModalUtils from "../support/util/ModalUtils"; +import AddMapperPage from "../support/pages/admin_console/manage/identity_providers/AddMapperPage"; + +describe("Identity provider test", () => { + const loginPage = new LoginPage(); + const sidebarPage = new SidebarPage(); + const masthead = new Masthead(); + const listingPage = new ListingPage(); + const createProviderPage = new CreateProviderPage(); + const addMapperPage = new AddMapperPage(); + + const createSuccessMsg = "Identity provider successfully created"; + const createMapperSuccessMsg = "Mapper created successfully."; + const saveMapperSuccessMsg = "Mapper saved successfully."; + + const deletePrompt = "Delete provider?"; + const deleteSuccessMsg = "Provider successfully deleted"; + + const keycloakServer = Cypress.env("KEYCLOAK_SERVER"); + const samlDiscoveryUrl = `${keycloakServer}/auth/realms/master/protocol/saml/descriptor`; + + describe("SAML identity provider creation", () => { + const identityProviderName = "github"; + const samlProviderName = "saml"; + const secret = "123"; + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToIdentityProviders(); + }); + + it("should create provider", () => { + createProviderPage.checkGitHubCardVisible().clickGitHubCard(); + + createProviderPage.checkAddButtonDisabled(); + createProviderPage + .fill(identityProviderName) + .clickAdd() + .checkClientIdRequiredMessage(true); + createProviderPage.fill(identityProviderName, secret).clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(identityProviderName); + }); + + it("should create a SAML provider using SSO service url", () => { + createProviderPage + .clickCreateDropdown() + .clickItem(samlProviderName) + .fillDiscoveryUrl(samlDiscoveryUrl) + .shouldBeSuccessful() + .clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + }); + + it("should add SAML mapper of type Advanced Attribute to Role", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.emptyStateAddMapper(); + addMapperPage.addAdvancedAttrToRoleMapper("SAML mapper"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add SAML mapper of type Username Template Importer", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addUsernameTemplateImporterMapper( + "SAML Username Template Importer Mapper" + ); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add SAML mapper of type Hardcoded User Session Attribute", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addHardcodedUserSessionAttrMapper( + "Hardcoded User Session Attribute" + ); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add SAML mapper of type Attribute Importer", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addSAMLAttrImporterMapper("Attribute Importer"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add SAML mapper of type Hardcoded Role", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addHardcodedRoleMapper("Hardcoded Role"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add SAML mapper of type Hardcoded Attribute", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addHardcodedAttrMapper("Hardcoded Attribute"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add SAML mapper of type SAML Attribute To Role", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.addSAMLAttributeToRoleMapper("SAML Attribute To Role"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it.skip("should edit Username Template Importer mapper", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + listingPage.goToItemDetails("SAML Username Template Importer Mapper"); + addMapperPage.editUsernameTemplateImporterMapper(); + masthead.checkNotificationMessage(saveMapperSuccessMsg, true); + }); + + it("should edit SAML mapper", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails(samlProviderName); + addMapperPage.goToMappersTab(); + listingPage.goToItemDetails("SAML mapper"); + addMapperPage.editSAMLorOIDCMapper(); + masthead.checkNotificationMessage(saveMapperSuccessMsg, true); + }); + + it("clean up providers", () => { + const modalUtils = new ModalUtils(); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(samlProviderName).deleteItem(samlProviderName); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + listingPage + .itemExist(identityProviderName) + .deleteItem(identityProviderName); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + }); + }); +}); diff --git a/cypress/integration/identity_providers_test.spec.ts b/cypress/integration/identity_providers_test.spec.ts new file mode 100644 index 0000000000..94a1d1bbf1 --- /dev/null +++ b/cypress/integration/identity_providers_test.spec.ts @@ -0,0 +1,148 @@ +import Masthead from "../support/pages/admin_console/Masthead"; +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import ListingPage from "../support/pages/admin_console/ListingPage"; + +import CreateProviderPage from "../support/pages/admin_console/manage/identity_providers/CreateProviderPage"; +import ModalUtils from "../support/util/ModalUtils"; +import OrderDialog from "../support/pages/admin_console/manage/identity_providers/OrderDialog"; +import AddMapperPage from "../support/pages/admin_console/manage/identity_providers/AddMapperPage"; + +describe("Identity provider test", () => { + const loginPage = new LoginPage(); + const sidebarPage = new SidebarPage(); + const masthead = new Masthead(); + const listingPage = new ListingPage(); + const createProviderPage = new CreateProviderPage(); + const addMapperPage = new AddMapperPage(); + + const createSuccessMsg = "Identity provider successfully created"; + const createMapperSuccessMsg = "Mapper created successfully."; + + const changeSuccessMsg = + "Successfully changed display order of identity providers"; + const deletePrompt = "Delete provider?"; + const deleteSuccessMsg = "Provider successfully deleted"; + + describe("Identity provider creation", () => { + const identityProviderName = "github"; + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToIdentityProviders(); + }); + + it("should create provider", () => { + createProviderPage.checkGitHubCardVisible().clickGitHubCard(); + + createProviderPage.checkAddButtonDisabled(); + createProviderPage + .fill(identityProviderName) + .clickAdd() + .checkClientIdRequiredMessage(true); + createProviderPage.fill(identityProviderName, "123").clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(identityProviderName); + }); + + it("should create facebook provider", () => { + createProviderPage + .clickCreateDropdown() + .clickItem("facebook") + .fill("facebook", "123") + .clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + }); + + it("should change order of providers", () => { + const orderDialog = new OrderDialog(); + const providers = [identityProviderName, "facebook", "bitbucket"]; + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist("facebook"); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(identityProviderName); + + createProviderPage + .clickCreateDropdown() + .clickItem("bitbucket") + .fill("bitbucket", "123") + .clickAdd(); + masthead.checkNotificationMessage(createSuccessMsg, true); + + cy.wait(2000); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist(identityProviderName); + + orderDialog.openDialog().checkOrder(providers); + orderDialog.moveRowTo("facebook", identityProviderName); + + orderDialog.checkOrder(["bitbucket", identityProviderName, "facebook"]); + + orderDialog.clickSave(); + masthead.checkNotificationMessage(changeSuccessMsg); + }); + + it("should delete provider", () => { + const modalUtils = new ModalUtils(); + listingPage.deleteItem(identityProviderName); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + }); + + it("should add facebook social mapper", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails("facebook"); + addMapperPage.goToMappersTab(); + addMapperPage.emptyStateAddMapper(); + addMapperPage.fillSocialMapper("facebook mapper"); + // addMapperPage.saveNewMapper(); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should add Social mapper of type Attribute Importer", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails("facebook"); + addMapperPage.goToMappersTab(); + addMapperPage.addMapper(); + addMapperPage.fillSocialMapper("facebook attribute importer"); + masthead.checkNotificationMessage(createMapperSuccessMsg, true); + }); + + it("should edit facebook mapper", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails("facebook"); + addMapperPage.goToMappersTab(); + listingPage.goToItemDetails("facebook attribute importer"); + addMapperPage.editSocialMapper(); + }); + + it("should delete facebook mapper", () => { + sidebarPage.goToIdentityProviders(); + listingPage.goToItemDetails("facebook"); + addMapperPage.goToMappersTab(); + listingPage.deleteItem("facebook attribute importer"); + cy.findByTestId("modalConfirm").click(); + }); + + it("clean up providers", () => { + const modalUtils = new ModalUtils(); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist("bitbucket").deleteItem("bitbucket"); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + + sidebarPage.goToIdentityProviders(); + listingPage.itemExist("facebook").deleteItem("facebook"); + modalUtils.checkModalTitle(deletePrompt).confirmModal(); + masthead.checkNotificationMessage(deleteSuccessMsg, true); + }); + }); +}); diff --git a/cypress/integration/realm_settings_client_policies_test.spec.ts b/cypress/integration/realm_settings_client_policies_test.spec.ts new file mode 100644 index 0000000000..6eb4ae6887 --- /dev/null +++ b/cypress/integration/realm_settings_client_policies_test.spec.ts @@ -0,0 +1,120 @@ +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import RealmSettingsPage from "../support/pages/admin_console/manage/realm_settings/RealmSettingsPage"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import AdminClient from "../support/util/AdminClient"; + +const loginPage = new LoginPage(); +const sidebarPage = new SidebarPage(); +const realmSettingsPage = new RealmSettingsPage(); + +describe("Realm settings client policies tab tests", () => { + const realmName = "Realm_" + (Math.random() + 1).toString(36).substring(7); + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientPolicies-tab").click(); + }); + + before(async () => { + await new AdminClient().createRealm(realmName); + }); + + after(async () => { + await new AdminClient().deleteRealm(realmName); + }); + + 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("Should not have conditions configured by default", () => { + realmSettingsPage.shouldNotHaveConditionsConfigured(); + }); + + it("Should cancel adding a new condition to a client profile", () => { + realmSettingsPage.shouldCancelAddingCondition(); + }); + + it("Should add a new client-roles condition to a client profile", () => { + realmSettingsPage.shouldAddClientRolesCondition(); + }); + + it("Should add a new client-scopes condition to a client profile", () => { + realmSettingsPage.shouldAddClientScopesCondition(); + }); + + it("Should edit the client-roles condition of a client profile", () => { + realmSettingsPage.shouldEditClientRolesCondition(); + }); + + it("Should edit the client-scopes condition of a client profile", () => { + realmSettingsPage.shouldEditClientScopesCondition(); + }); + + it("Should cancel deleting condition from a client profile", () => { + realmSettingsPage.shouldCancelDeletingCondition(); + }); + + it("Should delete client-roles condition from a client profile", () => { + realmSettingsPage.shouldDeleteClientRolesCondition(); + }); + + it("Should delete client-scopes condition from a client profile", () => { + realmSettingsPage.shouldDeleteClientScopesCondition(); + }); + + 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("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(); + cy.wait(2000); + 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/integration/realm_settings_client_profiles_test.spec.ts b/cypress/integration/realm_settings_client_profiles_test.spec.ts new file mode 100644 index 0000000000..2c8f9cd911 --- /dev/null +++ b/cypress/integration/realm_settings_client_profiles_test.spec.ts @@ -0,0 +1,125 @@ +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import RealmSettingsPage from "../support/pages/admin_console/manage/realm_settings/RealmSettingsPage"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import AdminClient from "../support/util/AdminClient"; + +const loginPage = new LoginPage(); +const sidebarPage = new SidebarPage(); +const realmSettingsPage = new RealmSettingsPage(); + +describe("Realm settings client profiles tab tests", () => { + const realmName = "Realm_" + (Math.random() + 1).toString(36).substring(7); + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientProfiles-tab").click(); + }); + + before(async () => { + await new AdminClient().createRealm(realmName); + }); + + after(async () => { + await new AdminClient().deleteRealm(realmName); + }); + + it("Go to client policies profiles tab", () => { + realmSettingsPage.shouldDisplayProfilesTab(); + }); + + it("Check new client form is displaying", () => { + realmSettingsPage.shouldDisplayNewClientProfileForm(); + }); + + it("Complete new client form and cancel", () => { + realmSettingsPage.shouldCompleteAndCancelCreateNewClientProfile(); + }); + + it("Complete new client form and submit", () => { + realmSettingsPage.shouldCompleteAndCreateNewClientProfile(); + }); + + it("Should perform client profile search by profile name", () => { + realmSettingsPage.shouldSearchClientProfile(); + }); + + it("Check cancelling the client profile deletion", () => { + realmSettingsPage.shouldDisplayDeleteClientProfileDialog(); + }); + + it("Check deleting the client profile", () => { + realmSettingsPage.shouldDeleteClientProfileDialog(); + }); + + it("Check navigating between Form View and JSON editor", () => { + realmSettingsPage.shouldNavigateBetweenFormAndJSONView(); + }); + + 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 edit client profile", () => { + realmSettingsPage.shouldEditClientProfile(); + }); + + it("Should check that edited client profile is now listed", () => { + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-clientPolicies-tab").click(); + cy.findByTestId("rs-policies-clientProfiles-tab").click(); + realmSettingsPage.shouldCheckEditedClientProfileListed(); + }); + + it("Should show error when client profile left blank", () => { + realmSettingsPage.shouldShowErrorWhenNameBlank(); + }); + + it("Should revert back to the previous profile name", () => { + realmSettingsPage.shouldReloadClientProfileEdits(); + }); + + it("Should not have executors configured by default", () => { + realmSettingsPage.shouldNotHaveExecutorsConfigured(); + }); + + it("Should cancel adding a new executor to a client profile", () => { + realmSettingsPage.shouldCancelAddingExecutor(); + }); + + it("Should add a new executor to a client profile", () => { + realmSettingsPage.shouldAddExecutor(); + }); + + it("Should cancel deleting executor from a client profile", () => { + realmSettingsPage.shouldCancelDeletingExecutor(); + }); + + it("Should cancel editing executor", () => { + realmSettingsPage.shouldCancelEditingExecutor(); + }); + + it("Should edit executor", () => { + realmSettingsPage.shouldEditExecutor(); + }); + + it("Should delete executor from a client profile", () => { + realmSettingsPage.shouldDeleteExecutor(); + }); + + it("Should delete edited client profile", () => { + realmSettingsPage.shouldDeleteEditedProfile(); + }); +}); diff --git a/cypress/integration/realm_settings_events_test.spec.ts b/cypress/integration/realm_settings_events_test.spec.ts new file mode 100644 index 0000000000..254978be3f --- /dev/null +++ b/cypress/integration/realm_settings_events_test.spec.ts @@ -0,0 +1,364 @@ +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import RealmSettingsPage from "../support/pages/admin_console/manage/realm_settings/RealmSettingsPage"; +import Masthead from "../support/pages/admin_console/Masthead"; +import ModalUtils from "../support/util/ModalUtils"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import ListingPage from "../support/pages/admin_console/ListingPage"; +import AdminClient from "../support/util/AdminClient"; + +const loginPage = new LoginPage(); +const sidebarPage = new SidebarPage(); +const masthead = new Masthead(); +const modalUtils = new ModalUtils(); +const realmSettingsPage = new RealmSettingsPage(); + +describe("Realm settings events tab tests", () => { + const realmName = "Realm_" + (Math.random() + 1).toString(36).substring(7); + const listingPage = new ListingPage(); + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealm(realmName); + }); + + before(async () => { + await new AdminClient().createRealm(realmName); + }); + + after(async () => { + await new AdminClient().deleteRealm(realmName); + }); + + const goToDetails = () => { + const keysUrl = `/auth/admin/realms/${realmName}/keys`; + cy.intercept(keysUrl).as("keysFetch"); + + cy.findByTestId("rs-keys-tab").click(); + cy.findByTestId("rs-providers-tab").click(); + cy.findAllByTestId("provider-name-link") + .contains("test_aes-generated") + .click(); + + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-keys-tab").click(); + cy.findByTestId("rs-providers-tab").click(); + cy.findAllByTestId("provider-name-link") + .contains("test_hmac-generated") + .click(); + + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-keys-tab").click(); + cy.findByTestId("rs-providers-tab").click(); + cy.findAllByTestId("provider-name-link").contains("test_rsa").click(); + + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-keys-tab").click(); + cy.findByTestId("rs-providers-tab").click(); + cy.findAllByTestId("provider-name-link") + .contains("test_rsa-generated") + .click(); + + cy.wait(["@keysFetch"]); + + return this; + }; + + const goToKeys = () => { + const keysUrl = `/auth/admin/realms/${realmName}/keys`; + cy.intercept(keysUrl).as("keysFetch"); + cy.findByTestId("rs-keys-tab").click(); + cy.findByTestId("rs-keys-list-tab").click(); + cy.wait(["@keysFetch"]); + + return this; + }; + + const addBundle = () => { + const localizationUrl = `/auth/admin/realms/${realmName}/localization/en`; + cy.intercept(localizationUrl).as("localizationFetch"); + + realmSettingsPage.addKeyValuePair( + "key_" + (Math.random() + 1).toString(36).substring(7), + "value_" + (Math.random() + 1).toString(36).substring(7) + ); + + cy.wait(["@localizationFetch"]); + + return this; + }; + + it("Enable user events", () => { + cy.intercept("GET", `/auth/admin/realms/${realmName}/keys`).as("load"); + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-realm-events-tab").click(); + cy.findByTestId("rs-events-tab").click(); + cy.wait(["@load"]); + realmSettingsPage + .toggleSwitch(realmSettingsPage.enableEvents) + .save(realmSettingsPage.eventsUserSave); + masthead.checkNotificationMessage("Successfully saved configuration"); + realmSettingsPage.clearEvents("user"); + modalUtils + .checkModalMessage( + "If you clear all events of this realm, all records will be permanently cleared in the database" + ) + .confirmModal(); + masthead.checkNotificationMessage("The user events have been cleared"); + const events = ["Client info", "Client info error"]; + cy.intercept("GET", `/auth/admin/realms/${realmName}/events/config`).as( + "fetchConfig" + ); + realmSettingsPage.addUserEvents(events).clickAdd(); + masthead.checkNotificationMessage("Successfully saved configuration"); + cy.wait(["@fetchConfig"]); + sidebarPage.waitForPageLoad(); + for (const event of events) { + listingPage.searchItem(event, false).itemExist(event); + } + }); + + it("Go to keys tab", () => { + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-keys-tab").click(); + }); + + it("add Providers", () => { + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-keys-tab").click(); + + cy.findByTestId("rs-providers-tab").click(); + + realmSettingsPage.toggleAddProviderDropdown(); + + cy.findByTestId("option-aes-generated").click(); + realmSettingsPage.enterConsoleDisplayName("test_aes-generated"); + realmSettingsPage.addProvider(); + + realmSettingsPage.toggleAddProviderDropdown(); + + cy.findByTestId("option-ecdsa-generated").click(); + realmSettingsPage.enterConsoleDisplayName("test_ecdsa-generated"); + realmSettingsPage.addProvider(); + + realmSettingsPage.toggleAddProviderDropdown(); + + cy.findByTestId("option-hmac-generated").click(); + realmSettingsPage.enterConsoleDisplayName("test_hmac-generated"); + realmSettingsPage.addProvider(); + + realmSettingsPage.toggleAddProviderDropdown(); + + cy.findByTestId("option-rsa-generated").click(); + realmSettingsPage.enterConsoleDisplayName("test_rsa-generated"); + realmSettingsPage.addProvider(); + }); + + it("go to details", () => { + sidebarPage.goToRealmSettings(); + goToDetails(); + }); + + it("Test keys", () => { + sidebarPage.goToRealmSettings(); + goToKeys(); + + realmSettingsPage.testSelectFilter(); + }); + + it("add locale", () => { + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-localization-tab").click(); + + addBundle(); + + masthead.checkNotificationMessage( + "Success! The localization text has been created." + ); + }); + + it("Realm header settings", () => { + sidebarPage.goToRealmSettings(); + cy.get("#pf-tab-securityDefences-securityDefences").click(); + cy.findByTestId("headers-form-tab-save").should("be.disabled"); + cy.get("#xFrameOptions").clear().type("DENY"); + cy.findByTestId("headers-form-tab-save").should("be.enabled").click(); + + masthead.checkNotificationMessage("Realm successfully updated"); + }); + + it("Brute force detection", () => { + sidebarPage.goToRealmSettings(); + cy.get("#pf-tab-securityDefences-securityDefences").click(); + cy.get("#pf-tab-20-bruteForce").click(); + + cy.findByTestId("brute-force-tab-save").should("be.disabled"); + + cy.get("#bruteForceProtected").click({ force: true }); + cy.findByTestId("waitIncrementSeconds").type("1"); + cy.findByTestId("maxFailureWaitSeconds").type("1"); + cy.findByTestId("maxDeltaTimeSeconds").type("1"); + cy.findByTestId("minimumQuickLoginWaitSeconds").type("1"); + + cy.findByTestId("brute-force-tab-save").should("be.enabled").click(); + masthead.checkNotificationMessage("Realm successfully updated"); + }); + + it("add session data", () => { + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-sessions-tab").click(); + + realmSettingsPage.populateSessionsPage(); + realmSettingsPage.save("sessions-tab-save"); + + masthead.checkNotificationMessage("Realm successfully updated"); + }); + + it("check that sessions data was saved", () => { + sidebarPage.goToAuthentication(); + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-sessions-tab").click(); + + cy.findByTestId(realmSettingsPage.ssoSessionIdleInput).should( + "have.value", + 1 + ); + cy.findByTestId(realmSettingsPage.ssoSessionMaxInput).should( + "have.value", + 2 + ); + cy.findByTestId(realmSettingsPage.ssoSessionIdleRememberMeInput).should( + "have.value", + 3 + ); + cy.findByTestId(realmSettingsPage.ssoSessionMaxRememberMeInput).should( + "have.value", + 4 + ); + + cy.findByTestId(realmSettingsPage.clientSessionIdleInput).should( + "have.value", + 5 + ); + cy.findByTestId(realmSettingsPage.clientSessionMaxInput).should( + "have.value", + 6 + ); + + cy.findByTestId(realmSettingsPage.offlineSessionIdleInput).should( + "have.value", + 7 + ); + cy.findByTestId(realmSettingsPage.offlineSessionMaxSwitch).should( + "have.value", + "on" + ); + + cy.findByTestId(realmSettingsPage.loginTimeoutInput).should( + "have.value", + 9 + ); + cy.findByTestId(realmSettingsPage.loginActionTimeoutInput).should( + "have.value", + 10 + ); + }); + + it("add token data", () => { + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-tokens-tab").click(); + + realmSettingsPage.populateTokensPage(); + realmSettingsPage.save("tokens-tab-save"); + + masthead.checkNotificationMessage("Realm successfully updated"); + }); + + it("check that token data was saved", () => { + sidebarPage.goToRealmSettings(); + + cy.findByTestId("rs-tokens-tab").click(); + + cy.findByTestId(realmSettingsPage.accessTokenLifespanInput).should( + "have.value", + 1 + ); + cy.findByTestId(realmSettingsPage.accessTokenLifespanImplicitInput).should( + "have.value", + 2 + ); + cy.findByTestId(realmSettingsPage.clientLoginTimeoutInput).should( + "have.value", + 3 + ); + cy.findByTestId(realmSettingsPage.userInitiatedActionLifespanInput).should( + "have.value", + 4 + ); + + cy.findByTestId(realmSettingsPage.defaultAdminInitatedInput).should( + "have.value", + 5 + ); + cy.findByTestId(realmSettingsPage.emailVerificationInput).should( + "have.value", + 6 + ); + + cy.findByTestId(realmSettingsPage.idpEmailVerificationInput).should( + "have.value", + 7 + ); + cy.findByTestId(realmSettingsPage.forgotPasswordInput).should( + "have.value", + 8 + ); + + cy.findByTestId(realmSettingsPage.executeActionsInput).should( + "have.value", + 9 + ); + }); +}); + +describe("Realm settings events tab tests", () => { + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-realm-events-tab").click(); + cy.findByTestId("rs-event-listeners-tab").click(); + }); + + it("Should display event listeners form", () => { + realmSettingsPage.shouldDisplayEventListenersForm(); + }); + + it("Should revert saving event listener", () => { + realmSettingsPage.shouldRevertSavingEventListener(); + }); + + it("Should save event listener", () => { + realmSettingsPage.shouldSaveEventListener(); + }); + + it("Should remove event from event listener", () => { + realmSettingsPage.shouldRemoveEventFromEventListener(); + }); + + it("Should remove all events from event listener and re-save original", () => { + realmSettingsPage.shouldSaveEventListener(); + realmSettingsPage.shouldRemoveAllEventListeners(); + realmSettingsPage.shouldReSaveEventListener(); + }); +}); diff --git a/cypress/integration/realm_settings_tabs_test.spec.ts b/cypress/integration/realm_settings_tabs_test.spec.ts new file mode 100644 index 0000000000..6d803f22d8 --- /dev/null +++ b/cypress/integration/realm_settings_tabs_test.spec.ts @@ -0,0 +1,94 @@ +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import LoginPage from "../support/pages/LoginPage"; +import RealmSettingsPage from "../support/pages/admin_console/manage/realm_settings/RealmSettingsPage"; +import Masthead from "../support/pages/admin_console/Masthead"; +import { keycloakBefore } from "../support/util/keycloak_before"; +import AdminClient from "../support/util/AdminClient"; + +const loginPage = new LoginPage(); +const sidebarPage = new SidebarPage(); +const masthead = new Masthead(); +const realmSettingsPage = new RealmSettingsPage(); + +describe("Realm settings tabs tests", () => { + const realmName = "Realm_" + (Math.random() + 1).toString(36).substring(7); + + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToRealm(realmName); + }); + + before(async () => { + await new AdminClient().createRealm(realmName); + }); + + after(async () => { + await new AdminClient().deleteRealm(realmName); + }); + + it("Go to general tab", () => { + sidebarPage.goToRealmSettings(); + realmSettingsPage.toggleSwitch(realmSettingsPage.managedAccessSwitch); + realmSettingsPage.save(realmSettingsPage.generalSaveBtn); + masthead.checkNotificationMessage("Realm successfully updated"); + realmSettingsPage.toggleSwitch(realmSettingsPage.managedAccessSwitch); + realmSettingsPage.save(realmSettingsPage.generalSaveBtn); + masthead.checkNotificationMessage("Realm successfully updated"); + }); + + it("Go to login tab", () => { + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-login-tab").click(); + realmSettingsPage.toggleSwitch(realmSettingsPage.userRegSwitch); + realmSettingsPage.toggleSwitch(realmSettingsPage.forgotPwdSwitch); + realmSettingsPage.toggleSwitch(realmSettingsPage.rememberMeSwitch); + }); + + it("Check login tab values", () => { + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-login-tab").click(); + + cy.findByTestId(realmSettingsPage.userRegSwitch).should("have.value", "on"); + cy.findByTestId(realmSettingsPage.forgotPwdSwitch).should( + "have.value", + "on" + ); + cy.findByTestId(realmSettingsPage.rememberMeSwitch).should( + "have.value", + "on" + ); + }); + + it("Go to email tab", () => { + const msg: string = "Error! Failed to send email."; + sidebarPage.goToRealmSettings(); + cy.findByTestId("rs-email-tab").click(); + realmSettingsPage.addSenderEmail("example@example.com"); + realmSettingsPage.toggleCheck(realmSettingsPage.enableSslCheck); + realmSettingsPage.toggleCheck(realmSettingsPage.enableStartTlsCheck); + realmSettingsPage.fillHostField("localhost"); + cy.findByTestId(realmSettingsPage.testConnectionButton).click(); + + realmSettingsPage.fillEmailField( + "example" + (Math.random() + 1).toString(36).substring(7) + "@example.com" + ); + cy.findByTestId(realmSettingsPage.modalTestConnectionButton).click(); + masthead.checkNotificationMessage(msg, true); + }); + + it("Go to themes tab", () => { + sidebarPage.goToRealmSettings(); + cy.intercept(`/auth/admin/realms/${realmName}/keys`).as("load"); + + cy.findByTestId("rs-themes-tab").click(); + cy.wait(["@load"]); + + realmSettingsPage.selectLoginThemeType("keycloak"); + realmSettingsPage.selectAccountThemeType("keycloak"); + realmSettingsPage.selectAdminThemeType("base"); + realmSettingsPage.selectEmailThemeType("base"); + + realmSettingsPage.saveThemes(); + }); +}); diff --git a/cypress/integration/realm_settings_test.spec.ts b/cypress/integration/realm_settings_test.spec.ts deleted file mode 100644 index 631f82a1d9..0000000000 --- a/cypress/integration/realm_settings_test.spec.ts +++ /dev/null @@ -1,676 +0,0 @@ -import SidebarPage from "../support/pages/admin_console/SidebarPage"; -import LoginPage from "../support/pages/LoginPage"; -import RealmSettingsPage from "../support/pages/admin_console/manage/realm_settings/RealmSettingsPage"; -import Masthead from "../support/pages/admin_console/Masthead"; -import ModalUtils from "../support/util/ModalUtils"; -import { keycloakBefore } from "../support/util/keycloak_before"; -import AdminClient from "../support/util/AdminClient"; -import ListingPage from "../support/pages/admin_console/ListingPage"; - -const loginPage = new LoginPage(); -const sidebarPage = new SidebarPage(); -const masthead = new Masthead(); -const modalUtils = new ModalUtils(); -const realmSettingsPage = new RealmSettingsPage(); - -describe("Realm settings tests", () => { - describe("Realm settings tabs tests", () => { - const realmName = "Realm_" + (Math.random() + 1).toString(36).substring(7); - - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToRealm(realmName); - }); - - before(async () => { - await new AdminClient().createRealm(realmName); - }); - - after(async () => { - await new AdminClient().deleteRealm(realmName); - }); - - const goToKeys = () => { - const keysUrl = `/auth/admin/realms/${realmName}/keys`; - cy.intercept(keysUrl).as("keysFetch"); - cy.findByTestId("rs-keys-tab").click(); - cy.findByTestId("rs-keys-list-tab").click(); - cy.wait(["@keysFetch"]); - - return this; - }; - - const goToDetails = () => { - const keysUrl = `/auth/admin/realms/${realmName}/keys`; - cy.intercept(keysUrl).as("keysFetch"); - - cy.findByTestId("rs-keys-tab").click(); - cy.findByTestId("rs-providers-tab").click(); - cy.findAllByTestId("provider-name-link") - .contains("test_aes-generated") - .click(); - - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-keys-tab").click(); - cy.findByTestId("rs-providers-tab").click(); - cy.findAllByTestId("provider-name-link") - .contains("test_hmac-generated") - .click(); - - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-keys-tab").click(); - cy.findByTestId("rs-providers-tab").click(); - cy.findAllByTestId("provider-name-link").contains("test_rsa").click(); - - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-keys-tab").click(); - cy.findByTestId("rs-providers-tab").click(); - cy.findAllByTestId("provider-name-link") - .contains("test_rsa-generated") - .click(); - - cy.wait(["@keysFetch"]); - - return this; - }; - - /*const deleteProvider = (providerName: string) => { - const url = `/auth/admin/realms/${realmName}/users/*`; - cy.intercept(url).as("reload"); - cy.findByTestId("provider-name") - .contains(providerName) - .parentsUntil(".pf-c-data-list__item-row") - .find(".pf-c-dropdown__toggle") - .click() - .findByTestId(realmSettingsPage.deleteAction) - .click(); - cy.findByTestId(realmSettingsPage.modalConfirm).click(); - - cy.wait(["@reload"]); - return this; - };*/ - - const addBundle = () => { - const localizationUrl = `/auth/admin/realms/${realmName}/localization/en`; - cy.intercept(localizationUrl).as("localizationFetch"); - - realmSettingsPage.addKeyValuePair( - "key_" + (Math.random() + 1).toString(36).substring(7), - "value_" + (Math.random() + 1).toString(36).substring(7) - ); - - cy.wait(["@localizationFetch"]); - - return this; - }; - - it("Go to general tab", () => { - sidebarPage.goToRealmSettings(); - realmSettingsPage.toggleSwitch(realmSettingsPage.managedAccessSwitch); - realmSettingsPage.save(realmSettingsPage.generalSaveBtn); - masthead.checkNotificationMessage("Realm successfully updated"); - realmSettingsPage.toggleSwitch(realmSettingsPage.managedAccessSwitch); - realmSettingsPage.save(realmSettingsPage.generalSaveBtn); - masthead.checkNotificationMessage("Realm successfully updated"); - }); - - it("Go to login tab", () => { - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-login-tab").click(); - realmSettingsPage.toggleSwitch(realmSettingsPage.userRegSwitch); - realmSettingsPage.toggleSwitch(realmSettingsPage.forgotPwdSwitch); - realmSettingsPage.toggleSwitch(realmSettingsPage.rememberMeSwitch); - }); - - it("Check login tab values", () => { - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-login-tab").click(); - - cy.get("#kc-user-reg-switch-off").should("be.visible"); - cy.get("#kc-forgot-pw-switch-off").should("be.visible"); - cy.get("#kc-remember-me-switch-off").should("not.be.visible"); - }); - - it("Go to email tab", () => { - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-email-tab").click(); - - realmSettingsPage.addSenderEmail("example@example.com"); - - realmSettingsPage.toggleCheck(realmSettingsPage.enableSslCheck); - realmSettingsPage.toggleCheck(realmSettingsPage.enableStartTlsCheck); - - realmSettingsPage.save(realmSettingsPage.emailSaveBtn); - - realmSettingsPage.fillHostField("localhost"); - cy.findByTestId(realmSettingsPage.testConnectionButton).click(); - - realmSettingsPage.fillEmailField( - "example" + - (Math.random() + 1).toString(36).substring(7) + - "@example.com" - ); - cy.findByTestId(realmSettingsPage.modalTestConnectionButton).click(); - - masthead.checkNotificationMessage("Error! Failed to send email."); - }); - - it("Go to themes tab", () => { - sidebarPage.goToRealmSettings(); - cy.intercept(`/auth/admin/realms/${realmName}/keys`).as("load"); - - cy.findByTestId("rs-themes-tab").click(); - cy.wait(["@load"]); - - realmSettingsPage.selectLoginThemeType("keycloak"); - realmSettingsPage.selectAccountThemeType("keycloak"); - realmSettingsPage.selectAdminThemeType("base"); - realmSettingsPage.selectEmailThemeType("base"); - - realmSettingsPage.saveThemes(); - }); - - describe("Events tab", () => { - const listingPage = new ListingPage(); - it("Enable user events", () => { - cy.intercept("GET", `/auth/admin/realms/${realmName}/keys`).as("load"); - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-realm-events-tab").click(); - cy.findByTestId("rs-events-tab").click(); - cy.wait(["@load"]); - realmSettingsPage - .toggleSwitch(realmSettingsPage.enableEvents) - .save(realmSettingsPage.eventsUserSave); - masthead.checkNotificationMessage("Successfully saved configuration"); - realmSettingsPage.clearEvents("user"); - modalUtils - .checkModalMessage( - "If you clear all events of this realm, all records will be permanently cleared in the database" - ) - .confirmModal(); - masthead.checkNotificationMessage("The user events have been cleared"); - const events = ["Client info", "Client info error"]; - cy.intercept("GET", `/auth/admin/realms/${realmName}/events/config`).as( - "fetchConfig" - ); - realmSettingsPage.addUserEvents(events).clickAdd(); - masthead.checkNotificationMessage("Successfully saved configuration"); - cy.wait(["@fetchConfig"]); - sidebarPage.waitForPageLoad(); - for (const event of events) { - listingPage.searchItem(event, false).itemExist(event); - } - }); - }); - - it("Go to keys tab", () => { - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-keys-tab").click(); - }); - - it("add Providers", () => { - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-keys-tab").click(); - - cy.findByTestId("rs-providers-tab").click(); - - realmSettingsPage.toggleAddProviderDropdown(); - - cy.findByTestId("option-aes-generated").click(); - realmSettingsPage.enterConsoleDisplayName("test_aes-generated"); - realmSettingsPage.addProvider(); - - realmSettingsPage.toggleAddProviderDropdown(); - - cy.findByTestId("option-ecdsa-generated").click(); - realmSettingsPage.enterConsoleDisplayName("test_ecdsa-generated"); - realmSettingsPage.addProvider(); - - realmSettingsPage.toggleAddProviderDropdown(); - - cy.findByTestId("option-hmac-generated").click(); - realmSettingsPage.enterConsoleDisplayName("test_hmac-generated"); - realmSettingsPage.addProvider(); - - realmSettingsPage.toggleAddProviderDropdown(); - - cy.findByTestId("option-rsa-generated").click(); - realmSettingsPage.enterConsoleDisplayName("test_rsa-generated"); - realmSettingsPage.addProvider(); - }); - - it("go to details", () => { - sidebarPage.goToRealmSettings(); - goToDetails(); - }); - - /*it("delete providers", () => { - sidebarPage.goToRealmSettings(); - const url = `/auth/admin/realms/${realmName}/keys`; - cy.intercept(url).as("load"); - - cy.findByTestId("rs-keys-tab").click(); - cy.findByTestId("rs-providers-tab").click(); - - cy.wait("@load"); - - deleteProvider("test_aes-generated"); - deleteProvider("test_ecdsa-generated"); - deleteProvider("test_hmac-generated"); - deleteProvider("test_rsa-generated"); - });*/ - - it("Test keys", () => { - sidebarPage.goToRealmSettings(); - goToKeys(); - - realmSettingsPage.testSelectFilter(); - }); - - it("add locale", () => { - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-localization-tab").click(); - - addBundle(); - - masthead.checkNotificationMessage( - "Success! The localization text has been created." - ); - }); - - it("Realm header settings", () => { - sidebarPage.goToRealmSettings(); - cy.get("#pf-tab-securityDefences-securityDefences").click(); - cy.findByTestId("headers-form-tab-save").should("be.disabled"); - cy.get("#xFrameOptions").clear().type("DENY"); - cy.findByTestId("headers-form-tab-save").should("be.enabled").click(); - - masthead.checkNotificationMessage("Realm successfully updated"); - }); - - it("Brute force detection", () => { - sidebarPage.goToRealmSettings(); - cy.get("#pf-tab-securityDefences-securityDefences").click(); - cy.get("#pf-tab-20-bruteForce").click(); - - cy.findByTestId("brute-force-tab-save").should("be.disabled"); - - cy.get("#bruteForceProtected").click({ force: true }); - cy.findByTestId("waitIncrementSeconds").type("1"); - cy.findByTestId("maxFailureWaitSeconds").type("1"); - cy.findByTestId("maxDeltaTimeSeconds").type("1"); - cy.findByTestId("minimumQuickLoginWaitSeconds").type("1"); - - cy.findByTestId("brute-force-tab-save").should("be.enabled").click(); - masthead.checkNotificationMessage("Realm successfully updated"); - }); - - it("add session data", () => { - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-sessions-tab").click(); - - realmSettingsPage.populateSessionsPage(); - realmSettingsPage.save("sessions-tab-save"); - - masthead.checkNotificationMessage("Realm successfully updated"); - }); - - it("check that sessions data was saved", () => { - sidebarPage.goToAuthentication(); - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-sessions-tab").click(); - - cy.findByTestId(realmSettingsPage.ssoSessionIdleInput).should( - "have.value", - 1 - ); - cy.findByTestId(realmSettingsPage.ssoSessionMaxInput).should( - "have.value", - 2 - ); - cy.findByTestId(realmSettingsPage.ssoSessionIdleRememberMeInput).should( - "have.value", - 3 - ); - cy.findByTestId(realmSettingsPage.ssoSessionMaxRememberMeInput).should( - "have.value", - 4 - ); - - cy.findByTestId(realmSettingsPage.clientSessionIdleInput).should( - "have.value", - 5 - ); - cy.findByTestId(realmSettingsPage.clientSessionMaxInput).should( - "have.value", - 6 - ); - - cy.findByTestId(realmSettingsPage.offlineSessionIdleInput).should( - "have.value", - 7 - ); - cy.findByTestId(realmSettingsPage.offlineSessionMaxSwitch).should( - "have.value", - "on" - ); - - cy.findByTestId(realmSettingsPage.loginTimeoutInput).should( - "have.value", - 9 - ); - cy.findByTestId(realmSettingsPage.loginActionTimeoutInput).should( - "have.value", - 10 - ); - }); - - it("add token data", () => { - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-tokens-tab").click(); - - realmSettingsPage.populateTokensPage(); - realmSettingsPage.save("tokens-tab-save"); - - masthead.checkNotificationMessage("Realm successfully updated"); - }); - - it("check that token data was saved", () => { - sidebarPage.goToRealmSettings(); - - cy.findByTestId("rs-tokens-tab").click(); - - cy.findByTestId(realmSettingsPage.accessTokenLifespanInput).should( - "have.value", - 1 - ); - cy.findByTestId( - realmSettingsPage.accessTokenLifespanImplicitInput - ).should("have.value", 2); - cy.findByTestId(realmSettingsPage.clientLoginTimeoutInput).should( - "have.value", - 3 - ); - cy.findByTestId( - realmSettingsPage.userInitiatedActionLifespanInput - ).should("have.value", 4); - - cy.findByTestId(realmSettingsPage.defaultAdminInitatedInput).should( - "have.value", - 5 - ); - cy.findByTestId(realmSettingsPage.emailVerificationInput).should( - "have.value", - 6 - ); - - cy.findByTestId(realmSettingsPage.idpEmailVerificationInput).should( - "have.value", - 7 - ); - cy.findByTestId(realmSettingsPage.forgotPasswordInput).should( - "have.value", - 8 - ); - - cy.findByTestId(realmSettingsPage.executeActionsInput).should( - "have.value", - 9 - ); - }); - }); - - describe("Realm settings events tab tests", () => { - beforeEach(() => { - keycloakBefore(); - loginPage.logIn(); - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-realm-events-tab").click(); - cy.findByTestId("rs-event-listeners-tab").click(); - }); - - it("Should display event listeners form", () => { - realmSettingsPage.shouldDisplayEventListenersForm(); - }); - - it("Should revert saving event listener", () => { - realmSettingsPage.shouldRevertSavingEventListener(); - }); - - it("Should save event listener", () => { - realmSettingsPage.shouldSaveEventListener(); - }); - - it("Should remove event from event listener", () => { - realmSettingsPage.shouldRemoveEventFromEventListener(); - }); - - it("Should remove all events from event listener and re-save original", () => { - realmSettingsPage.shouldSaveEventListener(); - realmSettingsPage.shouldRemoveAllEventListeners(); - realmSettingsPage.shouldReSaveEventListener(); - }); - }); - - 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("Check new client form is displaying", () => { - realmSettingsPage.shouldDisplayNewClientProfileForm(); - }); - - it("Complete new client form and cancel", () => { - realmSettingsPage.shouldCompleteAndCancelCreateNewClientProfile(); - }); - - it("Complete new client form and submit", () => { - realmSettingsPage.shouldCompleteAndCreateNewClientProfile(); - }); - - it("Should perform client profile search by profile name", () => { - realmSettingsPage.shouldSearchClientProfile(); - }); - - it("Check cancelling the client profile deletion", () => { - realmSettingsPage.shouldDisplayDeleteClientProfileDialog(); - }); - - it("Check deleting the client profile", () => { - realmSettingsPage.shouldDeleteClientProfileDialog(); - }); - - it("Check navigating between Form View and JSON editor", () => { - realmSettingsPage.shouldNavigateBetweenFormAndJSONView(); - }); - - 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 edit client profile", () => { - realmSettingsPage.shouldEditClientProfile(); - }); - - it("Should check that edited client profile is now listed", () => { - sidebarPage.goToRealmSettings(); - cy.findByTestId("rs-clientPolicies-tab").click(); - cy.findByTestId("rs-policies-clientProfiles-tab").click(); - realmSettingsPage.shouldCheckEditedClientProfileListed(); - }); - - it("Should show error when client profile left blank", () => { - realmSettingsPage.shouldShowErrorWhenNameBlank(); - }); - - it("Should revert back to the previous profile name", () => { - realmSettingsPage.shouldReloadClientProfileEdits(); - }); - - it("Should not have executors configured by default", () => { - realmSettingsPage.shouldNotHaveExecutorsConfigured(); - }); - - it("Should cancel adding a new executor to a client profile", () => { - realmSettingsPage.shouldCancelAddingExecutor(); - }); - - it("Should add a new executor to a client profile", () => { - realmSettingsPage.shouldAddExecutor(); - }); - - it("Should cancel deleting executor from a client profile", () => { - realmSettingsPage.shouldCancelDeletingExecutor(); - }); - - it("Should cancel editing executor", () => { - realmSettingsPage.shouldCancelEditingExecutor(); - }); - - it("Should edit executor", () => { - realmSettingsPage.shouldEditExecutor(); - }); - - it("Should delete executor from a client profile", () => { - realmSettingsPage.shouldDeleteExecutor(); - }); - - it("Should delete edited client profile", () => { - realmSettingsPage.shouldDeleteEditedProfile(); - }); - }); - - 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("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("Should not have conditions configured by default", () => { - realmSettingsPage.shouldNotHaveConditionsConfigured(); - }); - - it("Should cancel adding a new condition to a client profile", () => { - realmSettingsPage.shouldCancelAddingCondition(); - }); - - it("Should add a new client-roles condition to a client profile", () => { - realmSettingsPage.shouldAddClientRolesCondition(); - }); - - it("Should add a new client-scopes condition to a client profile", () => { - realmSettingsPage.shouldAddClientScopesCondition(); - }); - - it("Should edit the client-roles condition of a client profile", () => { - realmSettingsPage.shouldEditClientRolesCondition(); - }); - - it("Should edit the client-scopes condition of a client profile", () => { - realmSettingsPage.shouldEditClientScopesCondition(); - }); - - it("Should cancel deleting condition from a client profile", () => { - realmSettingsPage.shouldCancelDeletingCondition(); - }); - - it("Should delete client-roles condition from a client profile", () => { - realmSettingsPage.shouldDeleteClientRolesCondition(); - }); - - it("Should delete client-scopes condition from a client profile", () => { - realmSettingsPage.shouldDeleteClientScopesCondition(); - }); - - 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(); - cy.wait(200); - 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/integration/user_fed_kerberos_test.spec.ts b/cypress/integration/user_fed_kerberos_test.spec.ts index be8395b612..4d5813a436 100644 --- a/cypress/integration/user_fed_kerberos_test.spec.ts +++ b/cypress/integration/user_fed_kerberos_test.spec.ts @@ -88,20 +88,18 @@ describe("User Fed Kerberos tests", () => { it("Change existing Kerberos provider and click button to cancel", () => { providersPage.clickExistingCard(firstKerberosName); providersPage.selectCacheType(newPolicy); + providersPage.changeCacheTime("day", defaultKerberosDay); providersPage.changeCacheTime("hour", defaultKerberosHour); providersPage.changeCacheTime("minute", defaultKerberosMinute); + providersPage.cancel(provider); cy.wait(1000); providersPage.clickExistingCard(firstKerberosName); providersPage.selectCacheType(newPolicy); - expect(cy.contains(newKerberosDay).should("exist")); - expect(cy.contains(newKerberosHour).should("exist")); - expect(cy.contains(newKerberosMinute).should("exist")); - expect(cy.contains(defaultKerberosMinute).should("not.exist")); - + providersPage.verifyChangedHourInput(newKerberosHour, defaultKerberosHour); sidebarPage.goToUserFederation(); }); diff --git a/cypress/integration/user_fed_ldap_hardcoded_mapper_test.spec.ts b/cypress/integration/user_fed_ldap_hardcoded_mapper_test.spec.ts new file mode 100644 index 0000000000..3956a68fe9 --- /dev/null +++ b/cypress/integration/user_fed_ldap_hardcoded_mapper_test.spec.ts @@ -0,0 +1,228 @@ +import LoginPage from "../support/pages/LoginPage"; +import SidebarPage from "../support/pages/admin_console/SidebarPage"; +import ListingPage from "../support/pages/admin_console/ListingPage"; +import GroupModal from "../support/pages/admin_console/manage/groups/GroupModal"; +import ProviderPage from "../support/pages/admin_console/manage/providers/ProviderPage"; +import CreateClientPage from "../support/pages/admin_console/manage/clients/CreateClientPage"; +import Masthead from "../support/pages/admin_console/Masthead"; +import ModalUtils from "../support/util/ModalUtils"; +import { keycloakBefore } from "../support/util/keycloak_before"; + +const loginPage = new LoginPage(); +const masthead = new Masthead(); +const sidebarPage = new SidebarPage(); +const listingPage = new ListingPage(); +const groupModal = new GroupModal(); +const createClientPage = new CreateClientPage(); + +const providersPage = new ProviderPage(); +const modalUtils = new ModalUtils(); + +const provider = "ldap"; +const allCapProvider = provider.toUpperCase(); + +const ldapName = "ldap-mappers-testing"; +const ldapVendor = "Active Directory"; + +const connectionUrl = "ldap://"; +const firstBindType = "simple"; +const firstBindDn = "user-1"; +const firstBindCreds = "password1"; + +const firstEditMode = "READ_ONLY"; +const firstUsersDn = "user-dn-1"; +const firstUserLdapAtt = "uid"; +const firstRdnLdapAtt = "uid"; +const firstUuidLdapAtt = "entryUUID"; +const firstUserObjClasses = "inetOrgPerson, organizationalPerson"; + +const addProviderMenu = "Add new provider"; +const providerCreatedSuccess = "User federation provider successfully created"; +const mapperCreatedSuccess = "Mapping successfully created"; +const providerDeleteSuccess = "The user federation provider has been deleted."; +const providerDeleteTitle = "Delete user federation provider?"; +const mapperDeletedSuccess = "Mapping successfully deleted"; +const mapperDeleteTitle = "Delete mapping?"; +const groupDeleteTitle = "Delete group?"; +const groupCreatedSuccess = "Group created"; +const groupDeletedSuccess = "Group deleted"; +const clientCreatedSuccess = "Client created successfully"; +const clientDeletedSuccess = "The client has been deleted"; +const roleCreatedSuccess = "Role created"; +const groupName = "aa-uf-mappers-group"; +const clientName = "aa-uf-mappers-client"; +const roleName = "aa-uf-mappers-role"; + +// mapperType variables +const hcAttMapper = "hardcoded-attribute-mapper"; +const hcLdapGroupMapper = "hardcoded-ldap-group-mapper"; +const hcLdapAttMapper = "hardcoded-ldap-attribute-mapper"; +const roleLdapMapper = "role-ldap-mapper"; +const hcLdapRoleMapper = "hardcoded-ldap-role-mapper"; + +// Used by "Delete default mappers" test +const creationDateMapper = "creation date"; +const emailMapper = "email"; +const lastNameMapper = "last name"; +const modifyDateMapper = "modify date"; + +describe("User Fed LDAP mapper tests", () => { + beforeEach(() => { + keycloakBefore(); + loginPage.logIn(); + sidebarPage.goToUserFederation(); + }); + + it("Create LDAP provider from empty state", () => { + // if tests don't start at empty state, e.g. user has providers configured locally, + // create a new card from the card view instead + cy.get("body").then(($body) => { + if ($body.find(`[data-testid=ldap-card]`).length > 0) { + providersPage.clickNewCard(provider); + } else { + providersPage.clickMenuCommand(addProviderMenu, allCapProvider); + } + }); + providersPage.fillLdapRequiredGeneralData(ldapName, ldapVendor); + providersPage.fillLdapRequiredConnectionData( + connectionUrl, + firstBindType, + firstBindDn, + firstBindCreds + ); + providersPage.fillLdapRequiredSearchingData( + firstEditMode, + firstUsersDn, + firstUserLdapAtt, + firstRdnLdapAtt, + firstUuidLdapAtt, + firstUserObjClasses + ); + providersPage.save(provider); + masthead.checkNotificationMessage(providerCreatedSuccess); + sidebarPage.goToUserFederation(); + }); + + // create a new group + it("Create group", () => { + sidebarPage.goToGroups(); + groupModal + .open("no-groups-in-this-realm-empty-action") + .fillGroupForm(groupName) + .clickCreate(); + + masthead.checkNotificationMessage(groupCreatedSuccess); + }); + + // create a new client and then new role for that client + it("Create client and role", () => { + sidebarPage.goToClients(); + listingPage.goToCreateItem(); + createClientPage + .selectClientType("openid-connect") + .fillClientData(clientName) + .continue() + .continue(); + + masthead.checkNotificationMessage(clientCreatedSuccess); + + providersPage.createRole(roleName); + masthead.checkNotificationMessage(roleCreatedSuccess); + + sidebarPage.goToClients(); + listingPage.searchItem(clientName).itemExist(clientName); + }); + + // delete four default mappers + it("Delete default mappers", () => { + providersPage.clickExistingCard(ldapName); + providersPage.goToMappers(); + + listingPage.itemExist(creationDateMapper).deleteItem(creationDateMapper); + modalUtils.checkModalTitle(mapperDeleteTitle).confirmModal(); + masthead.checkNotificationMessage(mapperDeletedSuccess, true); + listingPage.itemExist(creationDateMapper, false); + + listingPage.itemExist(emailMapper).deleteItem(emailMapper); + modalUtils.checkModalTitle(mapperDeleteTitle).confirmModal(); + masthead.checkNotificationMessage(mapperDeletedSuccess, true); + listingPage.itemExist(emailMapper, false); + + listingPage.itemExist(lastNameMapper).deleteItem(lastNameMapper); + modalUtils.checkModalTitle(mapperDeleteTitle).confirmModal(); + masthead.checkNotificationMessage(mapperDeletedSuccess, true); + listingPage.itemExist(lastNameMapper, false); + + listingPage.itemExist(modifyDateMapper).deleteItem(modifyDateMapper); + modalUtils.checkModalTitle(mapperDeleteTitle).confirmModal(); + masthead.checkNotificationMessage(mapperDeletedSuccess, true); + listingPage.itemExist(modifyDateMapper, false); + }); + + // create one of each hardcoded mapper type + it("Create hardcoded attribute mapper", () => { + providersPage.clickExistingCard(ldapName); + providersPage.goToMappers(); + providersPage.createNewMapper(hcAttMapper); + providersPage.save("ldap-mapper"); + masthead.checkNotificationMessage(mapperCreatedSuccess); + listingPage.itemExist(hcAttMapper, true); + }); + + it("Create hardcoded ldap group mapper", () => { + providersPage.clickExistingCard(ldapName); + providersPage.goToMappers(); + providersPage.createNewMapper(hcLdapGroupMapper); + providersPage.save("ldap-mapper"); + masthead.checkNotificationMessage(mapperCreatedSuccess); + listingPage.itemExist(hcLdapGroupMapper, true); + }); + + it("Create hardcoded ldap attribute mapper", () => { + providersPage.clickExistingCard(ldapName); + providersPage.goToMappers(); + providersPage.createNewMapper(hcLdapAttMapper); + providersPage.save("ldap-mapper"); + masthead.checkNotificationMessage(mapperCreatedSuccess); + listingPage.itemExist(hcLdapAttMapper, true); + }); + + it("Create hardcoded ldap role mapper", () => { + providersPage.clickExistingCard(ldapName); + providersPage.goToMappers(); + providersPage.createNewMapper(hcLdapRoleMapper); + providersPage.save("ldap-mapper"); + masthead.checkNotificationMessage(mapperCreatedSuccess); + listingPage.itemExist(hcLdapRoleMapper, true); + }); + + it("Create role ldap mapper", () => { + providersPage.clickExistingCard(ldapName); + providersPage.goToMappers(); + providersPage.createNewMapper(roleLdapMapper); + providersPage.save("ldap-mapper"); + masthead.checkNotificationMessage(mapperCreatedSuccess); + listingPage.itemExist(roleLdapMapper, true); + }); + + // *** test cleanup *** + it("Cleanup - delete LDAP provider", () => { + providersPage.deleteCardFromMenu(provider, ldapName); + modalUtils.checkModalTitle(providerDeleteTitle).confirmModal(); + masthead.checkNotificationMessage(providerDeleteSuccess); + }); + + it("Cleanup - delete group", () => { + sidebarPage.goToGroups(); + listingPage.deleteItem(groupName); + modalUtils.checkModalTitle(groupDeleteTitle).confirmModal(); + masthead.checkNotificationMessage(groupDeletedSuccess); + }); + + it("Cleanup - delete client", () => { + sidebarPage.goToClients(); + listingPage.deleteItem(clientName); + modalUtils.checkModalTitle(`Delete ${clientName} ?`).confirmModal(); + masthead.checkNotificationMessage(clientDeletedSuccess); + }); +}); diff --git a/cypress/integration/user_fed_ldap_mapper_test.spec.ts b/cypress/integration/user_fed_ldap_mapper_test.spec.ts index 89a0ee8ffd..5ee5d3da2e 100644 --- a/cypress/integration/user_fed_ldap_mapper_test.spec.ts +++ b/cypress/integration/user_fed_ldap_mapper_test.spec.ts @@ -1,9 +1,7 @@ import LoginPage from "../support/pages/LoginPage"; import SidebarPage from "../support/pages/admin_console/SidebarPage"; import ListingPage from "../support/pages/admin_console/ListingPage"; -import GroupModal from "../support/pages/admin_console/manage/groups/GroupModal"; import ProviderPage from "../support/pages/admin_console/manage/providers/ProviderPage"; -import CreateClientPage from "../support/pages/admin_console/manage/clients/CreateClientPage"; import Masthead from "../support/pages/admin_console/Masthead"; import ModalUtils from "../support/util/ModalUtils"; import { keycloakBefore } from "../support/util/keycloak_before"; @@ -12,8 +10,6 @@ const loginPage = new LoginPage(); const masthead = new Masthead(); const sidebarPage = new SidebarPage(); const listingPage = new ListingPage(); -const groupModal = new GroupModal(); -const createClientPage = new CreateClientPage(); const providersPage = new ProviderPage(); const modalUtils = new ModalUtils(); @@ -44,29 +40,14 @@ const providerDeleteSuccess = "The user federation provider has been deleted."; const providerDeleteTitle = "Delete user federation provider?"; const mapperDeletedSuccess = "Mapping successfully deleted"; const mapperDeleteTitle = "Delete mapping?"; -const groupDeleteTitle = "Delete group?"; -const groupCreatedSuccess = "Group created"; -const groupDeletedSuccess = "Group deleted"; -const clientCreatedSuccess = "Client created successfully"; -const clientDeletedSuccess = "The client has been deleted"; -const roleCreatedSuccess = "Role created"; -const groupName = "aa-uf-mappers-group"; -const clientName = "aa-uf-mappers-client"; -const roleName = "aa-uf-mappers-role"; // mapperType variables const msadUserAcctMapper = "msad-user-account-control-mapper"; const msadLdsUserAcctMapper = "msad-lds-user-account-control-mapper"; const userAttLdapMapper = "user-attribute-ldap-mapper"; -const hcAttMapper = "hardcoded-attribute-mapper"; const certLdapMapper = "certificate-ldap-mapper"; const fullNameLdapMapper = "full-name-ldap-mapper"; -const hcLdapGroupMapper = "hardcoded-ldap-group-mapper"; -const hcLdapAttMapper = "hardcoded-ldap-attribute-mapper"; - const groupLdapMapper = "group-ldap-mapper"; -const roleLdapMapper = "role-ldap-mapper"; -const hcLdapRoleMapper = "hardcoded-ldap-role-mapper"; // Used by "Delete default mappers" test const creationDateMapper = "creation date"; @@ -114,36 +95,6 @@ describe("User Fed LDAP mapper tests", () => { sidebarPage.goToUserFederation(); }); - // create a new group - it("Create group", () => { - sidebarPage.goToGroups(); - groupModal - .open("no-groups-in-this-realm-empty-action") - .fillGroupForm(groupName) - .clickCreate(); - - masthead.checkNotificationMessage(groupCreatedSuccess); - }); - - // create a new client and then new role for that client - it("Create client and role", () => { - sidebarPage.goToClients(); - listingPage.goToCreateItem(); - createClientPage - .selectClientType("openid-connect") - .fillClientData(clientName) - .continue() - .continue(); - - masthead.checkNotificationMessage(clientCreatedSuccess); - - providersPage.createRole(roleName); - masthead.checkNotificationMessage(roleCreatedSuccess); - - sidebarPage.goToClients(); - listingPage.searchItem(clientName).itemExist(clientName); - }); - // delete default mappers it("Delete default mappers", () => { providersPage.clickExistingCard(ldapName); @@ -183,7 +134,7 @@ describe("User Fed LDAP mapper tests", () => { .itemExist(MsadAccountControlsMapper) .deleteItem(MsadAccountControlsMapper); modalUtils.checkModalTitle(mapperDeleteTitle).confirmModal(); - masthead.checkNotificationMessage(mapperDeletedSuccess); + masthead.checkNotificationMessage(mapperDeletedSuccess, true); }); // mapper CRUD tests @@ -256,15 +207,6 @@ describe("User Fed LDAP mapper tests", () => { listingPage.itemExist(userAttLdapMapper, true); }); - it("Create hardcoded attribute mapper", () => { - providersPage.clickExistingCard(ldapName); - providersPage.goToMappers(); - providersPage.createNewMapper(hcAttMapper); - providersPage.save("ldap-mapper"); - masthead.checkNotificationMessage(mapperCreatedSuccess); - listingPage.itemExist(hcAttMapper, true); - }); - it("Create full name ldap mapper", () => { providersPage.clickExistingCard(ldapName); providersPage.goToMappers(); @@ -274,24 +216,6 @@ describe("User Fed LDAP mapper tests", () => { listingPage.itemExist(fullNameLdapMapper, true); }); - it("Create hardcoded ldap group mapper", () => { - providersPage.clickExistingCard(ldapName); - providersPage.goToMappers(); - providersPage.createNewMapper(hcLdapGroupMapper); - providersPage.save("ldap-mapper"); - masthead.checkNotificationMessage(mapperCreatedSuccess); - listingPage.itemExist(hcLdapGroupMapper, true); - }); - - it("Create hardcoded ldap attribute mapper", () => { - providersPage.clickExistingCard(ldapName); - providersPage.goToMappers(); - providersPage.createNewMapper(hcLdapAttMapper); - providersPage.save("ldap-mapper"); - masthead.checkNotificationMessage(mapperCreatedSuccess); - listingPage.itemExist(hcLdapAttMapper, true); - }); - it("Create group ldap mapper", () => { providersPage.clickExistingCard(ldapName); providersPage.goToMappers(); @@ -299,24 +223,6 @@ describe("User Fed LDAP mapper tests", () => { providersPage.save("ldap-mapper"); masthead.checkNotificationMessage(mapperCreatedSuccess); listingPage.itemExist(groupLdapMapper, true); - - it("Create hardcoded ldap role mapper", () => { - providersPage.clickExistingCard(ldapName); - providersPage.goToMappers(); - providersPage.createNewMapper(hcLdapRoleMapper); - providersPage.save("ldap-mapper"); - masthead.checkNotificationMessage(mapperCreatedSuccess); - listingPage.itemExist(hcLdapRoleMapper, true); - }); - - it("Create role ldap mapper", () => { - providersPage.clickExistingCard(ldapName); - providersPage.goToMappers(); - providersPage.createNewMapper(roleLdapMapper); - providersPage.save("ldap-mapper"); - masthead.checkNotificationMessage(mapperCreatedSuccess); - listingPage.itemExist(roleLdapMapper, true); - }); }); // *** test cleanup *** @@ -325,18 +231,4 @@ describe("User Fed LDAP mapper tests", () => { modalUtils.checkModalTitle(providerDeleteTitle).confirmModal(); masthead.checkNotificationMessage(providerDeleteSuccess); }); - - it("Cleanup - delete group", () => { - sidebarPage.goToGroups(); - listingPage.deleteItem(groupName); - modalUtils.checkModalTitle(groupDeleteTitle).confirmModal(); - masthead.checkNotificationMessage(groupDeletedSuccess); - }); - - it("Cleanup - delete client", () => { - sidebarPage.goToClients(); - listingPage.deleteItem(clientName); - modalUtils.checkModalTitle(`Delete ${clientName} ?`).confirmModal(); - masthead.checkNotificationMessage(clientDeletedSuccess); - }); }); diff --git a/cypress/integration/user_fed_ldap_test.spec.ts b/cypress/integration/user_fed_ldap_test.spec.ts index d5518fc459..f581a74277 100644 --- a/cypress/integration/user_fed_ldap_test.spec.ts +++ b/cypress/integration/user_fed_ldap_test.spec.ts @@ -128,10 +128,7 @@ describe("User Fed LDAP tests", () => { providersPage.clickExistingCard(firstLdapName); providersPage.selectCacheType(newPolicy); - expect(cy.contains(newLdapDay).should("exist")); - expect(cy.contains(newLdapHour).should("exist")); - expect(cy.contains(newLdapMinute).should("exist")); - expect(cy.contains(defaultLdapMinute).should("not.exist")); + providersPage.verifyChangedHourInput(newLdapHour, defaultLdapHour); sidebarPage.goToUserFederation(); }); diff --git a/cypress/plugins/index.ts b/cypress/plugins/index.ts index ada23ebd68..bcfc6bb38f 100644 --- a/cypress/plugins/index.ts +++ b/cypress/plugins/index.ts @@ -28,6 +28,8 @@ const configurePlugins: Cypress.PluginConfig = (on) => { }), ], }; + const _ = require("lodash"); + const del = require("del"); on( "file:preprocessor", @@ -36,6 +38,18 @@ const configurePlugins: Cypress.PluginConfig = (on) => { webpackOptions, }) ); + on("after:spec", (spec, results) => { + if (results?.video) { + // Do we have failures for any retry attempts? + const failures = _.some(results.tests, (test: any) => { + return _.some(test.attempts, { state: "failed" }); + }); + if (!failures) { + // delete the video if the spec passed and no tests retried + return del(results.video); + } + } + }); }; export default configurePlugins; diff --git a/cypress/support/pages/admin_console/manage/providers/ProviderPage.ts b/cypress/support/pages/admin_console/manage/providers/ProviderPage.ts index 8072fb7f3a..3ea79f6024 100644 --- a/cypress/support/pages/admin_console/manage/providers/ProviderPage.ts +++ b/cypress/support/pages/admin_console/manage/providers/ProviderPage.ts @@ -101,6 +101,14 @@ export default class ProviderPage { return this; } + verifyChangedHourInput(expected: string, unexpected: string) { + expect(cy.get(this.cacheHourInput).contains(expected).should("exist")); + expect( + cy.get(this.cacheHourInput).contains(unexpected).should("not.exist") + ); + return this; + } + deleteCardFromCard(card: string) { cy.get(`[data-testid=${card}-dropdown]`).click(); cy.get('[data-testid="card-delete"]').click(); 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 4bb10b33a9..0a751db0f2 100644 --- a/cypress/support/pages/admin_console/manage/realm_settings/RealmSettingsPage.ts +++ b/cypress/support/pages/admin_console/manage/realm_settings/RealmSettingsPage.ts @@ -190,6 +190,7 @@ export default class RealmSettingsPage { private addExecutorSaveBtn = "addExecutor-saveBtn"; private availablePeriodExecutorFld = "available-period"; private editExecutor = "editExecutor"; + private listingPage = new ListingPage(); private addCondition = "addCondition"; private addConditionDrpDwn = ".pf-c-select__toggle"; @@ -766,7 +767,8 @@ export default class RealmSettingsPage { shouldCancelEditingExecutor() { cy.get(this.clientProfileTwo).click(); cy.findByTestId(this.editExecutor).first().click(); - cy.get('a[data-testid="addExecutor-cancelBtn"]').click(); + + cy.findByTestId(this.addExecutorCancelBtn).click(); cy.get('ul[class*="pf-c-data-list"]').should( "have.text", "secure-ciba-signed-authn-req" diff --git a/package-lock.json b/package-lock.json index f8c84e8c07..edcb15dd5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@patternfly/react-icons": "^4.26.4", "@patternfly/react-table": "^4.44.4", "dagre": "^0.8.5", + "del": "^6.0.0", "file-saver": "^2.0.5", "i18next": "^21.5.4", "lodash": "^4.17.20", @@ -3422,7 +3423,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3435,7 +3435,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -3444,7 +3443,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -5700,7 +5698,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5913,7 +5910,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -6632,8 +6628,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", @@ -6779,7 +6774,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6789,7 +6783,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -7481,7 +7474,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "engines": { "node": ">=6" } @@ -7760,8 +7752,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -8723,6 +8714,27 @@ "node": ">=0.10.0" } }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -8847,7 +8859,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -10203,7 +10214,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10219,7 +10229,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -10242,7 +10251,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -10340,7 +10348,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -10692,8 +10699,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -10894,7 +10900,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10956,7 +10961,6 @@ "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -11495,7 +11499,6 @@ "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, "engines": { "node": ">= 4" } @@ -11587,7 +11590,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "engines": { "node": ">=8" } @@ -11602,7 +11604,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11611,8 +11612,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -11836,7 +11836,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11863,7 +11862,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -11921,7 +11919,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -11941,11 +11938,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -14898,7 +14902,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -14916,7 +14919,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -15019,7 +15021,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15930,7 +15931,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -16054,7 +16054,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -16256,7 +16255,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16288,7 +16286,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -16340,7 +16337,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -16922,7 +16918,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -17609,7 +17604,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -17619,7 +17613,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -17692,7 +17685,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -18333,7 +18325,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -19640,7 +19631,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -21234,8 +21224,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -23859,7 +23848,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -23868,14 +23856,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -25794,7 +25780,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -25945,8 +25930,7 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array-unique": { "version": "0.3.2", @@ -26530,8 +26514,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -26661,7 +26644,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -26671,7 +26653,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -27218,8 +27199,7 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-cursor": { "version": "3.1.0", @@ -27428,8 +27408,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -28193,6 +28172,21 @@ "isobject": "^3.0.1" } }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -28299,7 +28293,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "requires": { "path-type": "^4.0.0" } @@ -29336,7 +29329,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -29349,7 +29341,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -29371,7 +29362,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -29454,7 +29444,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -29706,8 +29695,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -29867,7 +29855,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -29911,7 +29898,6 @@ "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -30319,8 +30305,7 @@ "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, "ignore-walk": { "version": "3.0.4", @@ -30386,8 +30371,7 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infer-owner": { "version": "1.0.4", @@ -30399,7 +30383,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -30408,8 +30391,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "2.0.0", @@ -30574,8 +30556,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -30593,7 +30574,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -30635,8 +30615,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.6", @@ -30647,11 +30626,15 @@ "has-tostringtag": "^1.0.0" } }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-plain-object": { "version": "5.0.0", @@ -32868,8 +32851,7 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "meriyah": { "version": "3.1.6", @@ -32881,7 +32863,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -32961,7 +32942,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -33681,7 +33661,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -33772,7 +33751,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "requires": { "aggregate-error": "^3.0.0" } @@ -33934,8 +33912,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -33960,8 +33937,7 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pbkdf2": { "version": "3.1.2", @@ -34006,8 +33982,7 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { "version": "2.3.0", @@ -34444,8 +34419,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "quick-lru": { "version": "5.1.1", @@ -34981,14 +34955,12 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -35040,7 +35012,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -35547,8 +35518,7 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "3.0.0", @@ -36582,7 +36552,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -37835,8 +37804,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", diff --git a/package.json b/package.json index 1f95bcb4c1..05d1f482fe 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@patternfly/react-icons": "^4.26.4", "@patternfly/react-table": "^4.44.4", "dagre": "^0.8.5", + "del": "^6.0.0", "file-saver": "^2.0.5", "i18next": "^21.5.4", "lodash": "^4.17.20",