Skip to content
Open
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
a82ff0f
feat: add samples
GDamyanov Aug 25, 2025
80a5144
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Aug 25, 2025
5b7bacf
refactor: refactor tests
GDamyanov Aug 25, 2025
16d76ac
refactor: refactor tests
GDamyanov Aug 25, 2025
4594bba
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Aug 27, 2025
a86b4e4
feat: extend formValidity
GDamyanov Aug 27, 2025
f3d457e
Merge branch 'controls-check-form-validity-samples' of https://github…
GDamyanov Aug 27, 2025
fef162a
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Aug 28, 2025
ca2dc95
feat: implement controls formValidity
GDamyanov Aug 28, 2025
3210e54
test: add test suites
GDamyanov Aug 28, 2025
a230b74
test: add tests
GDamyanov Aug 28, 2025
63e706c
test: add tests
GDamyanov Aug 29, 2025
a2f4ac6
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Aug 29, 2025
1ed9145
feat: add form validity for ui5-file-uploader
GDamyanov Aug 29, 2025
da81009
feat: add validation messages
GDamyanov Sep 1, 2025
1e0c4eb
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 1, 2025
e5021e4
test: test
GDamyanov Sep 4, 2025
95f8595
test: fix tests
GDamyanov Sep 4, 2025
1e87f8c
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 4, 2025
1483322
refactor: edin param as optional
GDamyanov Sep 4, 2025
81fbcdc
Merge branch 'controls-check-form-validity-samples' of https://github…
GDamyanov Sep 4, 2025
f4f87bf
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 9, 2025
beaca0f
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 9, 2025
495cdee
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 11, 2025
caca4fe
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 11, 2025
bb7718b
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 12, 2025
5847e1c
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 12, 2025
d2795b6
test: extract formValidity in Cypress function
GDamyanov Sep 12, 2025
574e6cc
fix: update value on input and fix tests
GDamyanov Sep 23, 2025
0728b63
test: added tests
GDamyanov Sep 23, 2025
14611a9
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 24, 2025
3aa8cf0
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 24, 2025
968120b
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 24, 2025
bf996aa
fix: update value only on change
GDamyanov Sep 24, 2025
392f618
Merge branch 'main' into controls-check-form-validity-samples
GDamyanov Sep 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
200 changes: 199 additions & 1 deletion packages/main/cypress/specs/DatePicker.cy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1678,6 +1678,204 @@ describe("Legacy date customization and Islamic calendar type", () => {
});
});

describe("Validation inside a form ", () => {
it("has correct validity for valueMissing", () => {
cy.mount(
<form>
<DatePicker id="datePicker1" required={true}></DatePicker>
<button type="submit" id="submitBtn" > Submits forms </button>
</form>
);

cy.get("form")
.then($item => {
$item.get(0).addEventListener("submit", cy.stub().as("submit"));
});

cy.get("#submitBtn")
.realClick();

cy.get("@submit")
.should("have.not.been.called");

cy.get("[ui5-date-picker]")
.as("datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.valueMissing, "Required DatePicker without value should have formValidity with valueMissing=true").to.be.true;
expect(datePicker.validity.valueMissing, "Required DatePicker without value should have validity with valueMissing=true").to.be.true;
expect(datePicker.validity.valid, "Required DatePicker without value should have validity with valid=false").to.be.false;
expect(datePicker.checkValidity(), "Required DatePicker without value fail validity check").to.be.false;
expect(datePicker.reportValidity(), "Required DatePicker without value should fail report validity").to.be.false;
});

cy.get("#datePicker1:invalid")
.should("exist", "Required DatePicker without value should have :invalid CSS class");

cy.get("@datePicker")
.ui5DatePickerTypeDate("Apr 12, 2024");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.valueMissing, "Required DatePicker with value should have formValidity with valueMissing=false").to.be.false;
expect(datePicker.validity.valueMissing, "Required DatePicker with value should have validity with valueMissing=false").to.be.false;
expect(datePicker.validity.valid, "Required DatePicker with value have validity with valid=true").to.be.true;
expect(datePicker.checkValidity(), "Required DatePicker with value pass validity check").to.be.true;
expect(datePicker.reportValidity(), "Required DatePicker with value pass report validity").to.be.true;
});

cy.get("#datePicker1:invalid").should("not.exist", "Required DatePicker with value should not have :invalid CSS class");
});

it("has correct validity for patternMismatch", () => {
cy.mount(
<form>
<DatePicker id="datePicker2" required={true} valueFormat="MMM d, y"></DatePicker>
<button type="submit" id="submitBtn" > Submits forms </button>
</form>
);

cy.get("form")
.then($item => {
$item.get(0).addEventListener("submit", cy.stub().as("submit"));
});

cy.get("#datePicker2")
.as("datePicker")
.ui5DatePickerTypeDate("Test 33, 2024");

cy.get("#submitBtn")
.realClick();

cy.get("@submit")
.should("have.not.been.called");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.patternMismatch, "DatePicker without correct formatted value should have formValidity with patternMismatch=true").to.be.true;
expect(datePicker.validity.patternMismatch, "DatePicker without correct formatted value should have validity with patternMismatch=true").to.be.true;
expect(datePicker.validity.valid, "DatePicker without correct formatted value should have validity with valid=false").to.be.false;
expect(datePicker.checkValidity(), "DatePicker without correct formatted value fail validity check").to.be.false;
expect(datePicker.reportValidity(), "DatePicker without correct formatted value should fail report validity").to.be.false;
});

