diff --git a/cypress.config.js b/cypress.config.js index 801173b3..812e1f15 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -1,3 +1,5 @@ +const fs = require("fs"); +const path = require("path"); const { defineConfig } = require("cypress"); const { prepareAudit, lighthouse } = require("@cypress-audit/lighthouse"); const { pa11y } = require("@cypress-audit/pa11y"); @@ -45,6 +47,22 @@ module.exports = defineConfig({ console.log("found %d files, first one %s", list.length, list[0]); return list[0]; + }, + clearDownloads(folder) { + if (!folder) { + throw new Error("Missing downloads folder"); + } + + if (!fs.existsSync(folder)) { + fs.mkdirSync(folder, { recursive: true }); + return null; + } + + fs.readdirSync(folder).forEach((file) => { + fs.unlinkSync(path.join(folder, file)); + }); + + return null; } }); // It's IMPORTANT to return the config object diff --git a/tests/e2e/specs/ComplexScreen.spec.js b/tests/e2e/specs/ComplexScreen.spec.js index 551f4589..cf43fd4e 100644 --- a/tests/e2e/specs/ComplexScreen.spec.js +++ b/tests/e2e/specs/ComplexScreen.spec.js @@ -1,30 +1,46 @@ +/* eslint-disable camelcase, no-param-reassign */ import moment from "moment"; describe("Complex screen", () => { - const today = new Date(); - today.setUTCHours(0); - today.setUTCMinutes(0); - today.setUTCSeconds(0); - today.setUTCMilliseconds(0); - const today_date = moment(today).format("YYYY-MM-DD"); - - const now = new Date(); - now.setUTCHours(8); - now.setUTCMinutes(15); - now.setUTCSeconds(0); - now.setUTCMilliseconds(0); + const today_date = moment.utc().format("YYYY-MM-DD"); + const now = moment.utc().hours(8).minutes(15).seconds(0).milliseconds(0); const files = { page1: [], page2: [] }; + function assertPreviewDataStable(expectedData) { + cy.get("#screen-builder-container").should(($div) => { + const data = JSON.parse(JSON.stringify($div[0].__vue__.previewData)); + const removeRowId = (obj) => { + if (obj && typeof obj === "object") { + if (Array.isArray(obj)) { + obj.forEach(removeRowId); + } else { + delete obj.row_id; + Object.values(obj).forEach(removeRowId); + } + } + }; + removeRowId(data); + expect(data).to.eql(expectedData); + }); + } + + function goToNextPage(selector) { + cy.get( + "[data-cy=preview-content] button:contains(Page Navigation >>)" + ).click(); + cy.get(selector).first().scrollIntoView().should("be.visible"); + } + before(() => { cy.visit("/"); cy.window().then((win) => { // Add request-id header - const requestIdMeta = window.document.createElement("meta"); + const requestIdMeta = win.document.createElement("meta"); requestIdMeta.setAttribute("name", "request-id"); requestIdMeta.setAttribute("content", "1"); win.document.head.appendChild(requestIdMeta); @@ -35,7 +51,11 @@ describe("Complex screen", () => { }); beforeEach(() => { - cy.loadFromJson("complex_screen.json"); + files.page1 = []; + files.page2 = []; + cy.window().then((win) => { + win.ProcessMaker.user.timezone = "UTC"; + }); cy.intercept( "GET", "/api/1.0/requests/1/files?id=1", @@ -46,9 +66,10 @@ describe("Complex screen", () => { "/api/1.0/requests/1/files?id=2", JSON.stringify({ data: files.page2 }) ); + cy.loadFromJson("complex_screen.json"); }); - it("Fill page 1", () => { + it("fills all pages", () => { cy.get("[data-cy=mode-preview]").click(); cy.get("[data-cy=preview-content] [name=form_input_1]").type("12345678"); cy.get("[data-cy=preview-content] [name=form_input_1]").should( @@ -126,7 +147,7 @@ describe("Complex screen", () => { message: "The file was uploaded.", fileUploadId: 1 }) - ); + ).as("uploadPage1"); cy.uploadFile( '[data-cy=preview-content] [data-cy="screen-field-page1"] input[type=file]', "avatar.jpeg", @@ -137,56 +158,51 @@ describe("Complex screen", () => { file_name: "avatar.jpeg" }); - cy.assertPreviewData( - { - form_input_1: "12345678", - form_text_area_1: "Hello!", - form_select_list_1: "a", - form_checkbox_1: true, - form_date_picker_1: today_date, - form_date_picker_2: now.toISOString(), - loop: [ - { - form_input_2: "input in loop 1" - }, - { - form_input_2: "input in loop 2" - }, - { - form_input_2: "input in loop 3" - } - ], - form_record_list_1: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - page1: 1, - form_input_5: "", - form_select_list_4: null, - form_date_picker_7: null, - form_record_list_3: null, - page2: null, - form_text_area_4: "", - form_checkbox_4: false, - form_date_picker_8: null, - form_input_4: "", - form_date_picker_5: null, - form_text_area_3: "", - form_date_picker_6: null, - form_select_list_3: null, - form_checkbox_3: false - }, - true - ); - }); + cy.wait("@uploadPage1"); + assertPreviewDataStable({ + form_input_1: "12345678", + form_text_area_1: "Hello!", + form_select_list_1: "a", + form_checkbox_1: true, + form_date_picker_1: today_date, + form_date_picker_2: now.toISOString(), + loop: [ + { + form_input_2: "input in loop 1" + }, + { + form_input_2: "input in loop 2" + }, + { + form_input_2: "input in loop 3" + } + ], + form_record_list_1: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + page1: 1, + form_input_5: "", + form_select_list_4: null, + form_date_picker_7: null, + form_record_list_3: null, + page2: null, + form_text_area_4: "", + form_checkbox_4: false, + form_date_picker_8: null, + form_input_4: "", + form_date_picker_5: null, + form_text_area_3: "", + form_date_picker_6: null, + form_select_list_3: null, + form_checkbox_3: false + }); - it("Fill page 2", () => { + // Page 2 // Next Page - cy.get( - "[data-cy=preview-content] button:contains(Page Navigation >>)" - ).click(); + goToNextPage("[data-cy=preview-content] [name=form_input_5]"); cy.get("[data-cy=preview-content] [name=form_input_5]").type( "form input 5" @@ -261,7 +277,7 @@ describe("Complex screen", () => { message: "The file was uploaded.", fileUploadId: 1 }) - ); + ).as("uploadPage2"); cy.uploadFile( '[data-cy=preview-content] [data-cy="screen-field-page2"] input[type=file]', "avatar.jpeg", @@ -271,60 +287,55 @@ describe("Complex screen", () => { files.page2.push({ file_name: "avatar.jpeg" }); - cy.assertPreviewData( - { - form_input_1: "12345678", - form_text_area_1: "Hello!", - form_select_list_1: "a", - form_checkbox_1: true, - form_date_picker_1: today_date, - form_date_picker_2: now.toISOString(), - loop: [ - { - form_input_2: "input in loop 1", - form_input_6: "input 6 in loop 1" - }, - { - form_input_2: "input in loop 2", - form_input_6: "input 6 in loop 2" - }, - { - form_input_2: "input in loop 3", - form_input_6: "input 6 in loop 3" - } - ], - form_record_list_1: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - page1: 1, - form_input_5: "form input 5", - form_select_list_4: "foo", - form_date_picker_7: now.toISOString(), - form_record_list_3: null, - page2: 1, - form_text_area_4: "form text area 4", - form_checkbox_4: true, - form_date_picker_8: now.toISOString(), - form_input_4: "form input 4", - form_date_picker_5: today_date, - form_text_area_3: "form text area 3", - form_date_picker_6: now.toISOString(), - form_select_list_3: null, - form_checkbox_3: true - }, - true - ); - }); + cy.wait("@uploadPage2"); + assertPreviewDataStable({ + form_input_1: "12345678", + form_text_area_1: "Hello!", + form_select_list_1: "a", + form_checkbox_1: true, + form_date_picker_1: today_date, + form_date_picker_2: now.toISOString(), + loop: [ + { + form_input_2: "input in loop 1", + form_input_6: "input 6 in loop 1" + }, + { + form_input_2: "input in loop 2", + form_input_6: "input 6 in loop 2" + }, + { + form_input_2: "input in loop 3", + form_input_6: "input 6 in loop 3" + } + ], + form_record_list_1: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + page1: 1, + form_input_5: "form input 5", + form_select_list_4: "foo", + form_date_picker_7: now.toISOString(), + form_record_list_3: null, + page2: 1, + form_text_area_4: "form text area 4", + form_checkbox_4: true, + form_date_picker_8: now.toISOString(), + form_input_4: "form input 4", + form_date_picker_5: today_date, + form_text_area_3: "form text area 3", + form_date_picker_6: now.toISOString(), + form_select_list_3: null, + form_checkbox_3: true + }); - it("Fill page 3", () => { + // Page 3 let loop; // Next Page - cy.get( - "[data-cy=preview-content] button:contains(Page Navigation >>)" - ).click(); + goToNextPage("[data-cy=preview-content] [name=form_input_3]"); // FILL LOOP 1 loop = 0; @@ -625,113 +636,107 @@ describe("Complex screen", () => { .clear() .type("2000"); - cy.assertPreviewData( - { - form_input_1: "12345678", - form_text_area_1: "Hello!", - form_select_list_1: "a", - form_checkbox_1: true, - form_date_picker_1: today_date, - form_date_picker_2: now.toISOString(), - loop: [ - { - form_input_2: "input in loop 1", - form_input_6: "input 6 in loop 1", - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000 - }, - { - form_input_2: "input in loop 2", - form_input_6: "input 6 in loop 2", - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000 - }, - { - form_input_2: "input in loop 3", - form_input_6: "input 6 in loop 3", - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000 - }, - { - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000 - } - ], - form_record_list_1: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - page1: 1, - form_input_5: "form input 5", - form_select_list_4: "foo", - form_date_picker_7: now.toISOString(), - form_record_list_3: null, - page2: 1, - form_text_area_4: "form text area 4", - form_checkbox_4: true, - form_date_picker_8: now.toISOString(), - form_input_4: "form input 4", - form_date_picker_5: today_date, - form_text_area_3: "form text area 3", - form_date_picker_6: now.toISOString(), - form_select_list_3: null, - form_checkbox_3: true - }, - true - ); - }); + assertPreviewDataStable({ + form_input_1: "12345678", + form_text_area_1: "Hello!", + form_select_list_1: "a", + form_checkbox_1: true, + form_date_picker_1: today_date, + form_date_picker_2: now.toISOString(), + loop: [ + { + form_input_2: "input in loop 1", + form_input_6: "input 6 in loop 1", + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000 + }, + { + form_input_2: "input in loop 2", + form_input_6: "input 6 in loop 2", + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000 + }, + { + form_input_2: "input in loop 3", + form_input_6: "input 6 in loop 3", + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000 + }, + { + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000 + } + ], + form_record_list_1: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + page1: 1, + form_input_5: "form input 5", + form_select_list_4: "foo", + form_date_picker_7: now.toISOString(), + form_record_list_3: null, + page2: 1, + form_text_area_4: "form text area 4", + form_checkbox_4: true, + form_date_picker_8: now.toISOString(), + form_input_4: "form input 4", + form_date_picker_5: today_date, + form_text_area_3: "form text area 3", + form_date_picker_6: now.toISOString(), + form_select_list_3: null, + form_checkbox_3: true + }); - it("Fill page 4", () => { + // Page 4 // Next Page - cy.get( - "[data-cy=preview-content] button:contains(Page Navigation >>)" - ).click(); + goToNextPage("[data-cy=preview-content] [name=form_input_1]"); cy.get("[data-cy=preview-content] [name=form_input_1]") .clear() .type("form input 1"); @@ -761,15 +766,9 @@ describe("Complex screen", () => { cy.get("[data-cy=preview-content] [name=form_checkbox_6]").should( "be.checked" ); - cy.get( - '[data-cy=preview-content] [id^="form_select_list_3-b-"]' - ).click(); - cy.get( - '[data-cy=preview-content] [id^="form_select_list_4-b-"]' - ).click(); // Select b - cy.get( - '[data-cy=preview-content] [id^="form_select_list_4-c-"]' - ).click(); // Select c + cy.get('[data-cy=preview-content] [id^="form_select_list_3-b-"]').click(); + cy.get('[data-cy=preview-content] [id^="form_select_list_4-b-"]').click(); // Select b + cy.get('[data-cy=preview-content] [id^="form_select_list_4-c-"]').click(); // Select c // record list - complete new fields cy.get( "[data-cy=preview-content] [data-cy=screen-field-form_record_list_1] [data-cy=edit-row]" @@ -830,128 +829,125 @@ describe("Complex screen", () => { file_name: "avatar.jpeg" }); cy.wait("@uploadFile"); - cy.assertPreviewData( - { - form_input_1: "form input 1", - form_text_area_1: "Hello!", - form_select_list_1: "b", - form_checkbox_1: false, - form_date_picker_1: today_date, - form_date_picker_2: now.toISOString(), - loop: [ - { - form_input_2: "input in loop 1", - form_input_6: "input 6 in loop 1", - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000, - form_input_9: "form input 1" - }, - { - form_input_2: "input in loop 2", - form_input_6: "input 6 in loop 2", - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000, - form_input_9: "form input 1" - }, - { - form_input_2: "input in loop 3", - form_input_6: "input 6 in loop 3", - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000, - form_input_9: "form input 1" - }, - { - form_input_3: "info@processmaker.com", - form_text_area_2: "form text area 2", - form_select_list_2: "2", - form_checkbox_2: false, - form_date_picker_3: today_date, - form_date_picker_4: now.toISOString(), - form_record_list_2: [ - { - first_name: "Thomas A.", - last_name: "Anderson" - } - ], - season: 2000, - form_input_9: "form input 1" - } - ], - form_record_list_1: [ - { - first_name: "Thomas A.", - last_name: "Anderson", - email: "thomas@processmaker.com", - url: "https://thomas.processmaker.com" - } - ], - page1: 1, - form_input_5: 123.45, - form_select_list_4: ["b", "c"], - form_date_picker_7: now.toISOString(), - form_record_list_3: null, - page2: 1, - form_text_area_4: "form text area 4", - form_checkbox_4: true, - form_date_picker_8: now.toISOString(), - form_input_4: 4.21, - form_date_picker_5: today_date, - form_text_area_3: "form text area 3", - form_date_picker_6: now.toISOString(), - form_select_list_3: "b", - form_checkbox_3: true, - form_input_2: 123, - form_input_6: moment(now).format("YYYY-MM-DD HH:mm"), - form_text_area_2: "", - form_select_list_2: [], // form_select_list_2 is a disabled multi select list, its default value must an empty array - form_input_3: 12345, - form_input_7: moment(now).format("YYYY-MM-DD"), - form_input_8: "password", - form_checkbox_5: true, - form_checkbox_2: true, - form_checkbox_6: true, - form_checkbox_7: false, - form_date_picker_3: null, - form_checkbox_8: true, - form_date_picker_4: null, - nested_file: 1, - form_checkbox_9: true, - form_checkbox_10: true - }, - true - ); + assertPreviewDataStable({ + form_input_1: "form input 1", + form_text_area_1: "Hello!", + form_select_list_1: "b", + form_checkbox_1: false, + form_date_picker_1: today_date, + form_date_picker_2: now.toISOString(), + loop: [ + { + form_input_2: "input in loop 1", + form_input_6: "input 6 in loop 1", + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000, + form_input_9: "form input 1" + }, + { + form_input_2: "input in loop 2", + form_input_6: "input 6 in loop 2", + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000, + form_input_9: "form input 1" + }, + { + form_input_2: "input in loop 3", + form_input_6: "input 6 in loop 3", + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000, + form_input_9: "form input 1" + }, + { + form_input_3: "info@processmaker.com", + form_text_area_2: "form text area 2", + form_select_list_2: "2", + form_checkbox_2: false, + form_date_picker_3: today_date, + form_date_picker_4: now.toISOString(), + form_record_list_2: [ + { + first_name: "Thomas A.", + last_name: "Anderson" + } + ], + season: 2000, + form_input_9: "form input 1" + } + ], + form_record_list_1: [ + { + first_name: "Thomas A.", + last_name: "Anderson", + email: "thomas@processmaker.com", + url: "https://thomas.processmaker.com" + } + ], + page1: 1, + form_input_5: 123.45, + form_select_list_4: ["b", "c"], + form_date_picker_7: now.toISOString(), + form_record_list_3: null, + page2: 1, + form_text_area_4: "form text area 4", + form_checkbox_4: true, + form_date_picker_8: now.toISOString(), + form_input_4: 4.21, + form_date_picker_5: today_date, + form_text_area_3: "form text area 3", + form_date_picker_6: now.toISOString(), + form_select_list_3: "b", + form_checkbox_3: true, + form_input_2: 123, + form_input_6: moment(now).format("YYYY-MM-DD HH:mm"), + form_text_area_2: "", + form_select_list_2: [], // form_select_list_2 is a disabled multi select list, its default value must an empty array + form_input_3: 12345, + form_input_7: moment(now).format("YYYY-MM-DD"), + form_input_8: "password", + form_checkbox_5: true, + form_checkbox_2: true, + form_checkbox_6: true, + form_checkbox_7: false, + form_date_picker_3: null, + form_checkbox_8: true, + form_date_picker_4: null, + nested_file: 1, + form_checkbox_9: true, + form_checkbox_10: true + }); }); }); diff --git a/tests/e2e/specs/DatePicker.spec.js b/tests/e2e/specs/DatePicker.spec.js index f2227f37..e59681e5 100644 --- a/tests/e2e/specs/DatePicker.spec.js +++ b/tests/e2e/specs/DatePicker.spec.js @@ -2,6 +2,10 @@ import moment from "moment-timezone"; moment.tz.setDefault("UTC"); +function utcIsoFromInputDate(mmDdYyyy) { + return moment.utc(mmDdYyyy, "MM/DD/YYYY").toISOString(); +} + describe("Date Picker", () => { beforeEach(() => { cy.visit("/"); @@ -217,9 +221,9 @@ describe("Date Picker", () => { form_date_picker_2: null }); }); - it("Date picker with maxDate greater than first datepicker should return null data", () => { - const date = moment(new Date()).format("MM/DD/YYYY"); - const dateAfter = moment(new Date()).add(1, "days").format("MM/DD/YYYY"); + it("Date picker with maxDate less than entered date should return null data", () => { + const date = moment().format("MM/DD/YYYY"); + const dateAfter = moment().add(1, "days").format("MM/DD/YYYY"); cy.get("[data-cy=controls-FormDatePicker]").drag( "[data-cy=screen-drop-zone]", @@ -234,16 +238,16 @@ describe("Date Picker", () => { cy.get("[data-cy=screen-element-container]").last().click(); cy.setMultiselect("[data-cy=inspector-dataFormat]", "Date"); cy.get("[data-cy=accordion-Configuration]").click(); - cy.get("[data-cy=inspector-minDate]") + cy.get("[data-cy=inspector-maxDate]") .clear() .type("{{}{{}form_date_picker_1{}}{}}"); cy.get("[data-cy=mode-preview]").click(); cy.get( - '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_1"]' + '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_1"] .vdpComponent' ).type(date); cy.get("[data-cy=preview-content]").click(); cy.get( - '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_2"]' + '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_2"] .vdpComponent' ).type(dateAfter); cy.get( '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_2"]' @@ -251,10 +255,15 @@ describe("Date Picker", () => { cy.get( '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_2"] input' ).click(); + cy.get("[data-cy=preview-content]").click(); - cy.assertPreviewData({ - form_date_picker_1: moment(date).format("YYYY-MM-DD"), + const expectedPreviewData = { + form_date_picker_1: moment.utc(date, "MM/DD/YYYY").format("YYYY-MM-DD"), form_date_picker_2: null + }; + cy.get("#screen-builder-container").should(($div) => { + const data = JSON.parse(JSON.stringify($div[0].__vue__.previewData)); + expect(data).to.eql(expectedPreviewData); }); }); @@ -395,7 +404,7 @@ describe("Date Picker", () => { cy.get("[data-cy=preview-content]").click(); cy.assertPreviewData({ - form_date_picker_1: moment(date).toISOString(), + form_date_picker_1: utcIsoFromInputDate(date), form_date_picker_2: null }); }); @@ -430,8 +439,8 @@ describe("Date Picker", () => { ).type(dateSame); cy.get("[data-cy=preview-content]").click(); cy.assertPreviewData({ - form_date_picker_1: moment(date).toISOString(), - form_date_picker_2: moment(dateSame).toISOString() + form_date_picker_1: utcIsoFromInputDate(date), + form_date_picker_2: utcIsoFromInputDate(dateSame) }); }); it("Date time picker validate when the user enter a string instead of a valid date", () => { @@ -493,7 +502,7 @@ describe("Date Picker", () => { '[data-cy=preview-content] [data-cy="screen-field-form_date_picker_2"] .vdpComponent' ).click(); cy.assertPreviewData({ - form_date_picker_1: moment(date).toISOString(), + form_date_picker_1: utcIsoFromInputDate(date), form_date_picker_2: null }); }); diff --git a/tests/e2e/specs/DefaultValues.spec.js b/tests/e2e/specs/DefaultValues.spec.js index db94f8b0..0f04e78f 100644 --- a/tests/e2e/specs/DefaultValues.spec.js +++ b/tests/e2e/specs/DefaultValues.spec.js @@ -82,27 +82,37 @@ describe("Default values", () => { }); it("Javascript default value", () => { + const expectedPreviewData = { + name: "world", + form_input_1: "hello world" + }; + cy.visit("/"); cy.openAcordeon("collapse-2"); - cy.setPreviewDataInput({ name: "world" }); cy.get("[data-cy=controls-FormInput]").drag("[data-cy=screen-drop-zone]", { position: "bottom" }); cy.get("[data-cy=screen-element-container]").click(); cy.get("[data-cy=accordion-Advanced]").click(); cy.get("[data-cy=inspector-defaultValue-js]").click(); + cy.get("[data-cy=inspector-defaultValue-jsValue]").should("be.visible"); cy.setVueComponentValue( "[data-cy=inspector-defaultValue-jsValue]", "return `hello ${this.name}`;" ); + cy.setPreviewDataInput({ name: "world" }); + cy.get("#screen-builder-container").should(($div) => { + const previewInput = JSON.parse($div[0].__vue__.previewInput); + expect(previewInput.name).to.eq("world"); + }); cy.get("[data-cy=mode-preview]").click(); cy.get("[data-cy=preview-content] [name=form_input_1]").should( "have.value", "hello world" ); - cy.assertPreviewData({ - name: "world", - form_input_1: "hello world" + cy.get("#screen-builder-container").should(($div) => { + const data = JSON.parse(JSON.stringify($div[0].__vue__.previewData)); + expect(data).to.eql(expectedPreviewData); }); }); it("Initially checked checkbox", () => { diff --git a/tests/e2e/specs/FileDownload.spec.js b/tests/e2e/specs/FileDownload.spec.js index 6febe362..c784039d 100644 --- a/tests/e2e/specs/FileDownload.spec.js +++ b/tests/e2e/specs/FileDownload.spec.js @@ -2,24 +2,16 @@ import { validateImage } from "../support/utils"; const downloadsFolder = Cypress.config("downloadsFolder"); -function findTheFile(fileName) { - cy.log("**find the image**"); - const mask = `${downloadsFolder}/*.jpeg`; - - cy.task("findFiles", mask).then((foundImage) => { - expect(foundImage).to.be.a("string"); - cy.log(`found image ${foundImage}`); - cy.log("**confirm downloaded image**"); - validateImage(fileName); - }); +function confirmDownloadedFile(fileName) { + validateImage(fileName); } describe("File Download", () => { beforeEach(function () { + cy.task("clearDownloads", downloadsFolder); cy.visit("/"); cy.window().then((win) => { - // Add request-id header - const requestIdMeta = window.document.createElement("meta"); + const requestIdMeta = win.document.createElement("meta"); requestIdMeta.setAttribute("name", "request-id"); requestIdMeta.setAttribute("content", "1"); win.document.head.appendChild(requestIdMeta); @@ -48,7 +40,6 @@ describe("File Download", () => { it("Can download a single file", () => { uploadSingleFile(); - // Mock file download cy.intercept("/api/1.0/files/1/contents", { fixture: "avatar.jpeg" }).as( "download" ); @@ -57,17 +48,15 @@ describe("File Download", () => { cy.get( '.row > :nth-child(1) > :nth-child(1) > :nth-child(1) > :nth-child(2) > [data-cy="1-avatar"] > .btn' ).click(); - cy.wait("@download").then(() => { - findTheFile("avatar.jpeg"); - }); + cy.wait("@download"); + confirmDownloadedFile("avatar.jpeg"); // A Loop file is downloadable cy.get( '[icon="fas fa-redo"] > :nth-child(1) > .container-fluid > :nth-child(1) > .page > :nth-child(1) > :nth-child(1) > :nth-child(2) > [data-cy="1-avatar"] > .btn' ).click(); - cy.wait("@download").then(() => { - findTheFile("avatar.jpeg"); - }); + cy.wait("@download"); + confirmDownloadedFile("avatar.jpeg"); // A Record List file is downloadable cy.get("[data-cy=add-row]").click(); @@ -76,9 +65,8 @@ describe("File Download", () => { ) .eq(0) .click(); - cy.wait("@download").then(() => { - findTheFile("avatar.jpeg"); - }); + cy.wait("@download"); + confirmDownloadedFile("avatar.jpeg"); }); it("Lists multiple files in download control", () => { @@ -100,30 +88,29 @@ describe("File Download", () => { it("Can download multiple files", () => { uploadMultiFile(); - // Mock the first file download cy.intercept("/api/1.0/files/1/contents", { fixture: "avatar.jpeg" }).as( "download" ); - // Mock the second file download cy.intercept("/api/1.0/files/2/contents", { fixture: "file1.jpeg" }).as( "downloadFile1" ); - cy.wait(1000); + + cy.get('[data-cy="1-avatar"]').should("contain.text", "avatar.jpeg"); + cy.get('[data-cy="2-file1"]').should("contain.text", "file1.jpeg"); + // The first file should be downloaded cy.get( `.row > :nth-child(1) > :nth-child(1) > [icon="fas fa-redo"] > :nth-child(1) > .container-fluid > :nth-child(1) > .page > :nth-child(1) > :nth-child(1) > :nth-child(2) > [data-cy="1-avatar"] > .btn` ).click(); - cy.wait("@download").then(() => { - findTheFile("avatar.jpeg"); - }); + cy.wait("@download"); + confirmDownloadedFile("avatar.jpeg"); // The second file should be downloaded cy.get( '.row > :nth-child(1) > :nth-child(1) > [icon="fas fa-redo"] > :nth-child(2) > .container-fluid > :nth-child(1) > .page > :nth-child(1) > :nth-child(1) > :nth-child(2) > [data-cy="2-file1"] > .btn' ).click(); - cy.wait("@downloadFile1").then(() => { - findTheFile("file1.jpeg"); - }); + cy.wait("@downloadFile1"); + confirmDownloadedFile("file1.jpeg"); // Assert Record List multiple files are downloadable cy.get("[data-cy=add-row]").click(); @@ -133,9 +120,8 @@ describe("File Download", () => { ) .eq(0) .click(); - cy.wait("@download").then(() => { - findTheFile("avatar.jpeg"); - }); + cy.wait("@download"); + confirmDownloadedFile("avatar.jpeg"); // The second file should be downloaded cy.get( @@ -143,16 +129,14 @@ describe("File Download", () => { ) .eq(0) .click(); - cy.wait("@downloadFile1").then(() => { - findTheFile("file1.jpeg"); - }); + cy.wait("@downloadFile1"); + confirmDownloadedFile("file1.jpeg"); }); }); function uploadSingleFile() { cy.loadFromJson("single_file_download.json", 0); cy.get("[data-cy=mode-preview]").click(); - // Upload single file should show the uploaded file name cy.intercept( "POST", "/api/1.0/requests/1/files", @@ -161,25 +145,24 @@ function uploadSingleFile() { fileUploadId: 1 }) ); - cy.uploadFile( - "[data-cy=preview-content] [data-cy=screen-field-file_upload_1] input[type=file]", - "avatar.jpeg", - "image/jpg" - ); - - // Mock file info cy.intercept("/api/1.0/requests/1/files?id=*", { id: 1, file_name: "avatar.jpeg", name: "avatar" }).as("getFileInfoFile1"); + cy.uploadFile( + "[data-cy=preview-content] [data-cy=screen-field-file_upload_1] input[type=file]", + "avatar.jpeg", + "image/jpg" + ); + cy.wait("@getFileInfoFile1"); + cy.get('[data-cy="1-avatar"]').should("contain.text", "avatar.jpeg"); } function uploadMultiFile() { cy.loadFromJson("multiple_file_download.json", 0); cy.get("[data-cy=mode-preview]").click(); - // Upload first file cy.intercept( "POST", "/api/1.0/requests/1/files", @@ -188,18 +171,18 @@ function uploadMultiFile() { fileUploadId: 1 }) ); + cy.intercept("/api/1.0/requests/1/files?id=1", { + id: 1, + file_name: "avatar.jpeg", + name: "avatar" + }).as("getFileInfo1"); cy.uploadFile( "[data-cy=preview-content] [data-cy=screen-field-file_upload_1] input[type=file]", "avatar.jpeg", "image/jpg" ); - cy.intercept("/api/1.0/requests/1/files?id=1", { - id: 1, - file_name: "avatar.jpeg", - name: "avatar" - }).as("getFileInfo"); + cy.wait("@getFileInfo1"); - // Upload second file cy.intercept( "POST", "/api/1.0/requests/1/files", @@ -208,14 +191,18 @@ function uploadMultiFile() { fileUploadId: 2 }) ); + cy.intercept("/api/1.0/requests/1/files?id=2", { + id: 2, + file_name: "file1.jpeg", + name: "file1" + }).as("getFileInfo2"); cy.uploadFile( "[data-cy=preview-content] [data-cy=screen-field-file_upload_1] input[type=file]", "file1.jpeg", "image/jpg" ); - cy.intercept("/api/1.0/requests/1/files?id=2", { - id: 2, - file_name: "file1.jpeg", - name: "file1" - }).as("getFileInfo"); + cy.wait("@getFileInfo2"); + + cy.get('[data-cy="1-avatar"]').should("contain.text", "avatar.jpeg"); + cy.get('[data-cy="2-file1"]').should("contain.text", "file1.jpeg"); } diff --git a/tests/e2e/specs/FormTextArea.spec.js b/tests/e2e/specs/FormTextArea.spec.js index 5f19683b..93e189e8 100644 --- a/tests/e2e/specs/FormTextArea.spec.js +++ b/tests/e2e/specs/FormTextArea.spec.js @@ -1,4 +1,11 @@ describe("Form Text Area Field", () => { + function assertPreviewDataStable(expectedData) { + cy.get("#screen-builder-container").should(($div) => { + const data = JSON.parse(JSON.stringify($div[0].__vue__.previewData)); + expect(data).to.eql(expectedData); + }); + } + it("Default properties", () => { cy.visit("/"); cy.openAcordeon("collapse-2"); @@ -8,10 +15,10 @@ describe("Form Text Area Field", () => { ); cy.get("[data-cy=screen-element-container]").click(); cy.get("[data-cy=mode-preview]").click(); - cy.get("[data-cy=preview-content] [name=form_text_area_1]").type( - "Hello World" - ); - cy.assertPreviewData({ + cy.get("[data-cy=preview-content] [name=form_text_area_1]") + .type("Hello World") + .blur(); + assertPreviewDataStable({ form_text_area_1: "Hello World" }); }); @@ -27,12 +34,16 @@ describe("Form Text Area Field", () => { cy.get("[data-cy=inspector-label]").clear().type("Comments"); cy.get("[data-cy=mode-preview]").click(); cy.get("[data-cy=preview-content]").should("contain.html", "Comments"); - cy.get("[data-cy=preview-content] [name=comments]").type( - "Lorem ipsum is placeholder text commonly used in the graphic, print, and publishing industries for previewing layouts and visual mockup." - ); - cy.assertPreviewData({ + cy.get("[data-cy=preview-content] [name=comments]") + .type( + "Lorem ipsum is placeholder text commonly used in the graphic, print, " + + "and publishing industries for previewing layouts and visual mockup." + ) + .blur(); + assertPreviewDataStable({ comments: - "Lorem ipsum is placeholder text commonly used in the graphic, print, and publishing industries for previewing layouts and visual mockup." + "Lorem ipsum is placeholder text commonly used in the graphic, print, " + + "and publishing industries for previewing layouts and visual mockup." }); }); it("Read Only", () => { @@ -46,9 +57,9 @@ describe("Form Text Area Field", () => { cy.get("[data-cy=inspector-name]").clear().type("comments"); cy.get("[data-cy=inspector-label]").clear().type("Comments"); - cy.get("[data-cy=inspector-readonly").check(); + cy.get("[data-cy=inspector-readonly]").check(); cy.get("[data-cy=mode-preview]").click(); - cy.get("[data-cy=screen-field-comments").should( + cy.get("[data-cy=screen-field-comments]").should( "have.attr", "readonly", "readonly" @@ -98,10 +109,11 @@ describe("Form Text Area Field", () => { ); cy.get("[data-cy=screen-element-container]").click(); cy.get("[data-cy=accordion-Configuration]").click(); - cy.get("[data-cy=inspector-richtext").check(); // Check checkbox element + cy.get("[data-cy=inspector-richtext]").check(); // Check checkbox element cy.get("[data-cy=mode-preview]").click(); + cy.get("[data-cy=preview-content]").should("be.visible"); cy.setPreviewDataInput('{"form_text_area_1":"
Hello World
"}'); - cy.assertPreviewData({ + assertPreviewDataStable({ form_text_area_1: "Hello World
" }); }); @@ -135,7 +147,7 @@ describe("Form Text Area Field", () => { .clear() .type("default value test"); cy.get("[data-cy=mode-preview]").click(); - cy.assertPreviewData({ + assertPreviewDataStable({ form_text_area_1: "default value test" }); }); diff --git a/tests/e2e/specs/SelectListCollection.spec.js b/tests/e2e/specs/SelectListCollection.spec.js index f10d0565..6d9b3891 100644 --- a/tests/e2e/specs/SelectListCollection.spec.js +++ b/tests/e2e/specs/SelectListCollection.spec.js @@ -415,8 +415,7 @@ describe("select list mustache", () => { }); it("Verify Load values in select list mustache + collection", () => { - cy.loadFromJson("select_list_collection.json", 0); - cy.setPreviewDataInput({ + const expectedPreviewData = { form_select_list_1: { dni: "1234", name: { @@ -440,131 +439,39 @@ describe("select list mustache", () => { form_select_list_4: "1", form_select_list_5: "Oliver Smith", form_select_list_6: "1" - }); - - cy.get("[data-cy=mode-preview]").click(); - - cy.get( - '[data-cy="screen-field-form_select_list_1"] .multiselect__single' - ).contains("1234"); - cy.get( - '[data-cy="screen-field-form_select_list_2"] .multiselect__single' - ).contains("Oliver"); - cy.get( - '[data-cy="screen-field-form_select_list_3"] .multiselect__single' - ).contains("DNI: 1234 Name: Oliver Smith"); - cy.get( - '[data-cy="screen-field-form_select_list_4"] .multiselect__single' - ).contains("Oliver Smith"); - cy.get( - '[data-cy="screen-field-form_select_list_5"] .multiselect__single' - ).contains("Oliver Smith"); - cy.get( - '[data-cy="screen-field-form_select_list_6"] .multiselect__single' - ).contains("Oliver Smith"); + }; - // Check the data of the screen - cy.assertPreviewData({ - form_select_list_1: { - dni: "1234", - name: { - last: "Smith", - first: "Oliver" - }, - id: 1 - }, - form_select_list_2: { - last: "Smith", - first: "Oliver" - }, - form_select_list_3: { - dni: "1234", - name: { - last: "Smith", - first: "Oliver" - }, - id: 1 - }, - form_select_list_4: "1", - form_select_list_5: "Oliver Smith", - form_select_list_6: "1" - }); - }); - - it("Verify Load values in select list mustache + collection", () => { cy.loadFromJson("select_list_collection.json", 0); - cy.setPreviewDataInput({ - form_select_list_1: { - dni: "1234", - name: { - last: "Smith", - first: "Oliver" - }, - id: 1 - }, - form_select_list_2: { - last: "Smith", - first: "Oliver" - }, - form_select_list_3: { - dni: "1234", - name: { - last: "Smith", - first: "Oliver" - }, - id: 1 - }, - form_select_list_4: "1", - form_select_list_5: "Oliver Smith", - form_select_list_6: "1" + cy.setPreviewDataInput(expectedPreviewData); + cy.get("#screen-builder-container").should(($div) => { + const previewInput = JSON.parse($div[0].__vue__.previewInput); + expect(previewInput.form_select_list_4).to.eq("1"); }); - cy.get("[data-cy=mode-preview]").click(); + cy.wait("@executeScript"); cy.get( '[data-cy="screen-field-form_select_list_1"] .multiselect__single' - ).contains("1234"); + ).should("contain.text", "1234"); cy.get( '[data-cy="screen-field-form_select_list_2"] .multiselect__single' - ).contains("Oliver"); + ).should("contain.text", "Oliver"); cy.get( '[data-cy="screen-field-form_select_list_3"] .multiselect__single' - ).contains("DNI: 1234 Name: Oliver Smith"); + ).should("contain.text", "DNI: 1234 Name: Oliver Smith"); cy.get( '[data-cy="screen-field-form_select_list_4"] .multiselect__single' - ).contains("Oliver Smith"); + ).should("contain.text", "Oliver Smith"); cy.get( '[data-cy="screen-field-form_select_list_5"] .multiselect__single' - ).contains("Oliver Smith"); + ).should("contain.text", "Oliver Smith"); cy.get( '[data-cy="screen-field-form_select_list_6"] .multiselect__single' - ).contains("Oliver Smith"); + ).should("contain.text", "Oliver Smith"); - // Check the data of the screen - cy.assertPreviewData({ - form_select_list_1: { - dni: "1234", - name: { - last: "Smith", - first: "Oliver" - }, - id: 1 - }, - form_select_list_2: { - last: "Smith", - first: "Oliver" - }, - form_select_list_3: { - dni: "1234", - name: { - last: "Smith", - first: "Oliver" - }, - id: 1 - }, - form_select_list_4: "1", - form_select_list_5: "Oliver Smith", - form_select_list_6: "1" + cy.get("#screen-builder-container").should(($div) => { + const data = JSON.parse(JSON.stringify($div[0].__vue__.previewData)); + expect(data).to.eql(expectedPreviewData); }); }); diff --git a/tests/e2e/specs/Task.spec.js b/tests/e2e/specs/Task.spec.js index 2e1aad18..ef0a28b8 100644 --- a/tests/e2e/specs/Task.spec.js +++ b/tests/e2e/specs/Task.spec.js @@ -30,7 +30,6 @@ describe("Task component", () => { win.Echo = {}; } }); - cy.wait(2000); }); it("Task inside a Request", () => { @@ -83,7 +82,6 @@ describe("Task component", () => { } }); - cy.wait(2000); cy.get("[data-cy=screen-field-firstname]").should("be.visible"); cy.get("[data-cy=screen-field-lastname]").should("be.visible"); }); @@ -143,7 +141,6 @@ describe("Task component", () => { } }); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( function () { @@ -220,7 +217,6 @@ describe("Task component", () => { cy.stub(win, "alert").as("windowAlert"); } }); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( function () { @@ -421,7 +417,6 @@ describe("Task component", () => { cy.visit("/?scenario=TaskRedirect", {}); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( @@ -466,7 +461,6 @@ describe("Task component", () => { responseDataTask2 ); - cy.wait(2000); cy.reload(); } ); @@ -497,7 +491,6 @@ describe("Task component", () => { cy.visit("/?scenario=TaskRedirect", {}); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( @@ -568,7 +561,6 @@ describe("Task component", () => { cy.visit("/?scenario=TaskRedirect", {}); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( @@ -612,7 +604,6 @@ describe("Task component", () => { responseDataTask2 ); - cy.wait(2000); cy.reload(); } ); @@ -643,7 +634,6 @@ describe("Task component", () => { cy.visit("/?scenario=TaskRedirect", {}); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( @@ -662,7 +652,6 @@ describe("Task component", () => { responseDataTask1 ); - cy.wait(2000); cy.reload(); } ); @@ -693,7 +682,6 @@ describe("Task component", () => { cy.visit("/?scenario=TaskRedirect", {}); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( @@ -752,7 +740,6 @@ describe("Task component", () => { cy.visit("/?scenario=TaskRedirect", {}); - cy.wait(2000); cy.get(".form-group").find("button").click(); cy.intercept("PUT", "http://localhost:5173/api/1.1/tasks/1").then( @@ -780,7 +767,6 @@ describe("Task component", () => { "http://localhost:5173/api/1.1/tasks?user_id=1&status=ACTIVE&process_request_id=1&include_sub_tasks=1" ); - cy.wait(2000); cy.reload(); } ); @@ -829,7 +815,6 @@ describe("Task component", () => { } }); - cy.wait(2000); cy.get("[data-cy=screen-field-firstname]").should("be.visible"); cy.get("[data-cy=screen-field-lastname]").should("be.visible"); @@ -890,7 +875,6 @@ describe("Task component", () => { } }); - cy.wait(2000); cy.get("[data-cy=screen-field-firstname]").should("be.visible"); cy.get("[data-cy=screen-field-lastname]").should("be.visible"); @@ -946,7 +930,6 @@ describe("Task component", () => { } }); - cy.wait(2000); cy.get("[data-cy=screen-field-firstname]").should("be.visible"); cy.get("[data-cy=screen-field-lastname]").should("be.visible"); diff --git a/tests/e2e/specs/ValidationRules.spec.js b/tests/e2e/specs/ValidationRules.spec.js index 07e6237f..a8c51b16 100644 --- a/tests/e2e/specs/ValidationRules.spec.js +++ b/tests/e2e/specs/ValidationRules.spec.js @@ -399,7 +399,10 @@ describe("Validation Rules", () => { it("Access to Request _parent variables", () => { cy.loadFromJson("test_parent_in_validations.json", 0); - cy.setPreviewDataInput({ _parent: { user_name: "from_parent_request" } }); + cy.get("[data-cy=screen-element-container]").should( + "have.length.at.least", + 3 + ); // Change validation rule to Same (input 1) cy.get("[data-cy=screen-element-container]").eq(1).click(); @@ -420,6 +423,9 @@ describe("Validation Rules", () => { cy.get( '[data-cy="inspector-validation"] [data-cy="update-rule"]:visible' ).click(); + cy.get('[data-cy="inspector-validation"] input[name="variable-name"]').should( + "not.be.visible" + ); // Change validation rule to Same (input 1 inside loop) cy.get("[data-cy=screen-element-container]").eq(2).click(); @@ -440,41 +446,32 @@ describe("Validation Rules", () => { cy.get( '[data-cy="inspector-validation"] [data-cy="update-rule"]:visible' ).click(); + cy.get('[data-cy="inspector-validation"] input[name="variable-name"]').should( + "not.be.visible" + ); + cy.setPreviewDataInput({ _parent: { user_name: "from_parent_request" } }); + cy.get("#screen-builder-container").should(($div) => { + const previewInput = JSON.parse($div[0].__vue__.previewInput); + expect(previewInput._parent.user_name).to.eq("from_parent_request"); + }); cy.get("[data-cy=mode-preview]").click(); - cy.get('[data-cy=preview-content] [name="form_input_1"]') - .parent() - .find(".invalid-feedback") - .should("be.visible"); + + cy.shouldHaveValidationErrors("screen-field-form_input_1"); cy.get('[data-cy=preview-content] [name="form_input_1"]').type("abc"); - cy.get('[data-cy=preview-content] [name="form_input_1"]') - .parent() - .find(".invalid-feedback") - .should("be.visible"); + cy.shouldHaveValidationErrors("screen-field-form_input_1"); cy.get('[data-cy=preview-content] [name="form_input_1"]') .clear() .type("from_parent_request"); - cy.get('[data-cy=preview-content] [name="form_input_1"]') - .parent() - .find(".invalid-feedback") - .should("not.exist"); + cy.shouldNotHaveValidationErrors("screen-field-form_input_1"); - cy.get('[data-cy=preview-content] [name="form_input_2"]') - .parent() - .find(".invalid-feedback") - .should("be.visible"); + cy.shouldHaveValidationErrors("screen-field-form_input_2"); cy.get('[data-cy=preview-content] [name="form_input_2"]').type("abc"); - cy.get('[data-cy=preview-content] [name="form_input_2"]') - .parent() - .find(".invalid-feedback") - .should("be.visible"); + cy.shouldHaveValidationErrors("screen-field-form_input_2"); cy.get('[data-cy=preview-content] [name="form_input_2"]') .clear() .type("from_parent_request"); - cy.get('[data-cy=preview-content] [name="form_input_2"]') - .parent() - .find(".invalid-feedback") - .should("not.exist"); + cy.shouldNotHaveValidationErrors("screen-field-form_input_2"); }); it("Required IF with boolean values", () => {