## Description ### Fixes - [x] https://github.com/appsmithorg/appsmith/issues/19383 - [x] https://github.com/appsmithorg/appsmith/issues/19384 - [x] https://github.com/appsmithorg/appsmith/issues/19385 - [x] https://github.com/appsmithorg/appsmith/issues/19386 - [x] https://github.com/appsmithorg/appsmith/issues/19387 - [x] https://github.com/appsmithorg/appsmith/issues/19388 - [x] https://github.com/appsmithorg/appsmith/issues/19389 - [x] https://github.com/appsmithorg/appsmith/issues/19390 - [x] https://github.com/appsmithorg/appsmith/issues/19391 - [x] https://github.com/appsmithorg/appsmith/issues/19392 - [x] https://github.com/appsmithorg/appsmith/issues/19393 - [x] https://github.com/appsmithorg/appsmith/issues/19394 - [x] https://github.com/appsmithorg/appsmith/issues/19395 - [x] https://github.com/appsmithorg/appsmith/issues/19396 - [x] https://github.com/appsmithorg/appsmith/issues/19397 - [x] https://github.com/appsmithorg/appsmith/issues/19398 - [x] https://github.com/appsmithorg/appsmith/issues/19399 - [x] https://github.com/appsmithorg/appsmith/issues/19400 - [x] https://github.com/appsmithorg/appsmith/issues/19401 - [x] https://github.com/appsmithorg/appsmith/issues/19402 - [x] https://github.com/appsmithorg/appsmith/issues/19403 - [x] https://github.com/appsmithorg/appsmith/issues/19404 - [x] https://github.com/appsmithorg/appsmith/issues/19405 - [x] https://github.com/appsmithorg/appsmith/issues/19406 - [x] https://github.com/appsmithorg/appsmith/issues/19407 - [x] https://github.com/appsmithorg/appsmith/issues/19408 - [x] https://github.com/appsmithorg/appsmith/issues/19409 Fixes # (issue) > 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 > Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (fix or feature that would cause existing functionality to not work as expected) - Chore (housekeeping or task changes that don't impact user perception) - This change requires a documentation update ## How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Provide instructions, so we can reproduce. > Please also list any relevant details for your test configuration. > Delete anything that is not important - Manual - 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 - [ ] 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 - [ ] 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: Ankita Kinger <ankita@appsmith.com> Co-authored-by: akash-codemonk <67054171+akash-codemonk@users.noreply.github.com> Co-authored-by: Tanvi Bhakta <tanvi@appsmith.com> Co-authored-by: Arsalan <arsalanyaldram0211@outlook.com> Co-authored-by: Aman Agarwal <aman@appsmith.com> Co-authored-by: Rohit Agarwal <rohit_agarwal@live.in> Co-authored-by: Nilesh Sarupriya <nilesh@appsmith.com> Co-authored-by: Nilesh Sarupriya <20905988+nsarupr@users.noreply.github.com> Co-authored-by: Tanvi Bhakta <tanvibhakta@gmail.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local> Co-authored-by: Vijetha-Kaja <vijetha@appsmith.com> Co-authored-by: Parthvi <80334441+Parthvi12@users.noreply.github.com> Co-authored-by: Apple <nandan@thinkify.io> Co-authored-by: Saroj <43822041+sarojsarab@users.noreply.github.com> Co-authored-by: Sangeeth Sivan <74818788+berzerkeer@users.noreply.github.com> Co-authored-by: Ashok Kumar M <35134347+marks0351@users.noreply.github.com> Co-authored-by: Aishwarya-U-R <91450662+Aishwarya-U-R@users.noreply.github.com> Co-authored-by: rahulramesha <rahul@appsmith.com> Co-authored-by: Aswath K <aswath.sana@gmail.com> Co-authored-by: Preet Sidhu <preetsidhu.bits@gmail.com> Co-authored-by: Vijetha-Kaja <119562824+Vijetha-Kaja@users.noreply.github.com> Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
288 lines
8.5 KiB
JavaScript
288 lines
8.5 KiB
JavaScript
/* eslint-disable cypress/no-unnecessary-waiting */
|
|
/* eslint-disable cypress/no-assigning-return-values */
|
|
import { ObjectsRegistry } from "../support/Objects/Registry";
|
|
require("cy-verify-downloads").addCustomCommand();
|
|
require("cypress-file-upload");
|
|
const jsEditorLocators = require("../locators/JSEditor.json");
|
|
const datasourceEditor = require("../locators/DatasourcesEditor.json");
|
|
const datasourceFormData = require("../fixtures/datasources.json");
|
|
const commonlocators = require("../locators/commonlocators.json");
|
|
const queryEditor = require("../locators/QueryEditor.json");
|
|
const widgetsPage = require("../locators/Widgets.json");
|
|
const apiwidget = require("../locators/apiWidgetslocator.json");
|
|
const explorer = require("../locators/explorerlocators.json");
|
|
const datasource = require("../locators/DatasourcesEditor.json");
|
|
const formControls = require("../locators/FormControl.json");
|
|
const queryLocators = require("../locators/QueryEditor.json");
|
|
const { AggregateHelper } = ObjectsRegistry;
|
|
const { PropertyPane } = ObjectsRegistry;
|
|
|
|
export const initLocalstorage = () => {
|
|
cy.window().then((window) => {
|
|
window.localStorage.setItem("ShowCommentsButtonToolTip", "");
|
|
window.localStorage.setItem("updateDismissed", "true");
|
|
});
|
|
};
|
|
|
|
Cypress.Commands.add("NavigateToQueryEditor", () => {
|
|
cy.get(explorer.addDBQueryEntity).last().click({ force: true });
|
|
});
|
|
|
|
Cypress.Commands.add("NavigateToQueriesInExplorer", () => {
|
|
cy.get(explorer.entityQuery).click({ force: true });
|
|
});
|
|
|
|
Cypress.Commands.add("NavigateToActiveDSQueryPane", (datasourceName) => {
|
|
cy.NavigateToQueryEditor();
|
|
cy.NavigateToActiveTab();
|
|
|
|
cy.get(datasource.datasourceCard)
|
|
.contains(datasourceName)
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.closest(datasource.datasourceCard)
|
|
.within(() => {
|
|
cy.get(queryLocators.createQuery).click({ force: true });
|
|
})
|
|
.wait(2000); //for the specified page to load
|
|
});
|
|
|
|
Cypress.Commands.add("NavigateToDSGeneratePage", (datasourceName) => {
|
|
cy.NavigateToQueryEditor();
|
|
cy.NavigateToActiveTab();
|
|
|
|
cy.get(datasource.datasourceCard)
|
|
.contains(datasourceName)
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.closest(datasource.datasourceCard)
|
|
.within(() => {
|
|
cy.get(datasource.datasourceCardGeneratePageBtn).click();
|
|
})
|
|
.wait(2000); //for the specified page to load
|
|
});
|
|
|
|
Cypress.Commands.add("ClickGotIt", () => {
|
|
cy.get("span:contains('Got it')").click();
|
|
});
|
|
|
|
Cypress.Commands.add("fillGoogleSheetsDatasourceForm", () => {
|
|
cy.get(datasourceEditor["scope"]).click();
|
|
});
|
|
|
|
Cypress.Commands.add("fillAuthenticatedAPIForm", () => {
|
|
const URL = datasourceFormData["authenticatedApiUrl"];
|
|
cy.get(datasourceEditor.url).type(URL);
|
|
});
|
|
|
|
Cypress.Commands.add("runQuery", (expectedRes = true) => {
|
|
cy.onlyQueryRun();
|
|
AggregateHelper.CheckForErrorToast("Failed to initialize pool");
|
|
cy.wait(2000); //for postexecute to go thru
|
|
cy.wait("@postExecute").should(
|
|
"have.nested.property",
|
|
"response.body.data.isExecutionSuccess",
|
|
expectedRes,
|
|
);
|
|
|
|
// cy.wait("@postExecute").should(
|
|
// "have.nested.property",
|
|
// "response.body.responseMeta.status",
|
|
// 200,
|
|
// );
|
|
});
|
|
|
|
Cypress.Commands.add("onlyQueryRun", () => {
|
|
cy.xpath(queryEditor.runQuery).last().click({ force: true }).wait(1000);
|
|
cy.get(".ads-v2-spinner").should("not.exist");
|
|
});
|
|
|
|
Cypress.Commands.add("RunQueryWithoutWaitingForResolution", () => {
|
|
cy.xpath(queryEditor.runQuery).last().click({ force: true });
|
|
});
|
|
|
|
Cypress.Commands.add("hoverAndClick", (entity) => {
|
|
cy.xpath(
|
|
"//div[text()='" +
|
|
entity +
|
|
"']/ancestor::div[1]/following-sibling::div//button[contains(@class, 'entity-context-menu')]",
|
|
).click({ force: true });
|
|
});
|
|
|
|
Cypress.Commands.add("hoverAndClickParticularIndex", (index) => {
|
|
cy.xpath(apiwidget.popover)
|
|
.eq(index)
|
|
.should("be.hidden")
|
|
.invoke("show")
|
|
.click({ force: true });
|
|
});
|
|
|
|
Cypress.Commands.add("deleteQuery", () => {
|
|
cy.hoverAndClick();
|
|
cy.get(apiwidget.delete).click({ force: true });
|
|
cy.get(apiwidget.deleteConfirm).click({ force: true });
|
|
cy.wait("@deleteAction").should(
|
|
"have.nested.property",
|
|
"response.body.responseMeta.status",
|
|
200,
|
|
);
|
|
});
|
|
|
|
Cypress.Commands.add("deleteQueryUsingContext", () => {
|
|
cy.get(queryEditor.queryMoreAction).first().click();
|
|
cy.get(queryEditor.deleteUsingContext).click();
|
|
cy.get(queryEditor.deleteUsingContext).contains("Are you sure?").click();
|
|
cy.wait("@deleteAction").should(
|
|
"have.nested.property",
|
|
"response.body.responseMeta.status",
|
|
200,
|
|
);
|
|
});
|
|
|
|
Cypress.Commands.add("runAndDeleteQuery", () => {
|
|
cy.runQuery();
|
|
cy.deleteQueryUsingContext();
|
|
});
|
|
|
|
Cypress.Commands.add("executeDbQuery", (queryName, eventName) => {
|
|
PropertyPane.SelectPlatformFunction(eventName, "Execute a query");
|
|
cy.get(`.single-select:contains(${queryName})`).click({ force: true });
|
|
// cy.get(widgetsPage.buttonOnClick)
|
|
// .get(commonlocators.dropdownSelectButton)
|
|
// .eq(0)
|
|
// .click({ force: true })
|
|
// .get("ul.bp3-menu")
|
|
// .children()
|
|
// .contains("Execute a query")
|
|
// .click({ force: true })
|
|
// .get("ul.bp3-menu")
|
|
// .children()
|
|
// .contains(queryName)
|
|
// .click({ force: true });
|
|
});
|
|
|
|
Cypress.Commands.add("CreateMockQuery", (queryName) => {
|
|
// cy.get(queryEditor.addNewQueryBtn).click({ force: true });
|
|
// cy.get(queryEditor.createQuery)
|
|
// .first()
|
|
// .click({ force: true });
|
|
cy.get(queryEditor.queryNameField).type(queryName + "{enter}", {
|
|
force: true,
|
|
});
|
|
cy.assertPageSave();
|
|
cy.get(queryEditor.templateMenu + " div")
|
|
.contains("Select")
|
|
.click({ force: true });
|
|
cy.runQuery();
|
|
// cy.wait(3000);
|
|
// cy.get(queryEditor.runQuery)
|
|
// .click({force: true});
|
|
});
|
|
|
|
Cypress.Commands.add("ValidateQueryParams", (param) => {
|
|
cy.xpath(apiwidget.paramsTab).should("be.visible").click({ force: true });
|
|
|
|
cy.validateCodeEditorContent(apiwidget.paramKey, param.key);
|
|
cy.validateCodeEditorContent(apiwidget.paramValue, param.value);
|
|
});
|
|
|
|
// from hereeee
|
|
// targeting normal dropdowns, we can simply use the label names
|
|
Cypress.Commands.add(
|
|
"TargetDropdownAndSelectOption",
|
|
(dropdownIdentifier, option, isDynamic = false) => {
|
|
if (isDynamic) {
|
|
cy.wait(5000);
|
|
}
|
|
cy.get(dropdownIdentifier)
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.click({ multiple: true });
|
|
|
|
cy.get(formControls.dropdownWrapper)
|
|
.should("be.visible")
|
|
.contains(option)
|
|
.first()
|
|
.click({ force: true });
|
|
cy.wait(2000);
|
|
},
|
|
);
|
|
|
|
// targeting multiselect dropdowns, we target the data-testid value of the options
|
|
Cypress.Commands.add(
|
|
"TargetMultiSelectDropdownAndSelectOptions",
|
|
(dropdownIdentifier, options, isDynamic = false) => {
|
|
if (isDynamic) {
|
|
cy.wait(5000);
|
|
}
|
|
cy.get(dropdownIdentifier)
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.click({ multiple: true });
|
|
|
|
options &&
|
|
options.map((option) => {
|
|
cy.get(formControls.dropdownWrapper)
|
|
.should("be.visible")
|
|
.get(option) // we use a get instead of contains.
|
|
.first()
|
|
.click({ force: true });
|
|
});
|
|
},
|
|
);
|
|
|
|
Cypress.Commands.add(
|
|
"TargetFormControlAndSwitchViewType",
|
|
(formControlIdentifier, newViewType) => {
|
|
cy.get(formControlIdentifier).scrollIntoView().should("be.visible").click();
|
|
|
|
if (newViewType === "json") {
|
|
cy.get(formControlIdentifier)
|
|
.should("be.visible")
|
|
.should("have.class", "is-active");
|
|
} else if (newViewType === "component") {
|
|
cy.get(formControlIdentifier)
|
|
.should("be.visible")
|
|
.should("not.have.class", "is-active");
|
|
}
|
|
},
|
|
);
|
|
|
|
Cypress.Commands.add(
|
|
"VerifyCurrentDropdownOption",
|
|
(dropdownIdentifier, option) => {
|
|
cy.get(dropdownIdentifier)
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.contains(option)
|
|
.should("be.visible");
|
|
},
|
|
);
|
|
|
|
Cypress.Commands.add(
|
|
"ValidateAndSelectDropdownOption",
|
|
(dropdownIdentifier, currentOption, newOption, isDynamic = false) => {
|
|
cy.VerifyCurrentDropdownOption(dropdownIdentifier, currentOption);
|
|
if (newOption) {
|
|
cy.TargetDropdownAndSelectOption(
|
|
dropdownIdentifier,
|
|
newOption,
|
|
isDynamic,
|
|
);
|
|
cy.wait(2000);
|
|
}
|
|
},
|
|
);
|
|
|
|
Cypress.Commands.add("NavigateToAction", (actionName) => {
|
|
cy.get(queryEditor.navigateToAction)
|
|
.contains(actionName)
|
|
.should("be.visible")
|
|
.click();
|
|
});
|
|
Cypress.Commands.add("SelecJSFunctionAndRun", (functionName) => {
|
|
cy.xpath("//span[@name='expand-more']").first().click();
|
|
cy.get(`[data-testid='t--dropdown-option-${functionName}']`).click();
|
|
cy.get(jsEditorLocators.runButton).first().click();
|
|
});
|