cy.get("#datePicker2:invalid")
.should("exist", "DatePicker without correct formatted value should have :invalid CSS class");

cy.get("@datePicker")
.ui5DatePickerTypeDate("Apr 12, 2024");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.patternMismatch, "DatePicker with correct formatted value should have formValidity with patternMismatch=false").to.be.false;
expect(datePicker.validity.patternMismatch, "DatePicker with correct formatted value should have validity with patternMismatch=false").to.be.false;
expect(datePicker.validity.valid, "DatePicker with correct formatted value have validity with valid=true").to.be.true;
expect(datePicker.checkValidity(), "DatePicker with correct formatted value pass validity check").to.be.true;
expect(datePicker.reportValidity(), "DatePicker with correct formatted value pass report validity").to.be.true;
});

cy.get("#datePicker2:invalid")
.should("not.exist", "DatePicker with correct formatted value should not have :invalid CSS class");
});

it("has correct validity for rangeUnderflow", () => {
cy.mount(
<form method="get">
<DatePicker id="datePicker3" minDate="Jan 10, 2024" valueFormat="MMM d, y"></DatePicker>
<button type="submit" id="submitBtn">Submits forms</button>
</form>
);

cy.get("form")
.then($item => {
$item.get(0).addEventListener("submit", (e) => e.preventDefault());
});

cy.get("#datePicker3")
.as("datePicker")
.ui5DatePickerTypeDate("Apr 10, 2020");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.rangeUnderflow, "DatePicker with value below minDate should have formValidity with rangeUnderflow=true").to.be.true;
expect(datePicker.validity.rangeUnderflow, "DatePicker with value below minDate should have validity with rangeUnderflow=true").to.be.true;
expect(datePicker.validity.valid, "DatePicker with value below minDate should have validity with valid=false").to.be.false;
expect(datePicker.checkValidity(), "DatePicker with value below minDate should fail validity check").to.be.false;
expect(datePicker.reportValidity(), "DatePicker with value below minDate should fail report validity").to.be.false;
});

cy.get("#datePicker3:invalid")
.should("exist", "DatePicker with value below minDate should have :invalid CSS class");

cy.get("@datePicker")
.ui5DatePickerTypeDate("Jan 20, 2024");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.rangeUnderflow, "DatePicker with value above minDate should have formValidity with rangeUnderflow=false").to.be.false;
expect(datePicker.validity.rangeUnderflow, "DatePicker with value above minDate should have validity with rangeUnderflow=false").to.be.false;
expect(datePicker.validity.valid, "DatePicker with value above minDate should have validity with valid=true").to.be.true;
expect(datePicker.checkValidity(), "DatePicker with value above minDate should pass validity check").to.be.true;
expect(datePicker.reportValidity(), "DatePicker with value above minDate should pass report validity").to.be.true;
});

cy.get("#datePicker3:invalid")
.should("not.exist", "DatePicker with value above minDate should not have :invalid CSS class");
});


it("has correct validity for rangeOverflow", () => {
cy.mount(
<form>
<DatePicker id="datePicker3" maxDate="Jan 10, 2024" valueFormat="MMM d, y"></DatePicker>
<button type="submit" id="submitBtn">Submits forms</button>
</form>
);

cy.get("form")
.then($item => {
$item.get(0).addEventListener("submit", (e) => e.preventDefault());
});

cy.get("#datePicker3")
.ui5DatePickerTypeDate("Jan 14, 2024");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.rangeOverflow, "DatePicker with value above maxDate should have formValidity with rangeOverflow=true").to.be.true;
expect(datePicker.validity.rangeOverflow, "DatePicker with value above maxDate should have validity with rangeOverflow=true").to.be.true;
expect(datePicker.validity.valid, "DatePicker with value above maxDate should have validity with valid=false").to.be.false;
expect(datePicker.checkValidity(), "DatePicker with value above maxDate should fail validity check").to.be.false;
expect(datePicker.reportValidity(), "DatePicker with value above maxDate should fail report validity").to.be.false;
});

cy.get("#datePicker3:invalid")
.should("exist", "DatePicker with value above maxDate should have :invalid CSS class");

cy.get("@datePicker")
.ui5DatePickerTypeDate("Jan 5, 2024");

cy.get("@datePicker")
.then($el => {
const datePicker = $el[0] as DatePicker;
expect(datePicker.formValidity.rangeOverflow, "DatePicker with value below maxDate should have formValidity with rangeOverflow=false").to.be.false;
expect(datePicker.validity.rangeOverflow, "DatePicker with value below maxDate should have validity with rangeOverflow=false").to.be.false;
expect(datePicker.validity.valid, "DatePicker with value below maxDate should have validity with valid=true").to.be.true;
expect(datePicker.checkValidity(), "DatePicker with value below maxDate should pass validity check").to.be.true;
expect(datePicker.reportValidity(), "DatePicker with value below maxDate should pass report validity").to.be.true;
});

cy.get("#datePicker3:invalid")
.should("not.exist", "DatePicker with value below maxDate should not have :invalid CSS class");
});
});

describe("Accessibility", () => {
it("picker popover accessible name with external label", () => {
const LABEL = "Deadline";
Expand Down Expand Up @@ -1757,4 +1955,4 @@ describe("Accessibility", () => {
.find("span#descr")
.should("have.text", DESCRIPTION);
});
});
});
Loading
Loading