## Description Adds Cypress tests for ensuring Auto layout's auto-dimension feature works properly #### PR fixes following issue(s) Fixes #23230 Fixes #22580 #### Type of change - Chore (housekeeping or task changes that don't impact user perception) > > > ## 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 - [ ] 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: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Test-plan-implementation#speedbreaker-features-to-consider-for-every-change) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans/_edit#areas-of-interest) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] 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
171 lines
6.4 KiB
TypeScript
171 lines
6.4 KiB
TypeScript
import { ObjectsRegistry } from "../Objects/Registry";
|
|
import { getWidgetSelector, WIDGET } from "../../locators/WidgetLocators";
|
|
import { CONVERT_TO_AUTO_BUTTON } from "../../../src/ce/constants/messages";
|
|
|
|
export class AutoLayout {
|
|
private entityExplorer = ObjectsRegistry.EntityExplorer;
|
|
private propPane = ObjectsRegistry.PropertyPane;
|
|
private agHelper = ObjectsRegistry.AggregateHelper;
|
|
|
|
_buttonWidgetSelector = getWidgetSelector(WIDGET.BUTTON);
|
|
_buttonComponentSelector = `${getWidgetSelector(WIDGET.BUTTON)} button`;
|
|
_textWidgetSelector = getWidgetSelector(WIDGET.TEXT);
|
|
_textComponentSelector = `${getWidgetSelector(
|
|
WIDGET.TEXT,
|
|
)} .t--text-widget-container`;
|
|
_containerWidgetSelector = getWidgetSelector(WIDGET.CONTAINER);
|
|
private _autoConvert = "#t--layout-conversion-cta";
|
|
private _convert = "button:contains('Convert layout')";
|
|
private _refreshApp = "button:contains('Refresh the app')";
|
|
|
|
/**
|
|
* Drag and drop a button widget and verify if the bounding box fits perfectly
|
|
* after adjusting the label length
|
|
*
|
|
* @param {number} x
|
|
* @param {number} y
|
|
* @param {string} [dropTarget=""]
|
|
*/
|
|
DropButtonAndTestForAutoDimension(x: number, y: number, dropTarget = "") {
|
|
this.entityExplorer.DragDropWidgetNVerify(WIDGET.BUTTON, x, y, dropTarget);
|
|
|
|
// Check if bounding box fits perfectly to the Button Widget
|
|
this.EnsureBoundingBoxFitsComponent(
|
|
this._buttonWidgetSelector,
|
|
this._buttonComponentSelector,
|
|
);
|
|
|
|
// Increase the length of button label & verify if the component expands
|
|
this.agHelper.GetWidgetWidth(this._buttonWidgetSelector).as("initialWidth");
|
|
this.propPane.UpdatePropertyFieldValue("Label", "Lengthy Button Label");
|
|
this.agHelper.GetWidgetWidth(this._buttonWidgetSelector).then((width) => {
|
|
cy.get<number>("@initialWidth").then((initialWidth) => {
|
|
expect(width).to.be.greaterThan(initialWidth);
|
|
});
|
|
});
|
|
|
|
// verify if the bounding box fits perfectly to the Button Widget after expanding
|
|
this.EnsureBoundingBoxFitsComponent(
|
|
this._buttonWidgetSelector,
|
|
this._buttonComponentSelector,
|
|
);
|
|
|
|
// Decrease the length of button label & verify if the component shrinks
|
|
this.agHelper.GetWidgetWidth(this._buttonWidgetSelector).as("initialWidth");
|
|
this.propPane.UpdatePropertyFieldValue("Label", "Label");
|
|
this.agHelper.GetWidgetWidth(this._buttonWidgetSelector).then((width) => {
|
|
cy.get<number>("@initialWidth").then((initialWidth) => {
|
|
expect(width).to.be.lessThan(initialWidth);
|
|
});
|
|
});
|
|
|
|
// verify if the bounding box fits perfectly to the Button Widget after expanding
|
|
this.EnsureBoundingBoxFitsComponent(
|
|
this._buttonWidgetSelector,
|
|
this._buttonComponentSelector,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Drag and drop a text widget and verify if the bounding box fits perfectly
|
|
* after adding & removing multi-line text
|
|
*
|
|
* @param {number} x
|
|
* @param {number} y
|
|
* @param {string} [dropTarget=""]
|
|
*/
|
|
DropTextAndTestForAutoDimension(x: number, y: number, dropTarget = "") {
|
|
this.entityExplorer.DragDropWidgetNVerify(WIDGET.TEXT, x, y, dropTarget);
|
|
|
|
// Check if bounding box fits perfectly to the Text Widget
|
|
this.EnsureBoundingBoxFitsComponent(
|
|
this._textWidgetSelector,
|
|
this._textComponentSelector,
|
|
);
|
|
|
|
// Add multi-line text & verify if the component's height increases
|
|
this.agHelper.GetWidgetHeight(this._textWidgetSelector).as("initialHeight");
|
|
this.propPane.UpdatePropertyFieldValue(
|
|
"Text",
|
|
"hello\nWorld\nThis\nis\na\nMulti-line\nText",
|
|
);
|
|
this.agHelper.GetWidgetHeight(this._textWidgetSelector).then((width) => {
|
|
cy.get<number>("@initialHeight").then((initialHeight) => {
|
|
expect(width).to.be.greaterThan(initialHeight);
|
|
});
|
|
});
|
|
|
|
// Check if bounding box fits perfectly to the Text Widget
|
|
this.EnsureBoundingBoxFitsComponent(
|
|
this._textWidgetSelector,
|
|
this._textComponentSelector,
|
|
);
|
|
|
|
// Remove some lines & verify if the component's height decreases
|
|
this.agHelper.GetWidgetHeight(this._textWidgetSelector).as("initialHeight");
|
|
this.propPane.UpdatePropertyFieldValue("Text", "hello\nWorld\nblabla");
|
|
this.agHelper.GetWidgetHeight(this._textWidgetSelector).then((width) => {
|
|
cy.get<number>("@initialHeight").then((initialWidth) => {
|
|
expect(width).to.be.lessThan(initialWidth);
|
|
});
|
|
});
|
|
|
|
// Check if bounding box fits perfectly to the Text Widget
|
|
this.EnsureBoundingBoxFitsComponent(
|
|
this._textWidgetSelector,
|
|
this._textComponentSelector,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Ensures that the bounding box of a widget fits perfectly with the component.
|
|
*
|
|
* @param {string} widgetSelector - Selector for the widget element.
|
|
* @param {string} componentSelector - Selector for the component element.
|
|
* @returns {void}
|
|
*/
|
|
EnsureBoundingBoxFitsComponent(
|
|
widgetSelector: string,
|
|
componentSelector: string,
|
|
) {
|
|
// TODO(aswathkk): Delta should be made 0.5 once the issue with list widget in mobile view is fixed.
|
|
const DELTA = 1;
|
|
this.agHelper.GetElement(widgetSelector).then((widget) => {
|
|
const widgetRect = widget.get(0).getBoundingClientRect();
|
|
this.agHelper.GetElement(componentSelector).then((component) => {
|
|
const componentRect = component.get(0).getBoundingClientRect();
|
|
expect(widgetRect.x).to.be.closeTo(componentRect.x - 2, DELTA);
|
|
expect(widgetRect.y).to.be.closeTo(componentRect.y - 2, DELTA);
|
|
expect(widgetRect.top).to.be.closeTo(componentRect.top - 2, DELTA);
|
|
expect(widgetRect.bottom).to.be.closeTo(
|
|
componentRect.bottom + 2,
|
|
DELTA,
|
|
);
|
|
expect(widgetRect.left).to.be.closeTo(componentRect.left - 2, DELTA);
|
|
expect(widgetRect.right).to.be.closeTo(componentRect.right + 2, DELTA);
|
|
expect(widgetRect.height).to.be.closeTo(
|
|
componentRect.height + 4,
|
|
DELTA,
|
|
);
|
|
expect(widgetRect.width).to.be.closeTo(componentRect.width + 4, DELTA);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Converts the layout to auto layout if not already converted
|
|
*/
|
|
public ConvertToAutoLayout() {
|
|
this.agHelper
|
|
.GetElement(this._autoConvert)
|
|
.invoke("text")
|
|
.then((text: string) => {
|
|
if (text === CONVERT_TO_AUTO_BUTTON()) {
|
|
this.agHelper.GetNClick(this._autoConvert);
|
|
this.agHelper.GetNClick(this._convert);
|
|
this.agHelper.GetNClick(this._refreshApp);
|
|
}
|
|
});
|
|
}
|
|
}
|