From 52479f1fe5e674b1f3469ae38dba48363400756b Mon Sep 17 00:00:00 2001
From: GCHQ-Developer-741
<117368893+GCHQ-Developer-741@users.noreply.github.com>
Date: Thu, 23 Jan 2025 12:23:15 +0000
Subject: [PATCH] feat(react): added cypress tests for a slotted radio-group
within a radio-group
added test for keyboard interaction when slotting a child radio-group.
Also updated some consts
---
.../component-tests/IcRadio/IcRadio.cy.tsx | 90 ++++++++++++++-----
.../IcRadio/IcRadioTestData.tsx | 65 ++++++++++++++
.../src/stories/ic-radio-group.stories.mdx | 54 ++++++++---
3 files changed, 175 insertions(+), 34 deletions(-)
diff --git a/packages/react/src/component-tests/IcRadio/IcRadio.cy.tsx b/packages/react/src/component-tests/IcRadio/IcRadio.cy.tsx
index 863420e88e..d5717ca365 100644
--- a/packages/react/src/component-tests/IcRadio/IcRadio.cy.tsx
+++ b/packages/react/src/component-tests/IcRadio/IcRadio.cy.tsx
@@ -1,4 +1,4 @@
-///
+///
import React from "react";
import { mount } from "cypress/react";
@@ -20,6 +20,8 @@ import {
TabbableSelected,
ConditionalDynamicTextFieldValue,
InAForm,
+ RadioGroupInAdditionalField,
+ StaticChildRadioGroup,
} from "./IcRadioTestData";
import {
HAVE_PROP,
@@ -31,6 +33,7 @@ import {
HAVE_ATTR,
NOT_BE_VISIBLE,
HAVE_BEEN_CALLED,
+ BE_VISIBLE,
} from "../utils/constants";
import { setThresholdBasedOnEnv } from "../../../cypress/utils/helpers";
@@ -40,6 +43,7 @@ const IC_BUTTON = "ic-button";
const BUTTON = "button";
const INPUT = "input";
const TEXT_FIELD_SELECTOR = "ic-text-field";
+const CONTAINER_CLASS = ".container";
const DEFAULT_TEST_THRESHOLD = 0.026;
describe("IcRadio end-to-end tests", () => {
@@ -126,7 +130,7 @@ describe("IcRadio end-to-end tests", () => {
mount();
cy.spy(window.console, "log").as("spyWinConsoleLog");
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get("@spyWinConsoleLog").should(HAVE_BEEN_CALLED_WITH, true);
});
@@ -158,10 +162,10 @@ describe("IcRadio end-to-end tests", () => {
cy.checkHydrated(RADIO_GROUP_SELECTOR);
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", false);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", false);
- cy.get(RADIO_SELECTOR).eq(1).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(1).shadow().find(CONTAINER_CLASS).click();
cy.realPress("ArrowDown");
cy.get(RADIO_SELECTOR).eq(2).should(HAVE_PROP, "selected", false);
cy.realPress("ArrowUp");
@@ -174,11 +178,11 @@ describe("IcRadio end-to-end tests", () => {
cy.checkHydrated(RADIO_GROUP_SELECTOR);
cy.get(TEXT_FIELD_SELECTOR).should(HAVE_PROP, "disabled", true);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(TEXT_FIELD_SELECTOR).should(HAVE_PROP, "disabled", false);
cy.findShadowEl(TEXT_FIELD_SELECTOR, INPUT).type("test");
cy.get(TEXT_FIELD_SELECTOR).should(HAVE_PROP, "value", "test");
- cy.get(RADIO_SELECTOR).eq(1).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(1).shadow().find(CONTAINER_CLASS).click();
cy.get(TEXT_FIELD_SELECTOR).should(HAVE_PROP, "disabled", true);
});
@@ -190,20 +194,20 @@ describe("IcRadio end-to-end tests", () => {
cy.get(TEXT_FIELD_SELECTOR).eq(0).should(NOT_BE_VISIBLE);
cy.get(TEXT_FIELD_SELECTOR).eq(1).should(NOT_BE_VISIBLE);
cy.get(TEXT_FIELD_SELECTOR).eq(2).should(NOT_BE_VISIBLE);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
- cy.get(TEXT_FIELD_SELECTOR).eq(0).should("be.visible");
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
+ cy.get(TEXT_FIELD_SELECTOR).eq(0).should(BE_VISIBLE);
cy.get(TEXT_FIELD_SELECTOR).eq(1).should(NOT_BE_VISIBLE);
cy.get(TEXT_FIELD_SELECTOR).eq(2).should(NOT_BE_VISIBLE);
- cy.get(RADIO_SELECTOR).eq(1).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(1).shadow().find(CONTAINER_CLASS).click();
cy.get(TEXT_FIELD_SELECTOR).eq(0).should(NOT_BE_VISIBLE);
- cy.get(TEXT_FIELD_SELECTOR).eq(1).should("be.visible");
+ cy.get(TEXT_FIELD_SELECTOR).eq(1).should(BE_VISIBLE);
cy.get(TEXT_FIELD_SELECTOR).eq(2).should(NOT_BE_VISIBLE);
- cy.get(RADIO_SELECTOR).eq(2).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(2).shadow().find(CONTAINER_CLASS).click();
cy.get(TEXT_FIELD_SELECTOR).eq(0).should(NOT_BE_VISIBLE);
cy.get(TEXT_FIELD_SELECTOR).eq(1).should(NOT_BE_VISIBLE);
- cy.get(TEXT_FIELD_SELECTOR).eq(2).should("be.visible");
+ cy.get(TEXT_FIELD_SELECTOR).eq(2).should(BE_VISIBLE);
});
it("should emit icChange and icCheck events when radio option is selected", () => {
@@ -221,7 +225,7 @@ describe("IcRadio end-to-end tests", () => {
cy.stub().as("icCheck")
);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", true);
cy.get("@icChange").should(HAVE_BEEN_CALLED);
@@ -304,7 +308,7 @@ describe("IcRadio end-to-end tests", () => {
cy.checkHydrated(RADIO_GROUP_SELECTOR);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", true);
cy.realPress("Tab");
cy.get(TEXT_FIELD_SELECTOR).eq(0).should(HAVE_FOCUS);
@@ -315,7 +319,7 @@ describe("IcRadio end-to-end tests", () => {
cy.checkHydrated(RADIO_GROUP_SELECTOR);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", true);
cy.get(TEXT_FIELD_SELECTOR).should(HAVE_PROP, "disabled", false);
cy.realPress("ArrowDown");
@@ -345,7 +349,7 @@ describe("IcRadio end-to-end tests", () => {
cy.checkHydrated(RADIO_GROUP_SELECTOR);
cy.spy(window.console, "log").as("spyWinConsoleLog");
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", true);
cy.get("input[type='submit']").click();
cy.get("@spyWinConsoleLog").should(
@@ -359,13 +363,59 @@ describe("IcRadio end-to-end tests", () => {
cy.checkHydrated(RADIO_GROUP_SELECTOR);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", true);
cy.get("input[type='reset']").click();
cy.get(RADIO_SELECTOR).eq(0).should(HAVE_PROP, "selected", false);
});
+
+ it("should handle keyboard navigation of a slotted radio-group within an additional-field", () => {
+ mount();
+
+ cy.checkHydrated(RADIO_GROUP_SELECTOR);
+
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find("input").focus();
+ cy.realPress("Tab").realPress("ArrowDown");
+
+ cy.get(`${RADIO_SELECTOR}[label="child-option-2"]`).should(
+ HAVE_PROP,
+ "selected",
+ true
+ );
+ cy.get(`${RADIO_SELECTOR}[label="option2"]`).should(
+ HAVE_PROP,
+ "selected",
+ false
+ );
+ });
+
+ it("should select parent radio if a child radio is selected when additionFieldDisplay is static", () => {
+ mount();
+
+ cy.checkHydrated(RADIO_GROUP_SELECTOR);
+
+ cy.get(`${RADIO_SELECTOR}[label="option2"]`).should(
+ HAVE_PROP,
+ "selected",
+ false
+ );
+
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find("input").focus();
+ cy.realPress("Tab").realPress("Space");
+
+ cy.get(`${RADIO_SELECTOR}[label="child-option-1"]`).should(
+ HAVE_PROP,
+ "selected",
+ true
+ );
+ cy.get(`${RADIO_SELECTOR}[label="option2"]`).should(
+ HAVE_PROP,
+ "selected",
+ true
+ );
+ });
});
describe("IcRadio visual regression and a11y tests", () => {
@@ -528,7 +578,7 @@ describe("IcRadio visual regression and a11y tests", () => {
mount();
cy.checkHydrated(RADIO_GROUP_SELECTOR);
- cy.get(RADIO_SELECTOR).eq(0).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(0).shadow().find(CONTAINER_CLASS).click();
cy.checkA11yWithWait();
cy.compareSnapshot({
@@ -541,7 +591,7 @@ describe("IcRadio visual regression and a11y tests", () => {
mount();
cy.checkHydrated(RADIO_GROUP_SELECTOR);
- cy.get(RADIO_SELECTOR).eq(1).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(1).shadow().find(CONTAINER_CLASS).click();
cy.checkA11yWithWait();
cy.compareSnapshot({
@@ -591,7 +641,7 @@ describe("IcRadio visual regression tests in high contrast mode", () => {
mount();
cy.checkHydrated(RADIO_GROUP_SELECTOR);
- cy.get(RADIO_SELECTOR).eq(1).shadow().find(".container").click();
+ cy.get(RADIO_SELECTOR).eq(1).shadow().find(CONTAINER_CLASS).click();
cy.compareSnapshot({
name: "conditional-dynamic-high-contrast",
diff --git a/packages/react/src/component-tests/IcRadio/IcRadioTestData.tsx b/packages/react/src/component-tests/IcRadio/IcRadioTestData.tsx
index 8714175b07..452c6bfae8 100644
--- a/packages/react/src/component-tests/IcRadio/IcRadioTestData.tsx
+++ b/packages/react/src/component-tests/IcRadio/IcRadioTestData.tsx
@@ -413,3 +413,68 @@ export const InAForm = () => {
);
};
+
+export const RadioGroupInAdditionalField = (): JSX.Element => (
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export const StaticChildRadioGroup = (): JSX.Element => (
+
+
+
+
+
+
+
+
+
+);
diff --git a/packages/react/src/stories/ic-radio-group.stories.mdx b/packages/react/src/stories/ic-radio-group.stories.mdx
index 007d89fa86..1f05903b90 100644
--- a/packages/react/src/stories/ic-radio-group.stories.mdx
+++ b/packages/react/src/stories/ic-radio-group.stories.mdx
@@ -112,18 +112,30 @@ import { useState, useEffect, useRef } from "react";
-
+ helperText="Child Group Helper Text"
+ label="Children"
+ name="radio-group-2"
+ >
+
+
+
-
+ Hello world
@@ -152,14 +160,32 @@ import { useState, useEffect, useRef } from "react";