2022-05-18 10:39:42 +00:00
|
|
|
|
import "cypress-wait-until";
|
2023-06-15 13:21:11 +00:00
|
|
|
|
import { v4 as uuidv4 } from "uuid";
|
2022-05-18 10:39:42 +00:00
|
|
|
|
import { ObjectsRegistry } from "../Objects/Registry";
|
2023-05-11 05:26:03 +00:00
|
|
|
|
import type CodeMirror from "codemirror";
|
2023-06-16 18:40:10 +00:00
|
|
|
|
import type { EntityItemsType } from "./AssertHelper";
|
2023-06-15 13:21:11 +00:00
|
|
|
|
import { EntityItems } from "./AssertHelper";
|
2024-05-21 13:10:02 +00:00
|
|
|
|
import EditorNavigator from "./EditorNavigation";
|
|
|
|
|
|
import { EntityType } from "./EditorNavigation";
|
|
|
|
|
|
import ClickOptions = Cypress.ClickOptions;
|
2022-04-06 07:22:18 +00:00
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
type ElementType = string | JQuery<HTMLElement>;
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
interface DeleteParams {
|
|
|
|
|
|
action: "Copy to page" | "Move to page" | "Delete" | "Prettify code";
|
|
|
|
|
|
subAction?: string;
|
2023-06-16 18:40:10 +00:00
|
|
|
|
entityType?: EntityItemsType;
|
2023-06-15 13:21:11 +00:00
|
|
|
|
toastToValidate?: string;
|
|
|
|
|
|
}
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
interface SubActionParams {
|
|
|
|
|
|
subAction: string;
|
|
|
|
|
|
index?: number;
|
|
|
|
|
|
force?: boolean;
|
|
|
|
|
|
toastToValidate?: string;
|
|
|
|
|
|
}
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2024-05-21 13:10:02 +00:00
|
|
|
|
interface SelectAndValidateParams {
|
|
|
|
|
|
clickOptions?: Partial<ClickOptions>;
|
|
|
|
|
|
widgetName: string;
|
|
|
|
|
|
widgetType?: EntityType;
|
|
|
|
|
|
hierarchy?: string[];
|
|
|
|
|
|
propFieldName: string;
|
|
|
|
|
|
valueToValidate: string;
|
|
|
|
|
|
toggleEle?: string | null;
|
|
|
|
|
|
}
|
2023-06-15 13:21:11 +00:00
|
|
|
|
|
2022-04-12 10:01:22 +00:00
|
|
|
|
let LOCAL_STORAGE_MEMORY: any = {};
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2022-06-06 05:59:15 +00:00
|
|
|
|
export interface IEnterValue {
|
|
|
|
|
|
propFieldName: string;
|
|
|
|
|
|
directInput: boolean;
|
|
|
|
|
|
inputFieldName: string;
|
2023-08-10 07:06:03 +00:00
|
|
|
|
apiOrQuery?: "api" | "query";
|
2022-06-06 05:59:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const DEFAULT_ENTERVALUE_OPTIONS = {
|
|
|
|
|
|
propFieldName: "",
|
|
|
|
|
|
directInput: false,
|
|
|
|
|
|
inputFieldName: "",
|
|
|
|
|
|
};
|
2023-06-15 13:21:11 +00:00
|
|
|
|
|
2023-12-11 09:09:36 +00:00
|
|
|
|
export class AggregateHelper {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
private locator = ObjectsRegistry.CommonLocators;
|
2023-06-15 13:21:11 +00:00
|
|
|
|
private assertHelper = ObjectsRegistry.AssertHelper;
|
2023-05-19 18:37:06 +00:00
|
|
|
|
|
2023-10-17 14:56:24 +00:00
|
|
|
|
public get isMac() {
|
|
|
|
|
|
return Cypress.platform === "darwin";
|
|
|
|
|
|
}
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2022-10-17 15:16:38 +00:00
|
|
|
|
private selectLine = `${
|
|
|
|
|
|
this.isMac ? "{cmd}{shift}{leftArrow}" : "{shift}{home}"
|
2022-08-24 14:23:41 +00:00
|
|
|
|
}`;
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2023-10-17 14:56:24 +00:00
|
|
|
|
public get removeLine() {
|
|
|
|
|
|
return "{backspace}";
|
|
|
|
|
|
}
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2023-10-27 13:13:28 +00:00
|
|
|
|
public _modifierKey = `${this.isMac ? "meta" : "ctrl"}`;
|
2022-09-19 05:32:06 +00:00
|
|
|
|
private selectAll = `${this.isMac ? "{cmd}{a}" : "{ctrl}{a}"}`;
|
2023-05-11 05:26:03 +00:00
|
|
|
|
private lazyCodeEditorFallback = ".t--lazyCodeEditor-fallback";
|
|
|
|
|
|
private lazyCodeEditorRendered = ".t--lazyCodeEditor-editor";
|
2023-07-24 08:54:17 +00:00
|
|
|
|
private toolTipSpan = ".rc-tooltip-inner span";
|
2023-10-06 10:03:27 +00:00
|
|
|
|
_walkthroughOverlay = ".t--walkthrough-overlay";
|
|
|
|
|
|
_walkthroughOverlayClose = ".t--walkthrough-overlay .t--walkthrough-close";
|
|
|
|
|
|
_walkthroughOverlayTitle = (title: string) =>
|
|
|
|
|
|
`//div[contains(@class, 't--walkthrough-overlay')]//p[text()='${title}']`;
|
2022-08-24 14:23:41 +00:00
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
private selectChars = (noOfChars: number) =>
|
|
|
|
|
|
`${"{leftArrow}".repeat(noOfChars) + "{shift}{cmd}{leftArrow}{backspace}"}`;
|
|
|
|
|
|
|
2022-12-26 05:11:33 +00:00
|
|
|
|
// Chrome asks for permission to add text to clipboard on cypress, we grant it here.
|
|
|
|
|
|
public GiveChromeCopyPermission() {
|
|
|
|
|
|
cy.wrap(
|
|
|
|
|
|
Cypress.automation("remote:debugger:protocol", {
|
|
|
|
|
|
command: "Browser.grantPermissions",
|
|
|
|
|
|
params: {
|
|
|
|
|
|
permissions: ["clipboardReadWrite", "clipboardSanitizedWrite"],
|
|
|
|
|
|
origin: window.location.origin,
|
|
|
|
|
|
},
|
|
|
|
|
|
}),
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-17 06:12:18 +00:00
|
|
|
|
public SaveLocalStorageCache() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
Object.keys(localStorage).forEach((key) => {
|
|
|
|
|
|
LOCAL_STORAGE_MEMORY[key] = localStorage[key];
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-17 06:12:18 +00:00
|
|
|
|
public RestoreLocalStorageCache() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
Object.keys(LOCAL_STORAGE_MEMORY).forEach((key) => {
|
|
|
|
|
|
localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-17 06:12:18 +00:00
|
|
|
|
public ClearLocalStorageCache() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
localStorage.clear();
|
|
|
|
|
|
LOCAL_STORAGE_MEMORY = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-21 11:22:55 +00:00
|
|
|
|
public TypeTab(shiftKey = false, ctrlKey = false) {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.focused().trigger("keydown", {
|
|
|
|
|
|
keyCode: 9,
|
|
|
|
|
|
which: 9,
|
|
|
|
|
|
shiftKey: shiftKey,
|
|
|
|
|
|
ctrlKey: ctrlKey,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-27 13:13:28 +00:00
|
|
|
|
public SimulateCopyPaste(action: "copy" | "paste" | "cut") {
|
|
|
|
|
|
const actionToKey = {
|
|
|
|
|
|
copy: "c",
|
|
|
|
|
|
paste: "v",
|
|
|
|
|
|
cut: "x",
|
|
|
|
|
|
};
|
|
|
|
|
|
const keyToSimulate = actionToKey[action];
|
|
|
|
|
|
|
|
|
|
|
|
// Simulate Ctrl keypress (Ctrl down)
|
|
|
|
|
|
this.GetElement(this.locator._body).type(`{${this._modifierKey}}`, {
|
|
|
|
|
|
release: false,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Simulate 'C' keypress while Ctrl is held (Ctrl + C)
|
|
|
|
|
|
this.GetElement(this.locator._body).type(keyToSimulate, { release: false });
|
|
|
|
|
|
|
|
|
|
|
|
// Release the Ctrl key
|
|
|
|
|
|
this.GetElement(this.locator._body).type(`{${this._modifierKey}}`, {
|
|
|
|
|
|
release: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-02 01:01:59 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Extract the pageId out of the URL, supporting both ObjectID and UUIDv4 values. This implementation is for tests
|
|
|
|
|
|
* only. Do NOT copy this over to production code.
|
|
|
|
|
|
* @param urlFragment can be either a full absolute URL (like https://dev.appsmith.com/app/name/page1-...) or just a
|
|
|
|
|
|
* path fragment (like /app/name/page1-...) or even a custom slug URL (like /app/custom-slug-...).
|
|
|
|
|
|
*/
|
|
|
|
|
|
public extractPageIdFromUrl(urlFragment: string): null | string {
|
2024-06-22 13:03:29 +00:00
|
|
|
|
return (
|
2024-07-02 01:01:59 +00:00
|
|
|
|
urlFragment.match(
|
|
|
|
|
|
/\/app(?:\/[^/]+)?\/[^/]+-([0-9a-f]{24}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\b/,
|
|
|
|
|
|
)?.[1] ?? null
|
2024-06-22 13:03:29 +00:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public AddDsl(
|
2023-07-04 16:33:31 +00:00
|
|
|
|
dslFile: string,
|
2023-07-20 13:15:27 +00:00
|
|
|
|
elementToCheckPresenceaftDslLoad: string | "" = "", // reloadWithoutCache = true,
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2024-06-22 13:03:29 +00:00
|
|
|
|
let layoutId;
|
2023-06-09 14:40:12 +00:00
|
|
|
|
let appId: string | null;
|
2023-07-04 16:33:31 +00:00
|
|
|
|
cy.fixture(dslFile).then((val) => {
|
|
|
|
|
|
cy.url().then((url) => {
|
2024-06-22 13:03:29 +00:00
|
|
|
|
const pageid = this.extractPageIdFromUrl(url);
|
|
|
|
|
|
expect(pageid).to.not.be.null;
|
2023-07-04 16:33:31 +00:00
|
|
|
|
//Fetch the layout id
|
|
|
|
|
|
cy.request("GET", "api/v1/pages/" + pageid).then((response: any) => {
|
|
|
|
|
|
const respBody = JSON.stringify(response.body);
|
|
|
|
|
|
const parsedData = JSON.parse(respBody).data;
|
|
|
|
|
|
layoutId = parsedData.layouts[0].id;
|
|
|
|
|
|
appId = parsedData.applicationId;
|
|
|
|
|
|
// Dumping the DSL to the created page
|
|
|
|
|
|
cy.request({
|
|
|
|
|
|
method: "PUT",
|
|
|
|
|
|
url:
|
|
|
|
|
|
"api/v1/layouts/" +
|
|
|
|
|
|
layoutId +
|
|
|
|
|
|
"/pages/" +
|
|
|
|
|
|
pageid +
|
|
|
|
|
|
"?applicationId=" +
|
|
|
|
|
|
appId,
|
|
|
|
|
|
body: val,
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
"X-Requested-By": "Appsmith",
|
|
|
|
|
|
},
|
|
|
|
|
|
}).then((dslDumpResp) => {
|
|
|
|
|
|
expect(dslDumpResp.status).equal(200);
|
2023-10-20 02:15:47 +00:00
|
|
|
|
//this.Sleep(3000); //for dsl to settle in layouts api & then refresh
|
2023-07-20 13:15:27 +00:00
|
|
|
|
this.RefreshPage();
|
2023-07-04 16:33:31 +00:00
|
|
|
|
if (elementToCheckPresenceaftDslLoad)
|
|
|
|
|
|
this.WaitUntilEleAppear(elementToCheckPresenceaftDslLoad);
|
2024-01-24 06:44:16 +00:00
|
|
|
|
// this.Sleep(5000); //settling time for dsl
|
|
|
|
|
|
this.assertHelper.AssertNetworkResponseData("@getConsolidatedData");
|
2023-07-04 16:33:31 +00:00
|
|
|
|
this.AssertElementAbsence(this.locator._loading); //Checks the spinner is gone & dsl loaded!
|
|
|
|
|
|
this.AssertElementAbsence(this.locator._animationSpnner, 20000); //Checks page is loaded with dsl!
|
|
|
|
|
|
});
|
2022-03-25 11:14:12 +00:00
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-31 05:33:59 +00:00
|
|
|
|
public StartRoutes() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.intercept("POST", "/api/v1/actions").as("createNewApi");
|
|
|
|
|
|
cy.intercept("PUT", "/api/v1/actions/*").as("saveAction");
|
|
|
|
|
|
//cy.intercept("POST", "/api/v1/users/invite", (req) => { req.headers["origin"] = "Cypress";}).as("mockPostInvite");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-08 06:46:48 +00:00
|
|
|
|
public AssertPopoverTooltip(expectedText: string) {
|
|
|
|
|
|
this.GetText(this.locator._popoverToolTip, "text").then(($tooltiptxt) =>
|
|
|
|
|
|
expect($tooltiptxt).to.eq(expectedText),
|
2023-06-15 13:21:11 +00:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 08:54:17 +00:00
|
|
|
|
/**
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param selector
|
|
|
|
|
|
* @param index
|
|
|
|
|
|
* Checks if the given selector has class with disabled in the class name
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
*/
|
|
|
|
|
|
public AssertElementClassContainsDisabled(selector: string, index = 0) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should(($element) => {
|
|
|
|
|
|
const elementClass = $element.attr("class");
|
|
|
|
|
|
expect(elementClass).to.include("disabled");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-03 03:51:43 +00:00
|
|
|
|
private rename(args: {
|
|
|
|
|
|
nameLocator: string;
|
|
|
|
|
|
textInputLocator: string;
|
|
|
|
|
|
renameVal: string;
|
|
|
|
|
|
dblClick?: boolean;
|
2024-12-07 11:58:42 +00:00
|
|
|
|
willFailError?: string;
|
2024-12-03 03:51:43 +00:00
|
|
|
|
}) {
|
|
|
|
|
|
const { dblClick = false, nameLocator, renameVal, textInputLocator } = args;
|
|
|
|
|
|
|
|
|
|
|
|
this.Sleep(300);
|
|
|
|
|
|
|
|
|
|
|
|
if (dblClick) {
|
|
|
|
|
|
cy.get(nameLocator).dblclick({ force: true });
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.GetNClick(nameLocator, 0, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cy.get(textInputLocator)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.clear({ force: true })
|
2023-03-11 07:01:39 +00:00
|
|
|
|
.type(renameVal, { force: true, delay: 0 })
|
2024-12-07 11:58:42 +00:00
|
|
|
|
.should("have.value", renameVal);
|
2024-12-03 03:51:43 +00:00
|
|
|
|
|
2024-12-07 11:58:42 +00:00
|
|
|
|
if (args.willFailError) {
|
|
|
|
|
|
this.AssertContains(args.willFailError, "exist", ".ads-v2-tooltip");
|
|
|
|
|
|
cy.get(textInputLocator).blur();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
cy.get(textInputLocator).blur();
|
|
|
|
|
|
this.PressEnter();
|
|
|
|
|
|
}
|
2024-12-03 03:51:43 +00:00
|
|
|
|
this.Sleep();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public RenameDatasource(renameVal: string) {
|
|
|
|
|
|
this.rename({
|
|
|
|
|
|
nameLocator: this.locator._dsName,
|
|
|
|
|
|
textInputLocator: this.locator._dsNameTxt,
|
|
|
|
|
|
renameVal,
|
|
|
|
|
|
});
|
2023-08-10 07:06:03 +00:00
|
|
|
|
this.AssertElementVisibility(this.locator._editIcon);
|
2024-12-03 03:51:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-07 11:58:42 +00:00
|
|
|
|
public RenameQuery(renameVal: string, willFailError?: string) {
|
2024-12-03 03:51:43 +00:00
|
|
|
|
this.rename({
|
2025-02-06 08:33:54 +00:00
|
|
|
|
nameLocator: this.locator._activeEntityTab,
|
|
|
|
|
|
textInputLocator: this.locator._activeEntityTabInput,
|
2024-12-03 03:51:43 +00:00
|
|
|
|
renameVal,
|
|
|
|
|
|
dblClick: true,
|
2024-12-07 11:58:42 +00:00
|
|
|
|
willFailError,
|
2024-12-03 03:51:43 +00:00
|
|
|
|
});
|
2022-09-07 18:25:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-18 09:24:15 +00:00
|
|
|
|
public CheckForPageSaveError() {
|
|
|
|
|
|
// Wait for "saving" status to disappear
|
2023-12-11 09:09:36 +00:00
|
|
|
|
this.AssertElementAbsence(
|
|
|
|
|
|
this.locator._statusSaving,
|
|
|
|
|
|
Cypress.config("defaultCommandTimeout"),
|
|
|
|
|
|
);
|
2023-01-18 09:24:15 +00:00
|
|
|
|
// Check for page save error
|
|
|
|
|
|
cy.get("body").then(($ele) => {
|
|
|
|
|
|
if ($ele.find(this.locator._saveStatusError).length) {
|
|
|
|
|
|
this.RefreshPage();
|
2023-03-18 19:42:01 +00:00
|
|
|
|
return false;
|
2023-01-18 09:24:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
});
|
2023-03-18 19:42:01 +00:00
|
|
|
|
return true;
|
2023-01-18 09:24:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public AssertAutoSave() {
|
2023-03-18 19:42:01 +00:00
|
|
|
|
let saveStatus = this.CheckForPageSaveError();
|
2022-05-18 10:39:42 +00:00
|
|
|
|
// wait for save query to trigger & n/w call to finish occuring
|
2023-03-18 19:42:01 +00:00
|
|
|
|
if (!saveStatus)
|
2023-12-22 11:50:05 +00:00
|
|
|
|
this.AssertElementAbsence(
|
|
|
|
|
|
this.locator._saveStatusContainer,
|
|
|
|
|
|
Cypress.config("defaultCommandTimeout"),
|
2023-03-18 19:42:01 +00:00
|
|
|
|
); //adding timeout since waiting more time is not worth it!
|
2023-02-06 07:37:01 +00:00
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
//this.AssertNetworkStatus("@sucessSave", 200);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-24 12:30:39 +00:00
|
|
|
|
public PopupClose(popUpName: string) {
|
|
|
|
|
|
this.GetNClick(this.locator._popUpCloseBtn(popUpName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public ValidateCodeEditorContent(selector: string, contentToValidate: any) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
// cy.get(selector).each(($ele) => {
|
|
|
|
|
|
// cy.wrap($ele).within(() => {
|
|
|
|
|
|
// cy.get(this.locator._codeMirrorCode).should(
|
|
|
|
|
|
// "include.text",
|
|
|
|
|
|
// contentToValidate,
|
|
|
|
|
|
// );
|
|
|
|
|
|
// });
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
let isTextContained = false;
|
|
|
|
|
|
|
|
|
|
|
|
cy.get(selector)
|
|
|
|
|
|
.each(($ele) => {
|
|
|
|
|
|
cy.wrap($ele).within(() => {
|
|
|
|
|
|
cy.get(this.locator._codeMirrorCode)
|
|
|
|
|
|
.invoke("text")
|
|
|
|
|
|
.then((text) => {
|
|
|
|
|
|
if (contentToValidate.includes(text)) {
|
|
|
|
|
|
isTextContained = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
})
|
|
|
|
|
|
.then(() => {
|
|
|
|
|
|
expect(isTextContained).to.be.true;
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-01 12:48:41 +00:00
|
|
|
|
public GetElement(
|
|
|
|
|
|
selector: ElementType,
|
2023-12-11 09:09:36 +00:00
|
|
|
|
exists: "exist" | "not.exist" | "noVerify" = "exist",
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
timeout = Cypress.config("pageLoadTimeout"),
|
2023-12-01 12:48:41 +00:00
|
|
|
|
) {
|
2022-08-27 12:40:11 +00:00
|
|
|
|
let locator;
|
2024-05-09 05:26:59 +00:00
|
|
|
|
expect(selector).to.not.be.undefined;
|
2022-08-27 12:40:11 +00:00
|
|
|
|
if (typeof selector == "string") {
|
2022-10-13 07:24:09 +00:00
|
|
|
|
locator =
|
|
|
|
|
|
selector.startsWith("//") || selector.startsWith("(//")
|
2023-06-20 08:58:06 +00:00
|
|
|
|
? cy.xpath(selector, {
|
2023-12-01 12:48:41 +00:00
|
|
|
|
timeout,
|
2023-06-20 08:58:06 +00:00
|
|
|
|
})
|
|
|
|
|
|
: cy.get(selector, {
|
2023-12-01 12:48:41 +00:00
|
|
|
|
timeout,
|
2023-06-20 08:58:06 +00:00
|
|
|
|
});
|
2022-08-27 12:40:11 +00:00
|
|
|
|
} else locator = cy.wrap(selector);
|
2023-12-11 09:09:36 +00:00
|
|
|
|
return exists === "noVerify"
|
|
|
|
|
|
? locator // Return the locator without verification if exists is "noVerify"
|
|
|
|
|
|
: exists === "exist"
|
2024-04-22 09:17:28 +00:00
|
|
|
|
? locator.should("have.length.at.least", 1)
|
|
|
|
|
|
: locator.should("have.length", 0);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 14:23:41 +00:00
|
|
|
|
public GetNAssertElementText(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
text: string,
|
2023-06-22 05:00:24 +00:00
|
|
|
|
textPresence:
|
|
|
|
|
|
| "have.text"
|
|
|
|
|
|
| "not.have.text"
|
|
|
|
|
|
| "contain.text"
|
|
|
|
|
|
| "not.contain.text" = "have.text",
|
2022-08-24 14:23:41 +00:00
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
2022-09-02 01:05:45 +00:00
|
|
|
|
if (index >= 0)
|
2023-08-21 07:49:28 +00:00
|
|
|
|
this.ScrollIntoView(selector, index).should(textPresence, text);
|
2022-09-02 01:05:45 +00:00
|
|
|
|
else this.GetElement(selector).should(textPresence, text);
|
2022-08-04 04:48:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-30 18:46:57 +00:00
|
|
|
|
public GetElementsNAssertTextPresence(selector: string, text: string) {
|
|
|
|
|
|
this.GetElement(selector).then(($elements: any) => {
|
|
|
|
|
|
let found = false;
|
|
|
|
|
|
$elements.each((index: any, element: any) => {
|
|
|
|
|
|
const eleText = Cypress.$(element).text().trim();
|
|
|
|
|
|
if (eleText === text) {
|
|
|
|
|
|
found = true;
|
|
|
|
|
|
return false; // Exit the loop if the expected text is found
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
expect(found).to.be.true;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-07-01 05:26:57 +00:00
|
|
|
|
public ValidateToastMessage(text: string, index = 0, length = 1) {
|
2023-08-08 09:14:46 +00:00
|
|
|
|
if (index != 0) {
|
2023-12-11 09:09:36 +00:00
|
|
|
|
this.GetElement(this.locator._toastMsg, "noVerify")
|
2023-08-08 09:14:46 +00:00
|
|
|
|
.should("have.length.at.least", length)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("contain.text", text);
|
|
|
|
|
|
} else this.GetNAssertContains(this.locator._toastMsg, text);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 08:54:17 +00:00
|
|
|
|
public AssertTooltip(toolTipText: string) {
|
|
|
|
|
|
this.GetNAssertContains(this.toolTipSpan, toolTipText);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 14:03:07 +00:00
|
|
|
|
public RemoveUIElement(
|
|
|
|
|
|
elementToRemove: "EvaluatedPopUp" | "Tooltip" | "Toast",
|
|
|
|
|
|
toolTipOrToasttext = "",
|
|
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
cy.get("body").then(($body) => {
|
2023-10-25 14:03:07 +00:00
|
|
|
|
switch (elementToRemove) {
|
|
|
|
|
|
case "EvaluatedPopUp":
|
|
|
|
|
|
if ($body.find(this.locator._evalPopup).length > 0) {
|
|
|
|
|
|
this.GetElement(this.locator._evalPopup).then(($evalPopUp) => {
|
|
|
|
|
|
$evalPopUp.remove();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "Tooltip":
|
|
|
|
|
|
if (
|
|
|
|
|
|
$body.find(this.locator._appLeveltooltip(toolTipOrToasttext))
|
|
|
|
|
|
.length > 0
|
|
|
|
|
|
) {
|
|
|
|
|
|
this.GetElement(this.locator._appLeveltooltip(toolTipOrToasttext))
|
|
|
|
|
|
.parents("div.rc-tooltip")
|
|
|
|
|
|
.then(($tooltipElement) => {
|
|
|
|
|
|
$tooltipElement.remove();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "Toast":
|
|
|
|
|
|
if (
|
|
|
|
|
|
$body.find(
|
|
|
|
|
|
this.locator._toastContainer +
|
|
|
|
|
|
" span:contains(" +
|
|
|
|
|
|
toolTipOrToasttext +
|
|
|
|
|
|
")",
|
|
|
|
|
|
).length > 0
|
|
|
|
|
|
) {
|
|
|
|
|
|
this.GetElement(
|
|
|
|
|
|
this.locator._toastContainer +
|
|
|
|
|
|
":has(:contains('" +
|
|
|
|
|
|
toolTipOrToasttext +
|
|
|
|
|
|
"'))",
|
|
|
|
|
|
).then(($toastContainer) => {
|
|
|
|
|
|
$toastContainer.remove();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2023-06-15 13:21:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-11 07:01:39 +00:00
|
|
|
|
public ClickButton(
|
|
|
|
|
|
btnVisibleText: string,
|
2023-08-21 07:49:28 +00:00
|
|
|
|
indexOrOptions:
|
|
|
|
|
|
| number
|
|
|
|
|
|
| Partial<{
|
|
|
|
|
|
index: number;
|
|
|
|
|
|
force: boolean;
|
|
|
|
|
|
waitAfterClick: boolean;
|
|
|
|
|
|
sleepTime: number;
|
2023-12-29 12:19:20 +00:00
|
|
|
|
type?: "click" | "invoke";
|
2023-08-21 07:49:28 +00:00
|
|
|
|
}> = 0,
|
2023-03-11 07:01:39 +00:00
|
|
|
|
) {
|
2023-08-21 07:49:28 +00:00
|
|
|
|
const button = this.locator._buttonByText(btnVisibleText);
|
|
|
|
|
|
let index: number,
|
|
|
|
|
|
force = true,
|
|
|
|
|
|
waitAfterClick = true,
|
2023-12-29 12:19:20 +00:00
|
|
|
|
waitTime = 1000,
|
|
|
|
|
|
type = "click";
|
2023-08-21 07:49:28 +00:00
|
|
|
|
|
|
|
|
|
|
if (typeof indexOrOptions === "number") {
|
|
|
|
|
|
index = indexOrOptions;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
index = indexOrOptions.index || 0;
|
|
|
|
|
|
force =
|
|
|
|
|
|
typeof indexOrOptions.force !== "undefined"
|
|
|
|
|
|
? indexOrOptions.force
|
|
|
|
|
|
: true;
|
|
|
|
|
|
// waitAfterClick = indexOrOptions.waitAfterClick || false;
|
|
|
|
|
|
// Check if waitAfterClick is explicitly set, otherwise default to true
|
|
|
|
|
|
waitAfterClick =
|
|
|
|
|
|
typeof indexOrOptions.waitAfterClick !== "undefined"
|
|
|
|
|
|
? indexOrOptions.waitAfterClick
|
|
|
|
|
|
: true;
|
|
|
|
|
|
waitTime = indexOrOptions.sleepTime || 1000;
|
2023-12-29 12:19:20 +00:00
|
|
|
|
type = indexOrOptions?.type || "click";
|
2023-08-21 07:49:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-29 12:19:20 +00:00
|
|
|
|
const element = this.ScrollIntoView(button, index);
|
|
|
|
|
|
if (type == "invoke") {
|
|
|
|
|
|
return element.invoke("click").then(() => {
|
2023-08-21 07:49:28 +00:00
|
|
|
|
if (waitAfterClick) {
|
|
|
|
|
|
return this.Sleep(waitTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2023-12-29 12:19:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return element.click({ force }).then(() => {
|
|
|
|
|
|
if (waitAfterClick) {
|
|
|
|
|
|
return this.Sleep(waitTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public clickMultipleButtons(btnVisibleText: string, waitAfterClick = true) {
|
|
|
|
|
|
cy.xpath(this.locator._buttonByText(btnVisibleText)).each(($el) => {
|
2023-03-04 07:25:54 +00:00
|
|
|
|
$el.trigger("click", { force: true });
|
|
|
|
|
|
cy.wait(200);
|
|
|
|
|
|
});
|
2023-08-21 07:49:28 +00:00
|
|
|
|
waitAfterClick && this.Sleep();
|
2023-03-04 07:25:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public Paste(selector: any, pastePayload: string) {
|
|
|
|
|
|
cy.wrap(selector).then(($destination) => {
|
|
|
|
|
|
const pasteEvent = Object.assign(
|
|
|
|
|
|
new Event("paste", { bubbles: true, cancelable: true }),
|
|
|
|
|
|
{
|
|
|
|
|
|
clipboardData: {
|
|
|
|
|
|
getData: () => pastePayload,
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
$destination[0].dispatchEvent(pasteEvent);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-07-06 05:54:00 +00:00
|
|
|
|
public WaitUntilToastDisappear(
|
|
|
|
|
|
msgToCheckforDisappearance: string | "",
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
length = 1,
|
|
|
|
|
|
) {
|
2022-07-01 05:26:57 +00:00
|
|
|
|
this.ValidateToastMessage(msgToCheckforDisappearance, index, length);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.waitUntil(() => cy.get(this.locator._toastMsg), {
|
|
|
|
|
|
errorMsg: msgToCheckforDisappearance + " did not disappear",
|
|
|
|
|
|
timeout: 5000,
|
|
|
|
|
|
interval: 1000,
|
|
|
|
|
|
}).then(($ele) => {
|
|
|
|
|
|
cy.wrap($ele)
|
2023-06-15 13:21:11 +00:00
|
|
|
|
//.contains(msgToCheckforDisappearance)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.should("have.length", 0);
|
|
|
|
|
|
this.Sleep();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public WaitUntilEleDisappear(selector: string) {
|
2023-12-11 09:09:36 +00:00
|
|
|
|
cy.waitUntil(() => this.GetElement(selector, "not.exist"), {
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
errorMsg:
|
|
|
|
|
|
"Element did not disappear after " +
|
|
|
|
|
|
Cypress.config().pageLoadTimeout +
|
|
|
|
|
|
"seconds",
|
2023-12-11 09:09:36 +00:00
|
|
|
|
timeout: Cypress.config().pageLoadTimeout,
|
2022-08-27 12:40:11 +00:00
|
|
|
|
interval: 1000,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public WaitUntilAllToastsDisappear() {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(this.locator._toastContainer).length > 0) {
|
|
|
|
|
|
this.GetElement(this.locator._toastContainer).waitUntil(
|
|
|
|
|
|
($ele) => cy.wrap($ele).should("have.length", 0),
|
|
|
|
|
|
{
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
errorMsg:
|
|
|
|
|
|
"Toasts did not disappear even after " +
|
|
|
|
|
|
Cypress.config().defaultCommandTimeout +
|
|
|
|
|
|
" seconds",
|
|
|
|
|
|
timeout: Cypress.config().defaultCommandTimeout,
|
2023-06-15 13:21:11 +00:00
|
|
|
|
interval: 1000,
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 07:40:25 +00:00
|
|
|
|
// Note: isVisible is required in case where item exists but is not visible ( hidden by css ),
|
|
|
|
|
|
// For e.g - search input in select widget is not visible,
|
|
|
|
|
|
public WaitUntilEleAppear(selector: string, isVisible = true) {
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
cy.waitUntil(
|
|
|
|
|
|
() =>
|
|
|
|
|
|
this.GetElement(selector)
|
2023-08-01 09:34:15 +00:00
|
|
|
|
.should("exist")
|
2025-02-06 07:40:25 +00:00
|
|
|
|
.should(isVisible ? "be.visible" : "not.be.visible")
|
2023-08-01 09:34:15 +00:00
|
|
|
|
.its("length")
|
|
|
|
|
|
.should("be.gte", 1),
|
|
|
|
|
|
{
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
errorMsg:
|
|
|
|
|
|
"Element did not appear even after " +
|
|
|
|
|
|
Cypress.config().pageLoadTimeout +
|
|
|
|
|
|
" seconds",
|
2023-12-11 09:09:36 +00:00
|
|
|
|
timeout: Cypress.config().pageLoadTimeout,
|
|
|
|
|
|
interval: 2000,
|
2023-08-01 09:34:15 +00:00
|
|
|
|
},
|
|
|
|
|
|
);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
|
|
|
|
|
|
//Below can be tried if above starts being flaky:
|
|
|
|
|
|
// cy.waitUntil(() => cy.get(selector, { timeout: 50000 }).should("have.length.greaterThan", 0)
|
|
|
|
|
|
//or
|
|
|
|
|
|
// cy.waitUntil(()) => (selector.includes("//") ? cy.xpath(selector) : cy.get(selector))).then(($ele) => { cy.wrap($ele).eq(0).should("be.visible");});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-21 09:02:38 +00:00
|
|
|
|
public WaitForCondition(conditionFn: any) {
|
|
|
|
|
|
cy.waitUntil(() => conditionFn, {
|
|
|
|
|
|
timeout: Cypress.config("pageLoadTimeout"),
|
|
|
|
|
|
interval: 1000,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public AssertNetworkDataSuccess(aliasName: string, expectedRes = true) {
|
|
|
|
|
|
cy.wait(1000).wait(aliasName); //Wait a bit for call to finish!
|
|
|
|
|
|
cy.get(aliasName)
|
|
|
|
|
|
.its("response.body.data.success")
|
|
|
|
|
|
.should("eq", expectedRes);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public AssertNetworkDataNestedProperty(
|
2022-09-09 15:59:47 +00:00
|
|
|
|
aliasName: string,
|
|
|
|
|
|
expectedPath: string,
|
|
|
|
|
|
expectedRes: any,
|
|
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
cy.wait(1000).wait(aliasName); //Wait a bit for call to finish!
|
|
|
|
|
|
cy.get(aliasName).should("have.nested.property", expectedPath, expectedRes);
|
2022-09-09 15:59:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-25 05:30:54 +00:00
|
|
|
|
public SelectDropDown(dropdownOption: string, endpoint = "selectwidget") {
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const mode = window.localStorage.getItem("inDeployedMode");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
if (mode == "false") {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.GetNClick(this.locator._selectWidgetDropdown(endpoint));
|
2022-05-18 10:39:42 +00:00
|
|
|
|
} else {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.GetNClick(this.locator._selectWidgetDropdownInDeployed(endpoint));
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
2022-06-23 15:13:15 +00:00
|
|
|
|
if (endpoint == "selectwidget")
|
2022-06-25 05:30:54 +00:00
|
|
|
|
cy.get(this.locator._selectOptionValue(dropdownOption)).click({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
else
|
|
|
|
|
|
cy.get(this.locator._dropDownValue(dropdownOption)).click({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
|
|
|
|
|
this.Sleep(); //for selected value to reflect!
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-13 07:24:09 +00:00
|
|
|
|
public SelectFromMutliTree(dropdownOption: string) {
|
|
|
|
|
|
this.GetNClick(this.locator._dropDownMultiTreeSelect);
|
|
|
|
|
|
this.GetNClick(this.locator._dropDownMultiTreeValue(dropdownOption));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public SelectFromDropDown(
|
2022-06-25 05:30:54 +00:00
|
|
|
|
dropdownOption: string,
|
2022-06-21 11:22:55 +00:00
|
|
|
|
insideParent = "",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
index = 0,
|
2022-06-25 05:30:54 +00:00
|
|
|
|
endpoint = "dropdownwidget",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const mode = window.localStorage.getItem("inDeployedMode");
|
|
|
|
|
|
const modeSelector =
|
2022-05-18 10:39:42 +00:00
|
|
|
|
mode == "true"
|
2022-06-23 15:13:15 +00:00
|
|
|
|
? this.locator._selectWidgetDropdownInDeployed(endpoint)
|
|
|
|
|
|
: this.locator._selectWidgetDropdown(endpoint);
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const finalSelector = insideParent
|
2022-05-18 10:39:42 +00:00
|
|
|
|
? this.locator._divWithClass(insideParent) + modeSelector
|
|
|
|
|
|
: modeSelector;
|
2023-06-20 08:58:06 +00:00
|
|
|
|
|
|
|
|
|
|
this.GetNClick(finalSelector, index);
|
2022-06-25 05:30:54 +00:00
|
|
|
|
cy.get(this.locator._dropDownValue(dropdownOption)).click({ force: true });
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.Sleep(); //for selected value to reflect!
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-03 06:57:24 +00:00
|
|
|
|
// public SelectDropdownList(ddName: string, dropdownOption: string) {
|
|
|
|
|
|
// this.GetNClick(this.locator._existingFieldTextByName(ddName));
|
|
|
|
|
|
// cy.get(this.locator._dropdownText).contains(dropdownOption).click();
|
|
|
|
|
|
// }
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
|
|
|
|
|
public SelectFromMultiSelect(
|
|
|
|
|
|
options: string[],
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
check = true,
|
2022-06-25 05:30:54 +00:00
|
|
|
|
endpoint = "multiselectwidgetv2",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.ScrollIntoView(
|
|
|
|
|
|
this.locator._widgetInDeployed(endpoint) + " div.rc-select-selector",
|
|
|
|
|
|
index,
|
|
|
|
|
|
)
|
2022-06-25 05:30:54 +00:00
|
|
|
|
.then(($element: any) => {
|
|
|
|
|
|
// here, we try to click on downArrow in dropdown of multiSelect.
|
|
|
|
|
|
// the position is calculated from top left of the element
|
|
|
|
|
|
const dropdownCenterPosition = +$element.height / 2;
|
|
|
|
|
|
const dropdownArrowApproxPosition = +$element.width - 10;
|
|
|
|
|
|
cy.get($element).click(
|
|
|
|
|
|
dropdownArrowApproxPosition,
|
|
|
|
|
|
dropdownCenterPosition,
|
|
|
|
|
|
{
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
2023-06-15 13:21:11 +00:00
|
|
|
|
})
|
|
|
|
|
|
.wait(500); //for dropdown options to settle
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
|
|
|
|
|
if (check) {
|
|
|
|
|
|
options.forEach(($each) => {
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each))
|
|
|
|
|
|
.check({ force: true })
|
2022-09-02 01:05:45 +00:00
|
|
|
|
.wait(1000);
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each)).should("be.checked");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
options.forEach(($each) => {
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each))
|
|
|
|
|
|
.uncheck({ force: true })
|
2022-09-02 01:05:45 +00:00
|
|
|
|
.wait(1000);
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each)).should(
|
|
|
|
|
|
"not.be.checked",
|
|
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// //closing multiselect dropdown
|
2022-08-27 12:40:11 +00:00
|
|
|
|
this.PressEscape();
|
2022-06-23 15:13:15 +00:00
|
|
|
|
// cy.get(this.locator._widgetInDeployed(endpoint))
|
2022-05-18 10:39:42 +00:00
|
|
|
|
// .eq(index)
|
|
|
|
|
|
// .click()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-14 11:23:42 +00:00
|
|
|
|
public PressEscape(sleep = 500) {
|
2022-07-21 13:01:23 +00:00
|
|
|
|
cy.get("body").type("{esc}");
|
2023-09-14 11:23:42 +00:00
|
|
|
|
this.Sleep(sleep);
|
2022-07-06 15:22:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-14 11:23:42 +00:00
|
|
|
|
public PressEnter(sleep = 500) {
|
2022-10-20 07:09:42 +00:00
|
|
|
|
cy.get("body").type("{enter}");
|
2023-09-14 11:23:42 +00:00
|
|
|
|
this.Sleep(sleep);
|
2022-10-20 07:09:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-14 11:23:42 +00:00
|
|
|
|
public PressDelete(sleep = 500) {
|
2022-08-27 12:40:11 +00:00
|
|
|
|
cy.get("body").type(`{del}`, { force: true });
|
2023-09-14 11:23:42 +00:00
|
|
|
|
this.Sleep(sleep);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-12 14:43:58 +00:00
|
|
|
|
public SelectAllWidgets() {
|
|
|
|
|
|
cy.get("body").type(this.isMac ? "{meta}A" : "{ctrl}A");
|
2023-05-30 02:40:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public SetCanvasViewportWidth(width: number) {
|
|
|
|
|
|
cy.get(this.locator._canvasViewport).invoke("width", `${width}px`);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-15 15:50:00 +00:00
|
|
|
|
public ClickOutside(x = 0, y = 0, force = true) {
|
|
|
|
|
|
cy.get("body").click(x, y, { force: force });
|
2023-05-19 18:37:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public RemoveMultiSelectItems(items: string[]) {
|
|
|
|
|
|
items.forEach(($each) => {
|
|
|
|
|
|
cy.xpath(this.locator._multiSelectItem($each))
|
|
|
|
|
|
.eq(0)
|
2023-02-14 16:07:31 +00:00
|
|
|
|
.click({ force: true })
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.wait(1000);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ReadSelectedDropDownValue() {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return cy.xpath(this.locator._selectedDropdownValue).first().invoke("text");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-23 10:32:35 +00:00
|
|
|
|
public EnterActionValue(
|
|
|
|
|
|
actionName: string,
|
|
|
|
|
|
value: string,
|
|
|
|
|
|
paste = true,
|
|
|
|
|
|
index = 0,
|
2023-04-06 16:49:12 +00:00
|
|
|
|
parseSpecialCharacters = false,
|
2022-11-23 10:32:35 +00:00
|
|
|
|
) {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.ScrollIntoView(this.locator._actionTextArea(actionName), index)
|
2023-04-10 19:54:10 +00:00
|
|
|
|
.parents(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.setValue("");
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
//Not working consistenly, hence commenting
|
|
|
|
|
|
// .focus()
|
|
|
|
|
|
// .type("{uparrow}", { force: true })
|
|
|
|
|
|
// .type("{ctrl}{shift}{downarrow}{del}", { force: true });
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.focused().then(($cm: any) => {
|
|
|
|
|
|
if ($cm.contents != "") {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.ScrollIntoView(this.locator._actionTextArea(actionName), index)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.click({ force: true })
|
|
|
|
|
|
.focused()
|
|
|
|
|
|
.clear({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
this.Sleep();
|
2023-06-20 08:58:06 +00:00
|
|
|
|
|
|
|
|
|
|
this.ScrollIntoView(this.locator._actionTextArea(actionName), index).then(
|
|
|
|
|
|
(el: any) => {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
if (paste) {
|
|
|
|
|
|
//input.invoke("val", value);
|
|
|
|
|
|
this.Paste(el, value);
|
|
|
|
|
|
} else {
|
2022-07-22 20:31:08 +00:00
|
|
|
|
cy.get(el).type(value, {
|
2023-04-06 16:49:12 +00:00
|
|
|
|
parseSpecialCharSequences: parseSpecialCharacters,
|
2022-03-25 11:14:12 +00:00
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
2023-06-20 08:58:06 +00:00
|
|
|
|
},
|
|
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.AssertAutoSave();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2023-02-02 07:59:24 +00:00
|
|
|
|
|
|
|
|
|
|
public VerifyCallCount(alias: string, expectedNumberOfCalls: number) {
|
|
|
|
|
|
cy.wait(alias);
|
|
|
|
|
|
cy.get(`${alias}.all`).should("have.length", expectedNumberOfCalls);
|
|
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
2023-07-21 05:53:17 +00:00
|
|
|
|
public GetNClickIfPresent(selector: string) {
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(selector).length > 0) {
|
|
|
|
|
|
cy.get(selector).click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-29 12:17:14 +00:00
|
|
|
|
public GetNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
2023-06-09 14:40:12 +00:00
|
|
|
|
ctrlKey = false,
|
2023-09-13 10:09:34 +00:00
|
|
|
|
metaKey = false,
|
2024-01-25 13:41:48 +00:00
|
|
|
|
position: Cypress.PositionType = "center",
|
2022-06-29 12:17:14 +00:00
|
|
|
|
) {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
return this.ScrollIntoView(selector, index)
|
2024-01-25 13:41:48 +00:00
|
|
|
|
.click(position, {
|
2023-09-20 19:11:08 +00:00
|
|
|
|
force: force,
|
|
|
|
|
|
ctrlKey: ctrlKey,
|
|
|
|
|
|
metaKey,
|
|
|
|
|
|
})
|
2024-02-08 11:25:58 +00:00
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
return cy.wrap($element).wait(waitTimeInterval);
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-07 06:52:06 +00:00
|
|
|
|
public GetClosestNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
closestSelector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
ctrlKey = false,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.ScrollIntoView(selector, index)
|
|
|
|
|
|
.closest(closestSelector)
|
|
|
|
|
|
.click({ force: force, ctrlKey: ctrlKey })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public GetHoverNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
) {
|
2023-08-01 09:34:15 +00:00
|
|
|
|
return (this.ScrollIntoView(selector, index) as any)
|
2023-06-15 13:21:11 +00:00
|
|
|
|
.realHover()
|
|
|
|
|
|
.click({ force: force })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-26 08:56:36 +00:00
|
|
|
|
public HoverElement(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
realTouch = true,
|
|
|
|
|
|
waitTimeInterval = 100,
|
|
|
|
|
|
) {
|
|
|
|
|
|
let chain = this.ScrollIntoView(selector, index);
|
|
|
|
|
|
if (realTouch) {
|
2023-08-01 09:34:15 +00:00
|
|
|
|
chain = (chain as any)
|
2023-06-16 18:40:10 +00:00
|
|
|
|
.realTouch({ position: "center" })
|
2023-07-26 08:56:36 +00:00
|
|
|
|
.realHover({ pointer: "mouse" });
|
|
|
|
|
|
}
|
|
|
|
|
|
return (
|
|
|
|
|
|
chain
|
2023-06-16 18:40:10 +00:00
|
|
|
|
//.trigger("mousemove", { eventConstructor: "MouseEvent" })
|
|
|
|
|
|
.wait(waitTimeInterval)
|
|
|
|
|
|
);
|
2023-06-15 13:21:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-02 05:49:51 +00:00
|
|
|
|
public GetSiblingNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
siblingSelector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.siblings(siblingSelector)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.eq(index)
|
2023-06-20 08:58:06 +00:00
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
Cypress.$("body").find($element).length &&
|
|
|
|
|
|
$element[0].offsetParent !== null
|
|
|
|
|
|
) {
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$element[0].scrollIntoView();
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2022-12-02 05:49:51 +00:00
|
|
|
|
.click({ force: force })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GoBack() {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
this.GetNClick(this.locator._goBack);
|
2022-11-30 05:59:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 09:49:32 +00:00
|
|
|
|
public SelectAllAndType(selector: string, text: string) {
|
|
|
|
|
|
this.GetElement(selector).type("{selectall}" + text);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 14:23:41 +00:00
|
|
|
|
public SelectNRemoveLineText(selector: string) {
|
2023-07-03 05:08:01 +00:00
|
|
|
|
this.GetElement(selector).type(this.selectLine);
|
|
|
|
|
|
return this.GetElement(selector).type(this.removeLine);
|
2022-08-24 14:23:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-01 20:58:48 +00:00
|
|
|
|
public SelectAllRemoveCodeText(selector: string) {
|
2023-07-03 05:08:01 +00:00
|
|
|
|
return this.GetElement(selector).type(this.selectAll + "{del}");
|
2023-03-01 20:58:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-11 08:32:01 +00:00
|
|
|
|
public RemoveCharsNType(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
charCount = 0,
|
|
|
|
|
|
totype: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
2022-08-27 12:40:11 +00:00
|
|
|
|
if (charCount > 0)
|
|
|
|
|
|
this.GetElement(selector)
|
2023-08-11 08:32:01 +00:00
|
|
|
|
.eq(index)
|
2022-08-27 12:40:11 +00:00
|
|
|
|
.focus()
|
|
|
|
|
|
.type("{backspace}".repeat(charCount), { timeout: 2, force: true })
|
|
|
|
|
|
.wait(50)
|
|
|
|
|
|
.type(totype);
|
|
|
|
|
|
else {
|
2023-08-11 08:32:01 +00:00
|
|
|
|
if (charCount == -1) this.GetElement(selector).eq(index).clear();
|
|
|
|
|
|
this.TypeText(selector, totype, index);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-12-07 11:58:42 +00:00
|
|
|
|
|
2023-09-14 11:23:42 +00:00
|
|
|
|
public ClickNClear(selector: string, force = false, index = 0) {
|
|
|
|
|
|
this.GetNClick(selector, index, force);
|
|
|
|
|
|
this.ClearTextField(selector, force, index);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public ClearTextField(selector: string, force = false, index = 0) {
|
2024-05-02 04:40:13 +00:00
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.scrollIntoView({ easing: "linear" })
|
|
|
|
|
|
.click()
|
|
|
|
|
|
.clear({ force });
|
2023-08-08 09:14:46 +00:00
|
|
|
|
this.Sleep(500); //for text to clear for CI runs
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public ClearNType(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
totype: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
) {
|
|
|
|
|
|
this.ClearTextField(selector, force, index);
|
2024-02-27 08:55:33 +00:00
|
|
|
|
return this.TypeText(selector, totype, index);
|
2022-12-02 05:49:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-09 05:06:52 +00:00
|
|
|
|
public TypeText(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
value: string,
|
2023-08-03 19:25:03 +00:00
|
|
|
|
indexOrOptions:
|
|
|
|
|
|
| number
|
|
|
|
|
|
| Partial<{
|
|
|
|
|
|
index: number;
|
|
|
|
|
|
parseSpecialCharSeq: boolean;
|
|
|
|
|
|
shouldFocus: boolean;
|
2023-08-21 12:09:26 +00:00
|
|
|
|
delay: number;
|
2025-03-14 12:10:02 +00:00
|
|
|
|
clear: boolean;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
}> = 0,
|
2022-12-09 05:06:52 +00:00
|
|
|
|
) {
|
2023-08-03 19:25:03 +00:00
|
|
|
|
let index: number;
|
|
|
|
|
|
let shouldFocus = true;
|
|
|
|
|
|
let parseSpecialCharSeq = false;
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
let delay = 10;
|
2025-03-14 12:10:02 +00:00
|
|
|
|
let clear = false;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
|
|
|
|
|
|
if (typeof indexOrOptions === "number") {
|
|
|
|
|
|
index = indexOrOptions;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
index = indexOrOptions.index || 0;
|
|
|
|
|
|
parseSpecialCharSeq = indexOrOptions.parseSpecialCharSeq || false;
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
delay = indexOrOptions.delay || 10;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
shouldFocus =
|
|
|
|
|
|
indexOrOptions.shouldFocus !== undefined
|
|
|
|
|
|
? indexOrOptions.shouldFocus
|
|
|
|
|
|
: true;
|
2025-03-14 12:10:02 +00:00
|
|
|
|
clear = indexOrOptions.clear || false;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const element = this.GetElement(selector).eq(index);
|
|
|
|
|
|
|
|
|
|
|
|
if (shouldFocus) {
|
|
|
|
|
|
element.focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-02 04:40:13 +00:00
|
|
|
|
if (value === "") return element;
|
|
|
|
|
|
|
2025-03-14 12:10:02 +00:00
|
|
|
|
if (clear) {
|
|
|
|
|
|
return element.wait(100).clear().type(value, {
|
|
|
|
|
|
parseSpecialCharSequences: parseSpecialCharSeq,
|
|
|
|
|
|
delay: delay,
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-03 19:25:03 +00:00
|
|
|
|
return element.wait(100).type(value, {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
parseSpecialCharSequences: parseSpecialCharSeq,
|
2023-08-21 12:09:26 +00:00
|
|
|
|
delay: delay,
|
2023-04-06 16:49:12 +00:00
|
|
|
|
force: true,
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
});
|
2022-08-24 14:23:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-18 06:30:28 +00:00
|
|
|
|
public ContainsNClick(
|
|
|
|
|
|
text: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return cy
|
|
|
|
|
|
.contains(text)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.click({ force: force })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-23 05:20:27 +00:00
|
|
|
|
public GetNClickByContains(
|
|
|
|
|
|
selector: string,
|
2023-08-01 11:12:44 +00:00
|
|
|
|
containsText: string | RegExp,
|
2022-05-23 05:20:27 +00:00
|
|
|
|
index = 0,
|
2023-06-15 13:21:11 +00:00
|
|
|
|
force = true,
|
2023-06-30 18:46:57 +00:00
|
|
|
|
waitTimeInterval = 500,
|
2022-05-23 05:20:27 +00:00
|
|
|
|
) {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
return cy
|
|
|
|
|
|
.get(selector)
|
2023-10-27 13:13:28 +00:00
|
|
|
|
.contains(containsText, { matchCase: false })
|
2022-05-23 05:20:27 +00:00
|
|
|
|
.eq(index)
|
2023-06-15 13:21:11 +00:00
|
|
|
|
.click({ force: force })
|
2023-06-30 18:46:57 +00:00
|
|
|
|
.wait(waitTimeInterval);
|
2022-05-23 05:20:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public CheckUncheck(selector: string, check = true) {
|
|
|
|
|
|
if (check) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
this.GetElement(selector).check({ force: true }).should("be.checked");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
} else {
|
2022-12-09 05:06:52 +00:00
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.uncheck({ force: true })
|
|
|
|
|
|
.should("not.be.checked");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
this.Sleep();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AssertExistingToggleState(
|
|
|
|
|
|
propertyName: string,
|
2023-05-19 18:37:06 +00:00
|
|
|
|
toggle: "true" | "false",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2023-08-30 10:54:37 +00:00
|
|
|
|
this.GetElement(this.locator._propertyToggleValue(propertyName))
|
|
|
|
|
|
.invoke("attr", "data-checked")
|
|
|
|
|
|
.then((classes) => {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
expect(classes).includes(toggle);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public AssertExistingCheckedState(selector: string, toggle = "true") {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.invoke("attr", "data-selected-value")
|
|
|
|
|
|
.then((dataSelectedValue) => {
|
|
|
|
|
|
if (dataSelectedValue !== undefined) {
|
|
|
|
|
|
this.GetElement(selector).should(
|
|
|
|
|
|
"have.attr",
|
|
|
|
|
|
"data-selected-value",
|
|
|
|
|
|
toggle,
|
|
|
|
|
|
);
|
|
|
|
|
|
} else
|
|
|
|
|
|
this.GetElement(selector).should(
|
|
|
|
|
|
toggle == "true" ? "be.checked" : "not.be.checked",
|
|
|
|
|
|
);
|
|
|
|
|
|
});
|
2023-05-19 18:37:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AssertSelectedTab(propertyName: string, value: "true" | "false") {
|
|
|
|
|
|
let locator;
|
|
|
|
|
|
if (propertyName.startsWith("//")) {
|
|
|
|
|
|
locator = cy.xpath(propertyName);
|
|
|
|
|
|
locator.should("have.attr", "aria-checked", value);
|
|
|
|
|
|
} else if (propertyName.includes(" ")) {
|
|
|
|
|
|
locator = cy.get(propertyName);
|
|
|
|
|
|
locator.should("have.attr", "aria-checked", value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-09 05:06:52 +00:00
|
|
|
|
public AssertAttribute(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
attribName: string,
|
2023-09-07 18:18:33 +00:00
|
|
|
|
attribValue: any,
|
2023-06-15 13:21:11 +00:00
|
|
|
|
index = 0,
|
2022-12-09 05:06:52 +00:00
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.attr", attribName, attribValue);
|
2022-12-09 05:06:52 +00:00
|
|
|
|
}
|
2023-08-28 07:13:07 +00:00
|
|
|
|
|
|
|
|
|
|
public AssertProperty(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
propName: string,
|
2023-09-07 18:18:33 +00:00
|
|
|
|
propValue: any,
|
2023-08-28 07:13:07 +00:00
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.prop", propName, propValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-03 06:33:27 +00:00
|
|
|
|
public AssertCSS(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
cssName: string,
|
|
|
|
|
|
cssValue: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.css", cssName, cssValue);
|
|
|
|
|
|
}
|
2022-12-09 05:06:52 +00:00
|
|
|
|
|
2022-06-24 08:22:29 +00:00
|
|
|
|
public ToggleSwitch(
|
|
|
|
|
|
switchName: string,
|
|
|
|
|
|
toggle: "check" | "uncheck" = "check",
|
2022-07-06 05:54:00 +00:00
|
|
|
|
jsonSwitch = false,
|
2022-06-24 08:22:29 +00:00
|
|
|
|
) {
|
2022-07-06 05:54:00 +00:00
|
|
|
|
const locator = jsonSwitch
|
|
|
|
|
|
? cy.xpath(this.locator._jsonToggle(switchName))
|
|
|
|
|
|
: cy.xpath(this.locator._switchToggle(switchName));
|
2022-06-29 12:17:14 +00:00
|
|
|
|
const parentLoc = locator.parent("label");
|
2022-06-24 08:22:29 +00:00
|
|
|
|
if (toggle == "check")
|
|
|
|
|
|
parentLoc.then(($parent) => {
|
|
|
|
|
|
if (!$parent.hasClass("t--switch-widget-active")) {
|
|
|
|
|
|
locator.click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
else
|
|
|
|
|
|
parentLoc.then(($parent) => {
|
|
|
|
|
|
if (!$parent.hasClass("t--switch-widget-inactive")) {
|
|
|
|
|
|
locator.click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public GenerateUUID() {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
let id = uuidv4();
|
|
|
|
|
|
id = "Cy" + id.split("-")[0];
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.wrap(id).as("guid");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GetObjectName() {
|
|
|
|
|
|
//cy.get(this.locator._queryName).invoke("text").then((text) => cy.wrap(text).as("queryName")); or below syntax
|
2025-02-06 08:33:54 +00:00
|
|
|
|
return cy.get(this.locator._activeEntityTab).invoke("text");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-31 05:33:59 +00:00
|
|
|
|
public GetElementLength(selector: string) {
|
2023-06-21 17:37:21 +00:00
|
|
|
|
return this.GetElement(selector).its("length");
|
2022-05-31 05:33:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public Sleep(timeout = 1000) {
|
2023-07-03 06:33:27 +00:00
|
|
|
|
return cy.wait(timeout);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-29 06:22:05 +00:00
|
|
|
|
public RefreshPage(
|
2023-07-20 13:15:27 +00:00
|
|
|
|
networkCallAlias = "getWorkspace", // reloadWithoutCache = true,
|
2023-06-29 06:22:05 +00:00
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.Sleep(2000);
|
|
|
|
|
|
this.assertHelper.AssertDocumentReady();
|
2023-07-06 05:13:15 +00:00
|
|
|
|
// // cy.window()
|
|
|
|
|
|
// // .then((win) => {
|
|
|
|
|
|
// // win.location.reload();
|
|
|
|
|
|
// // })
|
|
|
|
|
|
// cy.reload(reloadWithoutCache).then(() => {
|
|
|
|
|
|
// this.assertHelper.AssertDocumentReady();
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
cy.url().then((url) => {
|
|
|
|
|
|
cy.window({ timeout: 60000 }).then((win) => {
|
|
|
|
|
|
win.location.href = url;
|
|
|
|
|
|
});
|
2023-06-15 13:21:11 +00:00
|
|
|
|
});
|
2023-11-06 09:48:00 +00:00
|
|
|
|
this.AssertElementAbsence(
|
|
|
|
|
|
this.locator._specificToast("Cannot read properties of undefined"),
|
|
|
|
|
|
);
|
2023-07-06 05:13:15 +00:00
|
|
|
|
this.assertHelper.AssertDocumentReady();
|
2023-10-25 14:03:07 +00:00
|
|
|
|
this.Sleep(4000); //for page to load for CI runs
|
2023-08-18 05:18:35 +00:00
|
|
|
|
networkCallAlias &&
|
|
|
|
|
|
this.assertHelper.AssertNetworkStatus("@" + networkCallAlias); //getWorkspace for Edit page!
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-02-08 11:25:58 +00:00
|
|
|
|
public CypressReload() {
|
|
|
|
|
|
cy.reload();
|
|
|
|
|
|
this.assertHelper.AssertDocumentReady();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public ActionContextMenuWithInPane({
|
|
|
|
|
|
action = "Delete",
|
|
|
|
|
|
entityType = EntityItems.JSObject,
|
2023-10-11 07:14:38 +00:00
|
|
|
|
subAction = "",
|
2023-06-15 13:21:11 +00:00
|
|
|
|
toastToValidate = "",
|
|
|
|
|
|
}: DeleteParams) {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.get(this.locator._contextMenuInPane).click();
|
2023-05-19 18:37:06 +00:00
|
|
|
|
this.GetNClick(this.locator._contextMenuItem(action));
|
2022-05-18 10:39:42 +00:00
|
|
|
|
if (action == "Delete") {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.DeleteEntityNAssert(entityType);
|
|
|
|
|
|
} else if (subAction) {
|
|
|
|
|
|
this.ActionContextMenuSubItem({
|
|
|
|
|
|
subAction: subAction,
|
|
|
|
|
|
toastToValidate: toastToValidate,
|
|
|
|
|
|
});
|
|
|
|
|
|
toastToValidate && this.AssertContains(toastToValidate);
|
2022-06-10 13:30:59 +00:00
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-16 18:40:10 +00:00
|
|
|
|
public DeleteEntityNAssert(
|
|
|
|
|
|
entityType: EntityItemsType,
|
|
|
|
|
|
toAssertAction = true,
|
|
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
if (entityType != EntityItems.Widget)
|
|
|
|
|
|
this.GetNClick(this.locator._contextMenuItem("Are you sure?"));
|
2023-08-21 07:49:28 +00:00
|
|
|
|
this.Sleep();
|
2023-06-15 13:21:11 +00:00
|
|
|
|
toAssertAction && this.assertHelper.AssertDelete(entityType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ActionContextMenuSubItem({
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
subAction,
|
|
|
|
|
|
toastToValidate = "",
|
|
|
|
|
|
}: SubActionParams) {
|
2024-10-25 16:22:41 +00:00
|
|
|
|
cy.xpath(this.locator._contextMenuItem(subAction)).trigger("click", {
|
|
|
|
|
|
force: force,
|
|
|
|
|
|
});
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.Sleep(500);
|
|
|
|
|
|
toastToValidate && this.AssertContains(toastToValidate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-04 04:48:15 +00:00
|
|
|
|
public EnterValueNValidate(valueToType: string, fieldName = "") {
|
2022-06-06 05:59:15 +00:00
|
|
|
|
this.EnterValue(valueToType, {
|
|
|
|
|
|
propFieldName: fieldName,
|
|
|
|
|
|
directInput: false,
|
|
|
|
|
|
inputFieldName: "",
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.VerifyEvaluatedValue(valueToType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
// by dynamic input value we mean QUERY_DYNAMIC_INPUT_TEXT formControls.
|
2023-02-09 11:09:54 +00:00
|
|
|
|
public TypeDynamicInputValueNValidate(
|
|
|
|
|
|
valueToType: string,
|
|
|
|
|
|
fieldName = "",
|
|
|
|
|
|
isDynamicValue = false,
|
|
|
|
|
|
evaluatedValue = valueToType,
|
|
|
|
|
|
) {
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
this.EnterValue(valueToType, {
|
|
|
|
|
|
propFieldName: fieldName,
|
|
|
|
|
|
directInput: true,
|
|
|
|
|
|
inputFieldName: "",
|
|
|
|
|
|
});
|
2023-02-09 11:09:54 +00:00
|
|
|
|
if (!isDynamicValue) {
|
|
|
|
|
|
this.AssertElementAbsence(this.locator._evaluatedCurrentValue);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.VerifyEvaluatedValue(evaluatedValue);
|
|
|
|
|
|
}
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-06 05:59:15 +00:00
|
|
|
|
public EnterValue(
|
|
|
|
|
|
valueToEnter: string,
|
|
|
|
|
|
options: IEnterValue = DEFAULT_ENTERVALUE_OPTIONS,
|
2024-02-08 11:25:58 +00:00
|
|
|
|
toVerifySave = true,
|
2022-06-06 05:59:15 +00:00
|
|
|
|
) {
|
2023-08-10 07:06:03 +00:00
|
|
|
|
const { apiOrQuery, directInput, inputFieldName, propFieldName } = options;
|
2022-07-01 05:26:57 +00:00
|
|
|
|
if (propFieldName && directInput && !inputFieldName) {
|
2023-08-10 07:06:03 +00:00
|
|
|
|
this.UpdateCodeInput(propFieldName, valueToEnter, apiOrQuery);
|
2022-06-06 05:59:15 +00:00
|
|
|
|
} else if (inputFieldName && !propFieldName && !directInput) {
|
2023-05-11 05:26:03 +00:00
|
|
|
|
this.UpdateCodeInput(
|
|
|
|
|
|
this.locator._inputFieldByName(inputFieldName),
|
|
|
|
|
|
valueToEnter,
|
2022-06-06 05:59:15 +00:00
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
2024-02-08 11:25:58 +00:00
|
|
|
|
toVerifySave && this.AssertAutoSave();
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
public VerifyCodeInputValue(propFieldName: string, value: string) {
|
|
|
|
|
|
cy.get(propFieldName).then(($field: any) => {
|
|
|
|
|
|
this.CheckCodeInputValue($field, value);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public BlurInput(propFieldName: string) {
|
|
|
|
|
|
cy.get(propFieldName).then(($field: any) => {
|
|
|
|
|
|
this.BlurCodeInput($field);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-21 11:22:55 +00:00
|
|
|
|
public EnterInputText(
|
|
|
|
|
|
name: string,
|
|
|
|
|
|
input: string,
|
|
|
|
|
|
toClear = false,
|
|
|
|
|
|
isInput = true,
|
|
|
|
|
|
) {
|
|
|
|
|
|
toClear && this.ClearInputText(name);
|
2022-06-16 06:50:02 +00:00
|
|
|
|
cy.xpath(this.locator._inputWidgetValueField(name, isInput))
|
2022-06-21 11:22:55 +00:00
|
|
|
|
.trigger("click")
|
2022-09-16 06:21:25 +00:00
|
|
|
|
.type(input, { parseSpecialCharSequences: false });
|
2022-06-16 06:50:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ClearInputText(name: string, isInput = true) {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
cy.xpath(this.locator._inputWidgetValueField(name, isInput)).clear({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
2022-06-16 06:50:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-10 07:06:03 +00:00
|
|
|
|
public UpdateCodeInput(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
value: string,
|
|
|
|
|
|
apiOrQuery: "api" | "query" = "query",
|
|
|
|
|
|
) {
|
2023-05-11 05:26:03 +00:00
|
|
|
|
this.EnableAllCodeEditors();
|
|
|
|
|
|
|
|
|
|
|
|
const isXPathSelector =
|
|
|
|
|
|
selector.startsWith("//") || selector.startsWith("(//");
|
|
|
|
|
|
// A previous version of this code used a more simple `this.GetElement(xPathOrCssSelector).find(".CodeMirror")` command.
|
|
|
|
|
|
// However, occasionally, this would lead to a race condition: React would re-render between calls to `this.GetElement()`
|
|
|
|
|
|
// and `.find(".CodeMirror")`, causing the element from the first call to be detached from the DOM.
|
|
|
|
|
|
// Relevant docs: http://web.archive.org/web/20210618235924/https://docs.cypress.io/guides/core-concepts/retry-ability#Only-the-last-command-is-retried
|
|
|
|
|
|
//
|
|
|
|
|
|
// This was fixed in Cypress 12 (https://github.com/cypress-io/cypress/issues/7306), which started to retry
|
|
|
|
|
|
// the entire query chain (https://docs.cypress.io/guides/core-concepts/retry-ability#Only-queries-are-retried),
|
|
|
|
|
|
// but until we’ve upgraded to v12, we can’t rely on that and have to fit everything into a single query.
|
|
|
|
|
|
const codeMirrorSelector = isXPathSelector
|
|
|
|
|
|
? selector +
|
|
|
|
|
|
"//*[contains(concat(' ', normalize-space(@class), ' '), ' CodeMirror ')]"
|
|
|
|
|
|
: selector + " .CodeMirror";
|
|
|
|
|
|
this.GetElement(codeMirrorSelector)
|
2022-08-18 06:30:28 +00:00
|
|
|
|
.find("textarea")
|
|
|
|
|
|
.parents(".CodeMirror")
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.first()
|
2023-05-11 05:26:03 +00:00
|
|
|
|
.then((ins) => {
|
|
|
|
|
|
const input = (ins[0] as any).CodeMirror as CodeMirror.Editor;
|
2023-08-10 07:06:03 +00:00
|
|
|
|
if (apiOrQuery === "api") {
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
input.setValue(value);
|
|
|
|
|
|
setTimeout(() => {
|
2023-12-11 09:09:36 +00:00
|
|
|
|
input.execCommand("goLineStart");
|
2023-08-10 07:06:03 +00:00
|
|
|
|
// Move cursor to the end of the line
|
|
|
|
|
|
input.execCommand("goLineEnd");
|
2023-11-03 06:57:24 +00:00
|
|
|
|
}, 1000);
|
2023-10-27 13:13:28 +00:00
|
|
|
|
}, 500);
|
|
|
|
|
|
}, 500);
|
2023-08-10 07:06:03 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.setValue(value);
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.execCommand("goLineEnd");
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.Sleep(); //for value set to register
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-20 08:58:06 +00:00
|
|
|
|
public UpdateFieldInput(selector: string, value: string) {
|
2023-04-04 15:56:57 +00:00
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.find("input")
|
|
|
|
|
|
.invoke("attr", "value", value)
|
|
|
|
|
|
.trigger("input");
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.Sleep(); //for value set to register
|
2023-04-04 15:56:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 10:29:05 +00:00
|
|
|
|
public ValidateFieldInputValue(selector: string, value: string) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.closest("input")
|
|
|
|
|
|
.scrollIntoView({ easing: "linear" })
|
|
|
|
|
|
.invoke("val")
|
|
|
|
|
|
.then((inputValue) => {
|
|
|
|
|
|
expect(inputValue).to.equal(value);
|
|
|
|
|
|
});
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.Sleep(); //for value set to register
|
2023-07-24 10:29:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-28 20:07:07 +00:00
|
|
|
|
public UpdateTextArea(selector: string, value: string) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.find("textarea")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.invoke("val", value)
|
|
|
|
|
|
.trigger("input");
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.Sleep(500); //for value set to register
|
2023-03-28 20:07:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-06 04:07:04 +00:00
|
|
|
|
public TypeIntoTextArea(selector: string, value: string) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.find("textarea")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.type(value, { delay: 0, force: true, parseSpecialCharSequences: false });
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.Sleep(500); //for value set to register
|
2023-04-06 04:07:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
public BlurCodeInput(selector: string) {
|
|
|
|
|
|
cy.wrap(selector)
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.display.input.blur();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-09 11:09:54 +00:00
|
|
|
|
public FocusCodeInput(selector: string) {
|
|
|
|
|
|
cy.wrap(selector)
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
// input.display.input.blur();
|
|
|
|
|
|
// this.Sleep(200);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DragEvaluatedValuePopUp(x: number, y: number) {
|
2023-08-01 09:34:15 +00:00
|
|
|
|
(
|
|
|
|
|
|
cy
|
|
|
|
|
|
.get(this.locator._evaluatedCurrentValue)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.should("be.visible") as any
|
|
|
|
|
|
).realHover({ pointer: "mouse" });
|
2023-02-09 11:09:54 +00:00
|
|
|
|
cy.get(this.locator._evaluatedValuePopDragHandler)
|
|
|
|
|
|
.trigger("mousedown", { which: 1 })
|
|
|
|
|
|
.trigger("mousemove", { clientX: x, clientY: y })
|
|
|
|
|
|
.trigger("mouseup", { force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public FocusAndDragEvaluatedValuePopUp(
|
|
|
|
|
|
options: IEnterValue = DEFAULT_ENTERVALUE_OPTIONS,
|
|
|
|
|
|
x = 0,
|
|
|
|
|
|
y = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
const { directInput, inputFieldName, propFieldName } = options;
|
|
|
|
|
|
if (propFieldName && directInput && !inputFieldName) {
|
|
|
|
|
|
cy.get(propFieldName).then(($field: any) => {
|
|
|
|
|
|
this.FocusCodeInput($field);
|
|
|
|
|
|
this.DragEvaluatedValuePopUp(x, y);
|
|
|
|
|
|
});
|
|
|
|
|
|
} else if (inputFieldName && !propFieldName && !directInput) {
|
|
|
|
|
|
cy.xpath(this.locator._inputFieldByName(inputFieldName)).then(
|
|
|
|
|
|
($field: any) => {
|
|
|
|
|
|
this.FocusCodeInput($field);
|
|
|
|
|
|
this.DragEvaluatedValuePopUp(x, y);
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
public CheckCodeInputValue(selector: string, expectedValue: string) {
|
|
|
|
|
|
cy.wrap(selector)
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
const inputVal = input.getValue();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
expect(inputVal).to.eq(expectedValue);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-09 11:09:54 +00:00
|
|
|
|
public ReturnCodeInputValue(selector: string) {
|
|
|
|
|
|
let inputVal = "";
|
|
|
|
|
|
this.GetElement(selector).then(($field) => {
|
|
|
|
|
|
cy.wrap($field)
|
|
|
|
|
|
.find(".CodeMirror-code span")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.invoke("text")
|
|
|
|
|
|
.then((text1) => {
|
|
|
|
|
|
inputVal = text1;
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
//if (currentValue) expect(val).to.eq(currentValue);
|
|
|
|
|
|
// to be chained with another cy command.
|
|
|
|
|
|
return cy.wrap(inputVal);
|
|
|
|
|
|
|
|
|
|
|
|
// cy.xpath(this.locator._existingFieldValueByName(selector)).then(
|
|
|
|
|
|
// ($field: any) => {
|
|
|
|
|
|
// cy.wrap($field)
|
|
|
|
|
|
// .find(".CodeMirror")
|
|
|
|
|
|
// .first()
|
|
|
|
|
|
// .then((ins: any) => {
|
|
|
|
|
|
// const input = ins[0].CodeMirror;
|
|
|
|
|
|
// inputVal = input.getValue();
|
|
|
|
|
|
// this.Sleep(200);
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
// // to be chained with another cy command.
|
|
|
|
|
|
// return inputVal;
|
|
|
|
|
|
// },
|
|
|
|
|
|
// );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-21 10:25:41 +00:00
|
|
|
|
public VerifyEvaluatedErrorMessage(errorMessage: string) {
|
|
|
|
|
|
cy.get(this.locator._evaluatedErrorMessage)
|
|
|
|
|
|
.should("be.visible")
|
|
|
|
|
|
.should("have.text", errorMessage);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-09 11:09:54 +00:00
|
|
|
|
// this should only be used when we want to verify the evaluated value of dynamic bindings for example {{Api1.data}} or {{"asa"}}
|
|
|
|
|
|
// and should not be called for plain strings
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public VerifyEvaluatedValue(currentValue: string) {
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.GetElement(this.locator._evaluatedCurrentValue)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.first()
|
|
|
|
|
|
.should("be.visible")
|
|
|
|
|
|
.should("not.have.text", "undefined");
|
2024-01-05 06:12:03 +00:00
|
|
|
|
this.GetElement(this.locator._evaluatedCurrentValue)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.first()
|
|
|
|
|
|
.click({ force: true })
|
|
|
|
|
|
.then(($text) => {
|
|
|
|
|
|
if ($text.text()) expect($text.text()).to.eq(currentValue);
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
})
|
2024-01-05 06:12:03 +00:00
|
|
|
|
.trigger("mouseout");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public UploadFile(fixtureName: string, toClickUpload = true, index = 0) {
|
2023-05-24 12:30:39 +00:00
|
|
|
|
//cy.fixture(fixtureName).as("selectFileFixture");//giving issue, hence using directly as below
|
|
|
|
|
|
cy.get(this.locator._uploadFiles)
|
2023-08-21 07:49:28 +00:00
|
|
|
|
.eq(index)
|
2023-05-24 12:30:39 +00:00
|
|
|
|
.selectFile("cypress/fixtures/" + fixtureName, { force: true })
|
|
|
|
|
|
.wait(3000);
|
2022-09-07 18:25:55 +00:00
|
|
|
|
toClickUpload && this.GetNClick(this.locator._uploadBtn, 0, false);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-02 01:05:45 +00:00
|
|
|
|
public AssertElementAbsence(selector: ElementType, timeout = 0) {
|
2022-06-06 05:59:15 +00:00
|
|
|
|
//Should not exists - cannot take indexes
|
2023-12-11 09:09:36 +00:00
|
|
|
|
return this.GetElement(selector, "not.exist", timeout).should("not.exist");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-23 05:20:27 +00:00
|
|
|
|
public GetText(
|
2022-08-27 12:40:11 +00:00
|
|
|
|
selector: ElementType,
|
2022-05-23 05:20:27 +00:00
|
|
|
|
textOrValue: "text" | "val" = "text",
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return this.GetElement(selector).eq(index).invoke(textOrValue);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-20 12:08:48 +00:00
|
|
|
|
AssertHeight(selector: ElementType, height: number) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.invoke("height")
|
2023-04-20 15:12:35 +00:00
|
|
|
|
.should("be.closeTo", height, 1);
|
2022-10-20 12:08:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-02 01:05:45 +00:00
|
|
|
|
public AssertText(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
textOrValue: "text" | "val" = "text",
|
|
|
|
|
|
expectedData: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.invoke(textOrValue)
|
|
|
|
|
|
.should("deep.equal", expectedData);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-11 14:42:32 +00:00
|
|
|
|
public AssertElementFocus(selector: ElementType, isFocused = true) {
|
|
|
|
|
|
if (isFocused) return this.GetElement(selector).should("be.focused");
|
|
|
|
|
|
return this.GetElement(selector).should("not.be.focused");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-10 07:06:03 +00:00
|
|
|
|
public AssertElementVisibility(
|
2023-04-11 19:04:32 +00:00
|
|
|
|
selector: ElementType,
|
2023-08-10 07:06:03 +00:00
|
|
|
|
visibility = true,
|
2023-04-11 19:04:32 +00:00
|
|
|
|
index = 0,
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
timeout = Cypress.config("pageLoadTimeout"),
|
2023-04-11 19:04:32 +00:00
|
|
|
|
) {
|
2023-12-11 09:09:36 +00:00
|
|
|
|
return this.GetElement(selector, "exist", timeout)
|
2022-06-10 13:30:59 +00:00
|
|
|
|
.eq(index)
|
|
|
|
|
|
.scrollIntoView()
|
2023-08-10 07:06:03 +00:00
|
|
|
|
.should(visibility == true ? "be.visible" : "not.be.visible");
|
2023-08-08 18:10:22 +00:00
|
|
|
|
//return this.ScrollIntoView(selector, index, timeout).should("be.visible");//to find out why this is failing.
|
2023-08-01 04:02:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-22 11:50:05 +00:00
|
|
|
|
IsElementVisible(selector: ElementType) {
|
|
|
|
|
|
return this.GetElement(selector).then(($element) =>
|
|
|
|
|
|
Cypress.$($element).length > 0 ? true : false,
|
|
|
|
|
|
) as Cypress.Chainable<boolean>;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-09-06 05:01:32 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Checks if the specified instance of the element is present with number and visible on the page.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {ElementType} selector - The element selector.
|
|
|
|
|
|
* @param {number} [eq=0] - The index of the element to check (default is 0).
|
|
|
|
|
|
* @returns {Cypress.Chainable<boolean>} - Returns a boolean wrapped in a Cypress Chainable indicating visibility.
|
|
|
|
|
|
*/
|
|
|
|
|
|
IsElementVisibleWithEq(selector: ElementType, eq: number = 0) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(eq)
|
|
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
// Check if the element is present and visible
|
|
|
|
|
|
const isVisible =
|
|
|
|
|
|
Cypress.$($element).length > 0 && Cypress.$($element).is(":visible");
|
|
|
|
|
|
console.log(`Element visibility: ${isVisible}`);
|
|
|
|
|
|
return isVisible;
|
|
|
|
|
|
}) as Cypress.Chainable<boolean>;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
public FailIfErrorToast(error: string) {
|
2023-01-18 09:24:15 +00:00
|
|
|
|
cy.get("body").then(($ele) => {
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
if ($ele.find(this.locator._toastMsg).length > 0) {
|
|
|
|
|
|
if ($ele.find(this.locator._specificToast(error)).length > 0) {
|
2023-01-18 09:24:15 +00:00
|
|
|
|
throw new Error("Error Toast from Application:" + error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-11 09:09:36 +00:00
|
|
|
|
public AssertElementExist(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
timeout = Cypress.config("defaultCommandTimeout"),
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector, "exist", timeout)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("exist");
|
2022-05-31 05:33:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-11 09:09:36 +00:00
|
|
|
|
public ScrollIntoView(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
timeout = Cypress.config("defaultCommandTimeout"),
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector, "exist", timeout)
|
|
|
|
|
|
.should("have.length.at.least", 1)
|
2023-06-20 08:58:06 +00:00
|
|
|
|
.eq(index)
|
|
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
Cypress.$("body").find($element).length &&
|
|
|
|
|
|
$element[0].offsetParent !== null
|
|
|
|
|
|
) {
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$element[0].scrollIntoView();
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public AssertElementLength(
|
2022-08-27 12:40:11 +00:00
|
|
|
|
selector: ElementType,
|
2022-05-18 10:39:42 +00:00
|
|
|
|
length: number,
|
|
|
|
|
|
index: number | null = null,
|
|
|
|
|
|
) {
|
2022-08-27 12:40:11 +00:00
|
|
|
|
if (index)
|
2023-12-11 09:09:36 +00:00
|
|
|
|
return this.GetElement(selector, "noVerify")
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.length", length);
|
|
|
|
|
|
else
|
|
|
|
|
|
return this.GetElement(selector, "noVerify").should(
|
|
|
|
|
|
"have.length",
|
|
|
|
|
|
length,
|
|
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public FocusElement(selector: ElementType) {
|
|
|
|
|
|
this.GetElement(selector).focus();
|
2022-07-29 08:48:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public AssertContains(
|
|
|
|
|
|
text: string | RegExp,
|
2023-02-24 12:18:48 +00:00
|
|
|
|
exists: "exist" | "not.exist" | "be.visible" = "exist",
|
2022-10-17 15:16:38 +00:00
|
|
|
|
selector?: string,
|
2022-08-27 12:40:11 +00:00
|
|
|
|
) {
|
2023-12-15 12:32:43 +00:00
|
|
|
|
let timeout = Cypress.config().pageLoadTimeout;
|
2022-10-17 15:16:38 +00:00
|
|
|
|
if (selector) {
|
2023-12-15 12:32:43 +00:00
|
|
|
|
return cy.contains(selector, text, { timeout }).should(exists);
|
2022-10-17 15:16:38 +00:00
|
|
|
|
}
|
2023-12-15 12:32:43 +00:00
|
|
|
|
return cy.contains(text, { timeout }).should(exists);
|
2022-07-21 13:01:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public GetNAssertContains(
|
|
|
|
|
|
selector: ElementType,
|
2022-10-20 12:08:48 +00:00
|
|
|
|
text: string | number | RegExp,
|
2022-08-27 12:40:11 +00:00
|
|
|
|
exists: "exist" | "not.exist" = "exist",
|
|
|
|
|
|
) {
|
2023-12-11 09:09:36 +00:00
|
|
|
|
return this.GetElement(selector, "noVerify").contains(text).should(exists);
|
2022-08-04 04:48:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public AssertURL(url: string) {
|
2024-02-08 11:25:58 +00:00
|
|
|
|
this.WaitForCondition(() =>
|
|
|
|
|
|
cy.url().then((currentUrl) => {
|
|
|
|
|
|
return currentUrl.includes(url);
|
|
|
|
|
|
}),
|
test: Cypress | Flaky fixes + Replacing static waits (#30067)
## Description
- This PR includes the flaky fixes of the below specs:
- jsEditor.NavigateToNewJSEditor() using TS helpers (Addressing
flakyness in specs /BugTests/JS_Bug29131_spec.ts,
BugTests/invalidLintError_Spec.ts,
ClientSide/BugTests/JS_Bug28764_Spec.ts,
/ClientSide/BugTests/Bug29566_Spec.ts,
ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts)
- /Widgets/ListV2/Listv2_onItemClick_spec.js (toast validation updated
to ts helper)
- /Apps/MongoDBShoppingCart_spec.ts (Flaky fix 2nd case)
- /Regression/Apps/PromisesApp_spec.js (1st test)
- /ClientSide/OtherUIFeatures/ApplicationURL_spec.js (whole spec for
static wait removal + flaky fixes)
- /ClientSide/Templates/Fork_Template_spec.js (complete spec fixes,
cypress exception fix)
- /Sanity/Datasources/Arango_Basic_Spec.ts (3rd test)
- /ServerSide/OnLoadTests/JSOnLoad2_Spec.ts (8th case flaky fix)
- /ClientSide/MobileResponsiveTests/AutoFillWidgets_Reflow_spec.ts (2nd
testcase, flow update)
- /ClientSide/OtherUIFeatures/Resize_spec.js (import update)
- /ClientSide/Templates/Fork_Template_spec.js (1st & 3rd for flaky fix,
removed 2nd - redundant check)
- /Git/GitSync/RepoLimitExceededErrorModal_spec.js flaky fix for EE repo
failure
- /ServerSide/ApiTests/API_Bugs_Spec.js (3rd case, removed waits, moved
to TED Api)
- /Apps/EchoApiCMS_spec.js (removed redundant action)
- /AppNavigation/Sidebar_spec.ts, /AppNavigation/TopInline_spec.ts,
/AppNavigation/TopStacked_spec.ts - added refresh calls for CI flakyness
- homePage.RenameWorkspace() & homePage.NavigateToHome() &
homePage.Signout() - removed static wait, added dynamic check
- homePage.CreateNewApplication() - removed static wait
- homePage.CreateAppInWorkspace() - removed commented code
- homePage.CreateNewWorkspace() - logic improved
- agHelper.AssertURL() - added timeout, removed static wait, calling
assertHelper.AssertDocumentReady()
- Few of agHelper methods timeout & error mesg text update
- cy.Signup() - updated validations
- agHelper.CheckForErrorToast() to agHelper.FailIfErrorToast() - method
name
- /ClientSide/BugTests/DSDiscardBugs_spec.ts - removed unnecessary
method call
#### Type of change
- Script fix (non-breaking change which fixes an issue)
## Testing
#### How Has This Been Tested?
- [X] Cypress CI runs
## Checklist:
#### QA activity:
- [X] Added `Test Plan Approved` label after all changes were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Enhanced timeout handling across various helper methods for improved
stability.
- Streamlined interactions with UI elements using updated helper
methods.
- Adjusted test suites to utilize configuration values for consistency.
- **Tests**
- Temporarily disabled specific test suites to address current issues.
- Updated test assertions and interaction patterns for clarity and
reliability.
- Added new test cases and assertions to cover additional
functionalities.
- **Chores**
- Updated workflow variables for more efficient CI processes.
- Curated the list of limited tests to focus on critical test scenarios.
- **Documentation**
- Clarified test descriptions and intentions for better understanding.
- **Bug Fixes**
- Fixed UI element interactions to prevent test flakiness and improve
user experience.
- Implemented page refresh before application imports to ensure clean
state for tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-01-12 06:30:12 +00:00
|
|
|
|
);
|
|
|
|
|
|
this.assertHelper.AssertDocumentReady();
|
2022-12-09 05:06:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-18 06:30:28 +00:00
|
|
|
|
public ScrollTo(
|
2022-08-27 12:40:11 +00:00
|
|
|
|
selector: ElementType,
|
2022-08-18 06:30:28 +00:00
|
|
|
|
position:
|
|
|
|
|
|
| "topLeft"
|
|
|
|
|
|
| "top"
|
|
|
|
|
|
| "topRight"
|
|
|
|
|
|
| "left"
|
|
|
|
|
|
| "center"
|
|
|
|
|
|
| "right"
|
|
|
|
|
|
| "bottomLeft"
|
|
|
|
|
|
| "bottom"
|
|
|
|
|
|
| "bottomRight",
|
|
|
|
|
|
) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return this.GetElement(selector).scrollTo(position).wait(2000);
|
2022-08-18 06:30:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-26 07:34:41 +00:00
|
|
|
|
public ScrollToXY(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
x: number | string,
|
|
|
|
|
|
y: number | string,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector).scrollTo(x, y).wait(2000);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-16 18:40:10 +00:00
|
|
|
|
public GetWidth(widgetSelector: string) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.GetElement(widgetSelector).then(($element) => {
|
2023-06-16 18:40:10 +00:00
|
|
|
|
cy.wrap(Number($element.width())).as("eleWidth");
|
2023-06-15 13:21:11 +00:00
|
|
|
|
});
|
2023-05-30 02:40:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-16 18:40:10 +00:00
|
|
|
|
public GetHeight(widgetSelector: string) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.GetElement(widgetSelector).then(($element) => {
|
2023-06-16 18:40:10 +00:00
|
|
|
|
cy.wrap(Number($element.height())).as("eleHeight");
|
2023-06-15 13:21:11 +00:00
|
|
|
|
});
|
2023-05-30 02:40:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-07 06:52:06 +00:00
|
|
|
|
public GetWidgetCSSHeight(widgetSelector: string, index = 0) {
|
|
|
|
|
|
return this.GetElement(widgetSelector).eq(index).invoke("css", "height");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GetWidgetCSSFrAttribute(
|
|
|
|
|
|
widgetSelector: string,
|
|
|
|
|
|
attribute: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(widgetSelector).eq(index).invoke("css", attribute);
|
2023-06-09 14:40:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-02-08 11:25:58 +00:00
|
|
|
|
public GetWidgetCSSValue(
|
|
|
|
|
|
widgetSelector: string,
|
|
|
|
|
|
attribute: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(widgetSelector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
cy.wrap($element.css(attribute)).as("cssAttributeValue");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-30 02:40:13 +00:00
|
|
|
|
GetWidgetByName(widgetName: string) {
|
|
|
|
|
|
return this.GetElement(this.locator._widgetByName(widgetName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-07-20 09:26:12 +00:00
|
|
|
|
public EnableAllEditors() {
|
2022-07-21 13:01:23 +00:00
|
|
|
|
this.Sleep(2000);
|
2022-07-20 09:26:12 +00:00
|
|
|
|
cy.get("body").then(($body: any) => {
|
|
|
|
|
|
if ($body.get(this.locator._codeEditorWrapper)?.length > 0) {
|
|
|
|
|
|
let count = $body.get(this.locator._codeEditorWrapper)?.length || 0;
|
|
|
|
|
|
while (count) {
|
|
|
|
|
|
$body
|
|
|
|
|
|
.get(this.locator._codeEditorWrapper)
|
|
|
|
|
|
?.eq(0)
|
|
|
|
|
|
.then(($el: any) => $el.click({ force: true }).wait(100));
|
|
|
|
|
|
count = $body.find(this.locator._codeEditorWrapper)?.length || 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-07-21 13:01:23 +00:00
|
|
|
|
this.Sleep();
|
2022-07-20 09:26:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-13 11:40:58 +00:00
|
|
|
|
public AssertElementEnabledDisabled(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
disabled = true,
|
|
|
|
|
|
) {
|
2023-08-21 07:49:28 +00:00
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should(disabled ? "have.attr" : "not.have.attr", "disabled");
|
2023-01-13 11:40:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-11 05:26:03 +00:00
|
|
|
|
// Waits until all LazyCodeEditor wrappers finished loading the actual code editor.
|
|
|
|
|
|
// Called “EnableAllCodeEditors” to match the command in the JS part of the Cypress codebase
|
|
|
|
|
|
// with the same name.
|
|
|
|
|
|
public EnableAllCodeEditors() {
|
|
|
|
|
|
cy.get(this.lazyCodeEditorFallback, { timeout: 60000 }).should("not.exist");
|
2023-05-30 04:32:47 +00:00
|
|
|
|
// Code editors might not always be present on the page, so we need to check for their existence first
|
|
|
|
|
|
// (https://docs.cypress.io/guides/core-concepts/conditional-testing#Element-existence)
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(this.lazyCodeEditorRendered).length === 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
return cy.get(this.lazyCodeEditorRendered).each(($el) => {
|
|
|
|
|
|
cy.wrap($el).find(".CodeMirror").should("exist");
|
|
|
|
|
|
});
|
2023-05-11 05:26:03 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-26 16:03:13 +00:00
|
|
|
|
public AssertNewTabOpened(openTabFunc: () => void) {
|
|
|
|
|
|
cy.window().then((win) => {
|
|
|
|
|
|
cy.spy(win, "open").as("windowOpen");
|
|
|
|
|
|
openTabFunc();
|
2023-06-30 18:46:57 +00:00
|
|
|
|
cy.get("@windowOpen").should("be.called");
|
2023-04-26 16:03:13 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-02-01 11:12:53 +00:00
|
|
|
|
public VisitNAssert(url: string, apiToValidate = "") {
|
2024-02-08 11:25:58 +00:00
|
|
|
|
cy.visit(url);
|
|
|
|
|
|
this.AssertURL(url);
|
2024-08-12 16:06:27 +00:00
|
|
|
|
if (Cypress.env("AIRGAPPED")) {
|
|
|
|
|
|
// Intentionally left blank: No actions needed in air-gapped environment
|
2023-06-18 04:55:16 +00:00
|
|
|
|
} else
|
|
|
|
|
|
apiToValidate && this.assertHelper.AssertNetworkStatus(apiToValidate);
|
2023-05-31 06:39:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-10 04:32:42 +00:00
|
|
|
|
public GetDropTargetId(widgetName: string) {
|
|
|
|
|
|
return this.GetWidgetByName(widgetName).invoke("attr", "id");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GetModalDropTargetId() {
|
|
|
|
|
|
return this.GetElement(this.locator._modal).invoke("attr", "id");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-19 09:05:31 +00:00
|
|
|
|
public BrowserNavigation(direction: number) {
|
|
|
|
|
|
//passing 1 works as browser back
|
|
|
|
|
|
//passing -1 works as browser forward
|
|
|
|
|
|
cy.go(direction);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-17 13:47:56 +00:00
|
|
|
|
public AssertCursorInput($selector: string, cursor = { ch: 0, line: 0 }) {
|
|
|
|
|
|
this.EnableAllCodeEditors();
|
|
|
|
|
|
cy.get($selector)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins) => {
|
|
|
|
|
|
const input = (ins[0] as any).CodeMirror;
|
|
|
|
|
|
// The input gets focused with a slight delay so we need to wait for it
|
|
|
|
|
|
cy.waitUntil(() => input.hasFocus()).then(() => {
|
|
|
|
|
|
const editorCursor = input.getCursor();
|
|
|
|
|
|
expect(editorCursor.ch).to.equal(cursor.ch);
|
|
|
|
|
|
expect(editorCursor.line).to.equal(cursor.line);
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-01 14:50:47 +00:00
|
|
|
|
public GetAttribute(selector: string, attribName: string, index = 0) {
|
|
|
|
|
|
return this.GetElement(selector).eq(index).invoke("attr", attribName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
fix: entity explorer issue with datasources is fixed (#26770)
## Description
This PR fixes issue with datasource not getting highlighted in entity
explorer:
Suppose we have 3 datasources in our applications: Users, Movies, and
one Postgres or MySQL datasource. Once we create these datasources, we
can see them getting populated in entity explorer -> datasource section.
So there were two issues here:
- If I select Users, I am able to see the Users datasource info on the
right pane but its not active in the entity explorer, Similarly If I
switch to movies, right pane gets updated with movies info but in the
entity explorer, we cannot see movies getting highlighted as thats the
active selection
- If I am on Users datasource review page, I reload the page, now I can
see active selection of Users being highlighted in the entity explorer,
but now if we switch to Movies, right pane gets updated but in entity
explorer Users is highlighted, which is incorrect
This issue occurred because we have used useMemo for
`datasourceElements`, two dependency passed are appWideDS and pageId,
whenever we switch between datasources, `activeDatasourceId` gets
updated but since we have cached the whole datasource listing component
without the dependency of `activeDatasourceId`, it does not recompute
and shows the same state as before.
To fix the issue, `activeDatasourceId` needs to be passed in the
dependency array. After adding this new dependency, another issue
occurred with respect to entity explorer, The order of suggested
datasources would change in entity explorer, This PR addresses that
issue as well.
#### PR fixes following issue(s)
Fixes #26716
> if no issue exists, please create an issue and ask the maintainers
about this first
>
>
#### Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video
>
>
#### Type of change
- Bug fix (non-breaking change which fixes an issue)
>
>
>
## Testing
>
#### How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Also
list any relevant details for your test configuration.
> Delete anything that is not relevant
- [x] Manual
- [ ] JUnit
- [x] Jest
- [ ] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
>
>
## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [x] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
---------
Co-authored-by: “sneha122” <“sneha@appsmith.com”>
2023-09-01 07:56:34 +00:00
|
|
|
|
public AssertClassExists(selector: string, className: string) {
|
2023-09-07 18:18:33 +00:00
|
|
|
|
this.GetElement(selector).should("have.class", className);
|
fix: entity explorer issue with datasources is fixed (#26770)
## Description
This PR fixes issue with datasource not getting highlighted in entity
explorer:
Suppose we have 3 datasources in our applications: Users, Movies, and
one Postgres or MySQL datasource. Once we create these datasources, we
can see them getting populated in entity explorer -> datasource section.
So there were two issues here:
- If I select Users, I am able to see the Users datasource info on the
right pane but its not active in the entity explorer, Similarly If I
switch to movies, right pane gets updated with movies info but in the
entity explorer, we cannot see movies getting highlighted as thats the
active selection
- If I am on Users datasource review page, I reload the page, now I can
see active selection of Users being highlighted in the entity explorer,
but now if we switch to Movies, right pane gets updated but in entity
explorer Users is highlighted, which is incorrect
This issue occurred because we have used useMemo for
`datasourceElements`, two dependency passed are appWideDS and pageId,
whenever we switch between datasources, `activeDatasourceId` gets
updated but since we have cached the whole datasource listing component
without the dependency of `activeDatasourceId`, it does not recompute
and shows the same state as before.
To fix the issue, `activeDatasourceId` needs to be passed in the
dependency array. After adding this new dependency, another issue
occurred with respect to entity explorer, The order of suggested
datasources would change in entity explorer, This PR addresses that
issue as well.
#### PR fixes following issue(s)
Fixes #26716
> if no issue exists, please create an issue and ask the maintainers
about this first
>
>
#### Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video
>
>
#### Type of change
- Bug fix (non-breaking change which fixes an issue)
>
>
>
## Testing
>
#### How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Also
list any relevant details for your test configuration.
> Delete anything that is not relevant
- [x] Manual
- [ ] JUnit
- [x] Jest
- [ ] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
>
>
## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [x] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
---------
Co-authored-by: “sneha122” <“sneha@appsmith.com”>
2023-09-01 07:56:34 +00:00
|
|
|
|
}
|
2023-09-19 19:26:11 +00:00
|
|
|
|
|
2023-10-11 07:34:06 +00:00
|
|
|
|
public VerifySnapshot(selector: string, identifier: string) {
|
|
|
|
|
|
this.GetElement(selector).matchImageSnapshot(identifier);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
//Not used:
|
|
|
|
|
|
// private xPathToCss(xpath: string) {
|
|
|
|
|
|
// return xpath
|
|
|
|
|
|
// .replace(/\[(\d+?)\]/g, function (s, m1) { return '[' + (m1 - 1) + ']'; })
|
|
|
|
|
|
// .replace(/\/{2}/g, '')
|
|
|
|
|
|
// .replace(/\/+/g, ' > ')
|
|
|
|
|
|
// .replace(/@/g, '')
|
|
|
|
|
|
// .replace(/\[(\d+)\]/g, ':eq($1)')
|
|
|
|
|
|
// .replace(/^\s+/, '');
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// Cypress.Commands.add("byXpath", (xpath) => {
|
|
|
|
|
|
// const iterator = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null)
|
|
|
|
|
|
// const items = [];
|
|
|
|
|
|
// let item = iterator.iterateNext();
|
|
|
|
|
|
// while (item) {
|
|
|
|
|
|
// items.push(item);
|
|
|
|
|
|
// item = iterator.iterateNext();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return items;
|
|
|
|
|
|
// }, { timeout: 5000 });
|
2024-05-15 13:45:49 +00:00
|
|
|
|
|
|
|
|
|
|
public GetChildrenNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
childSelector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
ctrlKey = false,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.ScrollIntoView(selector, index)
|
|
|
|
|
|
.children(childSelector)
|
|
|
|
|
|
.click({ force: force, ctrlKey: ctrlKey })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
2024-05-21 13:10:02 +00:00
|
|
|
|
|
|
|
|
|
|
public selectAndValidateWidgetNameAndProperty({
|
|
|
|
|
|
clickOptions = {},
|
|
|
|
|
|
hierarchy = [],
|
|
|
|
|
|
propFieldName,
|
|
|
|
|
|
toggleEle = null,
|
|
|
|
|
|
valueToValidate,
|
|
|
|
|
|
widgetName,
|
|
|
|
|
|
widgetType = EntityType.Widget,
|
|
|
|
|
|
}: SelectAndValidateParams) {
|
|
|
|
|
|
// Select the widget by name, type, and hierarchy with optional click options
|
|
|
|
|
|
EditorNavigator.SelectEntityByName(
|
|
|
|
|
|
widgetName,
|
|
|
|
|
|
widgetType,
|
|
|
|
|
|
clickOptions,
|
|
|
|
|
|
hierarchy,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Assert that the Property Pane title matches the widget name
|
|
|
|
|
|
this.AssertText(
|
|
|
|
|
|
ObjectsRegistry.PropertyPane._paneTitle,
|
|
|
|
|
|
"text",
|
|
|
|
|
|
widgetName,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// If a toggle element is provided, toggle its JavaScript mode
|
|
|
|
|
|
if (toggleEle) {
|
|
|
|
|
|
ObjectsRegistry.PropertyPane.ToggleJSMode(toggleEle);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Validate that the property field value matches the expected value
|
|
|
|
|
|
ObjectsRegistry.PropertyPane.ValidatePropertyFieldValue(
|
|
|
|
|
|
propFieldName,
|
|
|
|
|
|
valueToValidate,
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2024-12-16 11:11:54 +00:00
|
|
|
|
|
|
|
|
|
|
public RemoveChars(selector: string, charCount = 0, index = 0) {
|
|
|
|
|
|
if (charCount > 0)
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.focus()
|
|
|
|
|
|
.type("{backspace}".repeat(charCount), { timeout: 2, force: true })
|
|
|
|
|
|
.wait(50);
|
|
|
|
|
|
else {
|
|
|
|
|
|
if (charCount == -1) this.GetElement(selector).eq(index).clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public captureConsoleLogs(): void {
|
|
|
|
|
|
cy.window()
|
|
|
|
|
|
.its("console")
|
|
|
|
|
|
.then((console) => {
|
|
|
|
|
|
cy.spy(console, "log").as("log");
|
|
|
|
|
|
cy.spy(console, "error").as("error");
|
|
|
|
|
|
cy.spy(console, "warn").as("warn");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public verifyConsoleLogNotContainingError(): void {
|
|
|
|
|
|
cy.get("@error")
|
|
|
|
|
|
.invoke("getCalls")
|
|
|
|
|
|
.then((calls) => {
|
|
|
|
|
|
console.table(calls);
|
|
|
|
|
|
cy.wrap(calls).each((call) => {
|
|
|
|
|
|
(call as any).args.forEach((arg: any) => {
|
|
|
|
|
|
expect(arg).to.not.contain("error");
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public verifyConsoleLogContainsExpectedMessage(message: string): void {
|
|
|
|
|
|
cy.get("@log")
|
|
|
|
|
|
.invoke("getCalls")
|
|
|
|
|
|
.then((calls) => {
|
|
|
|
|
|
console.table(calls);
|
|
|
|
|
|
cy.wrap(calls).each((call) => {
|
|
|
|
|
|
(call as any).args.forEach((arg: any) => {
|
|
|
|
|
|
expect(arg).to.contain(message);
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public clearConsoleLogs(): void {
|
|
|
|
|
|
cy.window().then((win) => {
|
|
|
|
|
|
cy.spy(win.console, "log").as("log");
|
|
|
|
|
|
cy.spy(win.console, "error").as("error");
|
|
|
|
|
|
cy.spy(win.console, "warn").as("warn");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2025-01-30 11:55:07 +00:00
|
|
|
|
|
|
|
|
|
|
public waitForEmail({
|
|
|
|
|
|
pollInterval,
|
|
|
|
|
|
targetEmail,
|
|
|
|
|
|
targetSubject,
|
|
|
|
|
|
timeout,
|
|
|
|
|
|
}: {
|
|
|
|
|
|
pollInterval: number;
|
|
|
|
|
|
timeout: number;
|
|
|
|
|
|
targetSubject: string;
|
|
|
|
|
|
targetEmail?: string;
|
|
|
|
|
|
}): Cypress.Chainable<any> {
|
|
|
|
|
|
const endTime = Date.now() + timeout;
|
|
|
|
|
|
let latestEmail: any = null;
|
|
|
|
|
|
|
|
|
|
|
|
function parseDate(dateString: string): Date {
|
|
|
|
|
|
return new Date(dateString.replace(/ \([A-Za-z\s]*\)$/, ""));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function fetchEmail(): Cypress.Chainable<any> {
|
|
|
|
|
|
return cy
|
|
|
|
|
|
.request("http://localhost:5001/api/v1/maildev-emails")
|
|
|
|
|
|
.then((res) => {
|
|
|
|
|
|
if (res.status !== 200) {
|
|
|
|
|
|
cy.log(`Request failed with status ${res.status}`);
|
|
|
|
|
|
return cy.wrap(null);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const emails: Array<{
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
subject: string;
|
|
|
|
|
|
date: string;
|
|
|
|
|
|
to: string;
|
|
|
|
|
|
from: string;
|
|
|
|
|
|
};
|
|
|
|
|
|
text: string;
|
|
|
|
|
|
}> = res.body;
|
|
|
|
|
|
|
|
|
|
|
|
const matchingEmails = emails.filter((email) => {
|
|
|
|
|
|
const subjectMatch = email.headers.subject
|
|
|
|
|
|
.trim()
|
|
|
|
|
|
.toLowerCase()
|
|
|
|
|
|
.includes(targetSubject.trim().toLowerCase());
|
|
|
|
|
|
|
|
|
|
|
|
if (targetEmail) {
|
|
|
|
|
|
const emailTo = email.headers.to.trim().toLowerCase();
|
|
|
|
|
|
return (
|
|
|
|
|
|
subjectMatch && emailTo === targetEmail.trim().toLowerCase()
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return subjectMatch;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (matchingEmails.length > 0) {
|
|
|
|
|
|
latestEmail = matchingEmails.reduce((latest, email) => {
|
|
|
|
|
|
const emailDate = parseDate(email.headers.date);
|
|
|
|
|
|
const latestDate = parseDate(
|
|
|
|
|
|
latest?.headers?.date || "1970-01-01",
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return emailDate > latestDate ? email : latest;
|
|
|
|
|
|
}, null);
|
|
|
|
|
|
|
|
|
|
|
|
if (latestEmail) {
|
|
|
|
|
|
cy.log("===== Email Details =====");
|
|
|
|
|
|
cy.log(`From: ${latestEmail.headers.from}`);
|
|
|
|
|
|
cy.log(`To: ${latestEmail.headers.to}`);
|
|
|
|
|
|
cy.log(`Subject: ${latestEmail.headers.subject}`);
|
|
|
|
|
|
cy.log("=========================");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return cy.wrap(latestEmail);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Date.now() > endTime) {
|
|
|
|
|
|
cy.log("===== Info =====");
|
|
|
|
|
|
cy.log(
|
|
|
|
|
|
`No email with subject "${targetSubject}" found${
|
|
|
|
|
|
targetEmail ? ` for recipient "${targetEmail}"` : ""
|
|
|
|
|
|
} within the timeout period.`,
|
|
|
|
|
|
);
|
|
|
|
|
|
cy.log("================");
|
|
|
|
|
|
|
|
|
|
|
|
return cy.wrap(null);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return cy.wait(pollInterval).then(fetchEmail);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return fetchEmail();
|
|
|
|
|
|
}
|
2025-03-07 12:03:16 +00:00
|
|
|
|
|
|
|
|
|
|
public getCanvasWidgetStateByWidgetName(widgetName: string): any {
|
|
|
|
|
|
return cy
|
|
|
|
|
|
.window()
|
|
|
|
|
|
.its("store")
|
|
|
|
|
|
.invoke("getState")
|
|
|
|
|
|
.then((state) => {
|
|
|
|
|
|
const widgets = state.entities.canvasWidgets;
|
|
|
|
|
|
|
|
|
|
|
|
const widgetId = Object.keys(widgets).find((widgetId) => {
|
|
|
|
|
|
if (widgets[widgetId].widgetName === widgetName) {
|
|
|
|
|
|
return widgets[widgetId];
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (!widgetId) return null;
|
|
|
|
|
|
|
|
|
|
|
|
return widgets[widgetId];
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public getDatasourceStateByName(datasourceName: string): any {
|
|
|
|
|
|
return cy
|
|
|
|
|
|
.window()
|
|
|
|
|
|
.its("store")
|
|
|
|
|
|
.invoke("getState")
|
|
|
|
|
|
.then((state) => {
|
|
|
|
|
|
const datasources = state.entities.datasources.list;
|
|
|
|
|
|
|
|
|
|
|
|
const datasource = datasources.find(
|
|
|
|
|
|
(datasource: any) => datasource.name === datasourceName,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (!datasource) return null;
|
|
|
|
|
|
|
|
|
|
|
|
return datasource;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public getActionStateByName(actionName: string): any {
|
|
|
|
|
|
return cy
|
|
|
|
|
|
.window()
|
|
|
|
|
|
.its("store")
|
|
|
|
|
|
.invoke("getState")
|
|
|
|
|
|
.then((state) => {
|
|
|
|
|
|
const actions = state.entities.actions;
|
|
|
|
|
|
|
|
|
|
|
|
const action = actions.find(
|
|
|
|
|
|
(action: any) => action.config.name === actionName,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (!action) return null;
|
|
|
|
|
|
|
|
|
|
|
|
return action;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|