diff --git a/js/apps/admin-ui/cypress/e2e/client_registration_policies.spec.ts b/js/apps/admin-ui/cypress/e2e/client_registration_policies.spec.ts
index 29263f07f90..0cdbc73cdd6 100644
--- a/js/apps/admin-ui/cypress/e2e/client_registration_policies.spec.ts
+++ b/js/apps/admin-ui/cypress/e2e/client_registration_policies.spec.ts
@@ -5,13 +5,13 @@ import SidebarPage from "../support/pages/admin-ui/SidebarPage";
import LoginPage from "../support/pages/LoginPage";
import { keycloakBefore } from "../support/util/keycloak_hooks";
-describe("Client registration policies subtab", () => {
- const loginPage = new LoginPage();
- const listingPage = new ListingPage();
- const masthead = new Masthead();
- const sidebarPage = new SidebarPage();
- const clientRegistrationPage = new ClientRegistrationPage();
+const loginPage = new LoginPage();
+const listingPage = new ListingPage();
+const masthead = new Masthead();
+const sidebarPage = new SidebarPage();
+const clientRegistrationPage = new ClientRegistrationPage();
+describe("Client registration policies tab", () => {
beforeEach(() => {
loginPage.logIn();
keycloakBefore();
@@ -20,57 +20,123 @@ describe("Client registration policies subtab", () => {
sidebarPage.waitForPageLoad();
});
- it("add anonymous client registration policy", () => {
- clientRegistrationPage
- .createPolicy()
- .selectRow("max-clients")
- .fillPolicyForm({
- name: "new policy",
- })
- .formUtils()
- .save();
-
- masthead.checkNotificationMessage("New client policy created successfully");
- clientRegistrationPage.formUtils().cancel();
- listingPage.itemExist("new policy");
- });
-
- it("edit anonymous client registration policy", () => {
- listingPage.goToItemDetails("new policy");
- clientRegistrationPage
- .fillPolicyForm({
- name: "policy 2",
- })
- .formUtils()
- .save();
-
- masthead.checkNotificationMessage("Client policy updated successfully");
- clientRegistrationPage.formUtils().cancel();
- listingPage.itemExist("policy 2");
- });
-
- it("delete anonymous client registration policy", () => {
- listingPage.clickRowDetails("policy 2").clickDetailMenu("Delete");
- clientRegistrationPage.modalUtils().confirmModal();
-
- masthead.checkNotificationMessage(
- "Client registration policy deleted successfully",
- );
- listingPage.itemExist("policy 2", false);
- });
-
- describe("Accessibility tests for client registration policies", () => {
- beforeEach(() => {
- loginPage.logIn();
- keycloakBefore();
- sidebarPage.goToClients();
- clientRegistrationPage.goToClientRegistrationTab();
- sidebarPage.waitForPageLoad();
- cy.injectAxe();
+ describe("Anonymous client policies subtab", () => {
+ it("check anonymous clients list is not empty", () => {
+ cy.findByTestId("clientRegistration-anonymous")
+ .find("tr")
+ .should("have.length.gt", 0);
});
- it("Check a11y violations on load/ client registration policies", () => {
- cy.checkA11y();
+ it("add anonymous client registration policy", () => {
+ clientRegistrationPage
+ .createPolicy()
+ .selectRow("max-clients")
+ .fillPolicyForm({
+ name: "new policy",
+ })
+ .formUtils()
+ .save();
+
+ masthead.checkNotificationMessage(
+ "New client policy created successfully",
+ );
+ clientRegistrationPage.formUtils().cancel();
+ listingPage.itemExist("new policy");
+ });
+
+ it("edit anonymous client registration policy", () => {
+ listingPage.goToItemDetails("new policy");
+ cy.findByTestId("name").clear();
+ clientRegistrationPage
+ .fillPolicyForm({
+ name: "policy 2",
+ })
+ .formUtils()
+ .save();
+
+ masthead.checkNotificationMessage("Client policy updated successfully");
+ clientRegistrationPage.formUtils().cancel();
+ listingPage.itemExist("policy 2");
+ });
+
+ it("delete anonymous client registration policy", () => {
+ listingPage.clickRowDetails("policy 2").clickDetailMenu("Delete");
+ clientRegistrationPage.modalUtils().confirmModal();
+
+ masthead.checkNotificationMessage(
+ "Client registration policy deleted successfully",
+ );
+ listingPage.itemExist("policy 2", false);
+ });
+ });
+
+ describe("Authenticated client policies subtab", () => {
+ beforeEach(() => {
+ clientRegistrationPage.goToAuthenticatedSubTab();
+ sidebarPage.waitForPageLoad();
+ });
+
+ it("check authenticated clients list is not empty", () => {
+ cy.findByTestId("clientRegistration-authenticated")
+ .find("tr")
+ .should("have.length.gt", 0);
+ });
+
+ it("add authenticated client registration policy", () => {
+ clientRegistrationPage
+ .createPolicy()
+ .selectRow("scope")
+ .fillPolicyForm({
+ name: "new authenticated policy",
+ })
+ .formUtils()
+ .save();
+
+ masthead.checkNotificationMessage(
+ "New client policy created successfully",
+ );
+ clientRegistrationPage.formUtils().cancel();
+ listingPage.itemExist("new authenticated policy");
+ });
+
+ it("edit authenticated client registration policy", () => {
+ listingPage.goToItemDetails("new authenticated policy");
+ cy.findByTestId("name").clear();
+ clientRegistrationPage
+ .fillPolicyForm({
+ name: "policy 3",
+ })
+ .formUtils()
+ .save();
+
+ masthead.checkNotificationMessage("Client policy updated successfully");
+ clientRegistrationPage.formUtils().cancel();
+ listingPage.itemExist("policy 3");
+ });
+
+ it("delete authenticated client registration policy", () => {
+ listingPage.clickRowDetails("policy 3").clickDetailMenu("Delete");
+ clientRegistrationPage.modalUtils().confirmModal();
+
+ masthead.checkNotificationMessage(
+ "Client registration policy deleted successfully",
+ );
+ listingPage.itemExist("policy 3", false);
});
});
});
+
+describe("Accessibility tests for client registration policies", () => {
+ beforeEach(() => {
+ loginPage.logIn();
+ keycloakBefore();
+ sidebarPage.goToClients();
+ clientRegistrationPage.goToClientRegistrationTab();
+ sidebarPage.waitForPageLoad();
+ cy.injectAxe();
+ });
+
+ it("Check a11y violations on load/ client registration policies", () => {
+ cy.checkA11y();
+ });
+});
diff --git a/js/apps/admin-ui/cypress/e2e/clients_test.spec.ts b/js/apps/admin-ui/cypress/e2e/clients_test.spec.ts
index ae72c328bea..ceb81666977 100644
--- a/js/apps/admin-ui/cypress/e2e/clients_test.spec.ts
+++ b/js/apps/admin-ui/cypress/e2e/clients_test.spec.ts
@@ -231,6 +231,81 @@ describe("Clients test", () => {
});
});
+ describe("Client scopes evaluate subtab", () => {
+ const clientName = "testClient";
+
+ beforeEach(() => {
+ loginPage.logIn();
+ keycloakBefore();
+ commonPage.sidebar().goToClients();
+ });
+
+ before(async () => {
+ await adminClient.createClient({
+ protocol: "openid-connect",
+ clientId: clientName,
+ publicClient: false,
+ });
+ });
+
+ after(async () => {
+ await adminClient.deleteClient(clientName);
+ });
+
+ it("check effective protocol mappers list is not empty and find effective protocol mapper locale", () => {
+ commonPage.tableToolbarUtils().searchItem(clientName);
+ commonPage.tableUtils().clickRowItemLink(clientName);
+
+ clientDetailsPage.goToClientScopesEvaluateTab();
+
+ cy.findByTestId("effective-protocol-mappers")
+ .find("tr")
+ .should("have.length.gt", 0);
+ });
+
+ it("check role scope mappings list list is not empty and find role scope mapping admin", () => {
+ commonPage.tableToolbarUtils().searchItem(clientName);
+ commonPage.tableUtils().clickRowItemLink(clientName);
+
+ clientDetailsPage.goToClientScopesEvaluateTab();
+ clientDetailsPage.goToClientScopesEvaluateEffectiveRoleScopeMappingsTab();
+
+ cy.findByTestId("effective-role-scope-mappings")
+ .find("tr")
+ .should("have.length.gt", 0);
+ });
+
+ it("check generated access token when user is not selected", () => {
+ commonPage.tableToolbarUtils().searchItem(clientName);
+ commonPage.tableUtils().clickRowItemLink(clientName);
+
+ clientDetailsPage.goToClientScopesEvaluateTab();
+ clientDetailsPage.goToClientScopesEvaluateGeneratedAccessTokenTab();
+
+ cy.get("div#generatedAccessToken").contains("No generated access token");
+ });
+
+ it("check generated id token when user is not selected", () => {
+ commonPage.tableToolbarUtils().searchItem(clientName);
+ commonPage.tableUtils().clickRowItemLink(clientName);
+
+ clientDetailsPage.goToClientScopesEvaluateTab();
+ clientDetailsPage.goToClientScopesEvaluateGeneratedIdTokenTab();
+
+ cy.get("div#generatedIdToken").contains("No generated id token");
+ });
+
+ it("check generated user info when user is not selected", () => {
+ commonPage.tableToolbarUtils().searchItem(clientName);
+ commonPage.tableUtils().clickRowItemLink(clientName);
+
+ clientDetailsPage.goToClientScopesEvaluateTab();
+ clientDetailsPage.goToClientScopesEvaluateGeneratedUserInfoTab();
+
+ cy.get("div#generatedUserInfo").contains("No generated user info");
+ });
+ });
+
describe("Client creation", () => {
beforeEach(() => {
loginPage.logIn();
@@ -1068,6 +1143,8 @@ describe("Clients test", () => {
});
describe("Accessibility tests for clients", () => {
+ const clientId = "a11y-client";
+
beforeEach(() => {
loginPage.logIn();
keycloakBefore();
@@ -1075,8 +1152,6 @@ describe("Clients test", () => {
cy.injectAxe();
});
- const clientId = "a11y-client";
-
it("Check a11y violations on load/ clients list tab", () => {
cy.checkA11y();
});
@@ -1108,6 +1183,21 @@ describe("Clients test", () => {
clientDetailsPage.goToClientScopesTab();
cy.checkA11y();
+ clientDetailsPage.goToClientScopesEvaluateTab();
+ cy.checkA11y();
+
+ clientDetailsPage.goToClientScopesEvaluateEffectiveRoleScopeMappingsTab();
+ cy.checkA11y();
+
+ clientDetailsPage.goToClientScopesEvaluateGeneratedAccessTokenTab();
+ cy.checkA11y();
+
+ clientDetailsPage.goToClientScopesEvaluateGeneratedIdTokenTab();
+ cy.checkA11y();
+
+ clientDetailsPage.goToClientScopesEvaluateGeneratedUserInfoTab();
+ cy.checkA11y();
+
clientDetailsPage.goToAdvancedTab();
cy.checkA11y();
});
diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/ClientRegistrationPage.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/ClientRegistrationPage.ts
index 4e207dc99d1..bd7db4fa046 100644
--- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/ClientRegistrationPage.ts
+++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/ClientRegistrationPage.ts
@@ -6,8 +6,13 @@ export class ClientRegistrationPage extends CommonPage {
return this;
}
+ goToAuthenticatedSubTab() {
+ cy.findAllByTestId("authenticated").click();
+ return this;
+ }
+
createPolicy() {
- cy.findAllByTestId("createPolicy").click();
+ cy.findAllByTestId("createPolicy").click({ force: true });
return this;
}
@@ -17,7 +22,7 @@ export class ClientRegistrationPage extends CommonPage {
}
fillPolicyForm(props: { name: string }) {
- cy.findAllByTestId("name").clear().type(props.name);
+ cy.findAllByTestId("name").type(props.name);
return this;
}
}
diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/ClientDetailsPage.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/ClientDetailsPage.ts
index 0d60606737b..6d6b95cd013 100644
--- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/ClientDetailsPage.ts
+++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/ClientDetailsPage.ts
@@ -29,6 +29,13 @@ export default class ClientDetailsPage extends CommonPage {
#clientScopesTab = new ClientScopesTab();
#authorizationTab = new AuthorizationTab();
#advancedTab = new AdvancedTab();
+ #clientScopesSetupTab = "clientScopesSetupTab";
+ #clientScopesEvaluateTab = "clientScopesEvaluateTab";
+ #evaluateEffectiveProtocolMappersTab = "effective-protocol-mappers-tab";
+ #evaluateEffectiveRoleScopeMappingsTab = "effective-role-scope-mappings-tab";
+ #evaluateGeneratedAccessTokenTab = "generated-access-token-tab";
+ #evaluateGeneratedIdTokenTab = "generated-id-token-tab";
+ #evaluateGeneratedUserInfoTab = "generated-user-info-tab";
goToSettingsTab() {
this.tabUtils().clickTab(ClientsDetailsTab.Settings);
@@ -64,4 +71,40 @@ export default class ClientDetailsPage extends CommonPage {
this.tabUtils().clickTab(ClientsDetailsTab.Advanced);
return this.#advancedTab;
}
+
+ goToClientScopesSetupTab() {
+ cy.findByTestId(this.#clientScopesSetupTab).click();
+ return this;
+ }
+
+ goToClientScopesEvaluateTab() {
+ this.goToClientScopesTab();
+ cy.findByTestId(this.#clientScopesEvaluateTab).click();
+ return this;
+ }
+
+ goToClientScopesEvaluateEffectiveProtocolMappersTab() {
+ cy.findByTestId(this.#evaluateEffectiveProtocolMappersTab).click();
+ return this;
+ }
+
+ goToClientScopesEvaluateEffectiveRoleScopeMappingsTab() {
+ cy.findByTestId(this.#evaluateEffectiveRoleScopeMappingsTab).click();
+ return this;
+ }
+
+ goToClientScopesEvaluateGeneratedAccessTokenTab() {
+ cy.findByTestId(this.#evaluateGeneratedAccessTokenTab).click();
+ return this;
+ }
+
+ goToClientScopesEvaluateGeneratedIdTokenTab() {
+ cy.findByTestId(this.#evaluateGeneratedIdTokenTab).click();
+ return this;
+ }
+
+ goToClientScopesEvaluateGeneratedUserInfoTab() {
+ cy.findByTestId(this.#evaluateGeneratedUserInfoTab).click();
+ return this;
+ }
}
diff --git a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/ClientScopesTab.ts b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/ClientScopesTab.ts
index 45f58165b64..6d3abae8314 100644
--- a/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/ClientScopesTab.ts
+++ b/js/apps/admin-ui/cypress/support/pages/admin-ui/manage/clients/client_details/tabs/ClientScopesTab.ts
@@ -3,7 +3,7 @@ import SetupTab from "./clientscopes_subtabs/SetupTab";
import EvaluateTab from "./clientscopes_subtabs/EvaluateTab";
import DedicatedScopesPage from "../DedicatedScopesPage";
-enum ClientScopesSubTab {
+export enum ClientScopesSubTab {
Setup = "Setup",
Evaluate = "Evaluate",
}
diff --git a/js/apps/admin-ui/src/clients/ClientDetails.tsx b/js/apps/admin-ui/src/clients/ClientDetails.tsx
index 24c1fcf8014..2b11f49a1bd 100644
--- a/js/apps/admin-ui/src/clients/ClientDetails.tsx
+++ b/js/apps/admin-ui/src/clients/ClientDetails.tsx
@@ -509,6 +509,7 @@ export default function ClientDetails() {
>
{t("setup")}}
{...clientScopesSetupTab}
>
@@ -521,6 +522,7 @@ export default function ClientDetails() {
{t("evaluate")}}
{...clientScopesEvaluateTab}
>
diff --git a/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx b/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx
index bc194606b7e..4ac8cd0e78b 100644
--- a/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx
+++ b/js/apps/admin-ui/src/clients/registration/ClientRegistrationList.tsx
@@ -103,8 +103,9 @@ export const ClientRegistrationList = ({
)}
diff --git a/js/apps/admin-ui/src/clients/scopes/EvaluateScopes.tsx b/js/apps/admin-ui/src/clients/scopes/EvaluateScopes.tsx
index 9b2c213a42f..f01badeadb1 100644
--- a/js/apps/admin-ui/src/clients/scopes/EvaluateScopes.tsx
+++ b/js/apps/admin-ui/src/clients/scopes/EvaluateScopes.tsx
@@ -59,6 +59,7 @@ const ProtocolMappers = ({
loader={() => Promise.resolve(protocolMappers)}
ariaLabelKey="effectiveProtocolMappers"
searchPlaceholderKey="searchForProtocol"
+ data-testid="effective-protocol-mappers"
columns={[
{
name: "mapperName",
@@ -97,6 +98,7 @@ const EffectiveRoles = ({
loader={() => Promise.resolve(effectiveRoles)}
ariaLabelKey="effectiveRoleScopeMappings"
searchPlaceholderKey="searchForRole"
+ data-testid="effective-role-scope-mappings"
columns={[
{
name: "name",
@@ -362,6 +364,7 @@ export const EvaluateScopes = ({ clientId, protocol }: EvaluateScopesProps) => {
@@ -379,6 +382,7 @@ export const EvaluateScopes = ({ clientId, protocol }: EvaluateScopesProps) => {
@@ -396,6 +400,7 @@ export const EvaluateScopes = ({ clientId, protocol }: EvaluateScopesProps) => {
@@ -413,6 +418,7 @@ export const EvaluateScopes = ({ clientId, protocol }: EvaluateScopesProps) => {
@@ -430,6 +436,7 @@ export const EvaluateScopes = ({ clientId, protocol }: EvaluateScopesProps) => {