mirror of
https://github.com/getredash/redash.git
synced 2025-12-21 10:25:33 -05:00
* allow non-sequential IDs for DataSources in Cypress tests * refactor redash-api to a set of Cypress commands * support mounting Redash endpoints in Cypress routes * fix some parameter specs by waiting for schema to load * extract baseUrl from cypress.json * Restyled by prettier (#5110) Co-authored-by: Restyled.io <commits@restyled.io> Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com> Co-authored-by: Restyled.io <commits@restyled.io>
221 lines
6.9 KiB
JavaScript
221 lines
6.9 KiB
JavaScript
/* global cy */
|
|
|
|
import { createQueryAndAddWidget, editDashboard, resizeBy } from "../../support/dashboard";
|
|
|
|
describe("Widget", () => {
|
|
beforeEach(function() {
|
|
cy.login();
|
|
cy.createDashboard("Foo Bar").then(({ id }) => {
|
|
this.dashboardId = id;
|
|
this.dashboardUrl = `/dashboards/${id}`;
|
|
});
|
|
});
|
|
|
|
const confirmDeletionInModal = () => {
|
|
cy.get(".ant-modal .ant-btn")
|
|
.contains("Delete")
|
|
.click({ force: true });
|
|
};
|
|
|
|
it("adds widget", function() {
|
|
cy.createQuery().then(({ id: queryId }) => {
|
|
cy.visit(this.dashboardUrl);
|
|
editDashboard();
|
|
cy.getByTestId("AddWidgetButton").click();
|
|
cy.getByTestId("AddWidgetDialog").within(() => {
|
|
cy.get(`.query-selector-result[data-test="QueryId${queryId}"]`).click();
|
|
});
|
|
cy.contains("button", "Add to Dashboard").click();
|
|
cy.getByTestId("AddWidgetDialog").should("not.exist");
|
|
cy.get(".widget-wrapper").should("exist");
|
|
});
|
|
});
|
|
|
|
it("removes widget", function() {
|
|
createQueryAndAddWidget(this.dashboardId).then(elTestId => {
|
|
cy.visit(this.dashboardUrl);
|
|
editDashboard();
|
|
cy.getByTestId(elTestId).within(() => {
|
|
cy.getByTestId("WidgetDeleteButton").click();
|
|
});
|
|
|
|
confirmDeletionInModal();
|
|
cy.getByTestId(elTestId).should("not.exist");
|
|
});
|
|
});
|
|
|
|
describe("Auto height for table visualization", () => {
|
|
it("renders correct height for 2 table rows", function() {
|
|
const queryData = {
|
|
query: "select s.a FROM generate_series(1,2) AS s(a)",
|
|
};
|
|
|
|
createQueryAndAddWidget(this.dashboardId, queryData).then(elTestId => {
|
|
cy.visit(this.dashboardUrl);
|
|
cy.getByTestId(elTestId)
|
|
.its("0.offsetHeight")
|
|
.should("eq", 235);
|
|
});
|
|
});
|
|
|
|
it("renders correct height for 5 table rows", function() {
|
|
const queryData = {
|
|
query: "select s.a FROM generate_series(1,5) AS s(a)",
|
|
};
|
|
|
|
createQueryAndAddWidget(this.dashboardId, queryData).then(elTestId => {
|
|
cy.visit(this.dashboardUrl);
|
|
cy.getByTestId(elTestId)
|
|
.its("0.offsetHeight")
|
|
.should("eq", 335);
|
|
});
|
|
});
|
|
|
|
describe("Height behavior on refresh", () => {
|
|
const paramName = "count";
|
|
const queryData = {
|
|
query: `select s.a FROM generate_series(1,{{ ${paramName} }}) AS s(a)`,
|
|
options: {
|
|
parameters: [
|
|
{
|
|
title: paramName,
|
|
name: paramName,
|
|
type: "text",
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
beforeEach(function() {
|
|
createQueryAndAddWidget(this.dashboardId, queryData).then(elTestId => {
|
|
cy.visit(this.dashboardUrl);
|
|
cy.getByTestId(elTestId)
|
|
.as("widget")
|
|
.within(() => {
|
|
cy.getByTestId("RefreshButton").as("refreshButton");
|
|
});
|
|
cy.getByTestId(`ParameterName-${paramName}`).within(() => {
|
|
cy.getByTestId("TextParamInput").as("paramInput");
|
|
});
|
|
});
|
|
});
|
|
|
|
it("grows when dynamically adding table rows", () => {
|
|
// listen to results
|
|
cy.server();
|
|
cy.route("GET", "**/api/query_results/*").as("FreshResults");
|
|
|
|
// start with 1 table row
|
|
cy.get("@paramInput")
|
|
.clear()
|
|
.type("1");
|
|
cy.getByTestId("ParameterApplyButton").click();
|
|
cy.wait("@FreshResults", { timeout: 10000 });
|
|
cy.get("@widget")
|
|
.invoke("height")
|
|
.should("eq", 285);
|
|
|
|
// add 4 table rows
|
|
cy.get("@paramInput")
|
|
.clear()
|
|
.type("5");
|
|
cy.getByTestId("ParameterApplyButton").click();
|
|
cy.wait("@FreshResults", { timeout: 10000 });
|
|
|
|
// expect to height to grow by 1 grid grow
|
|
cy.get("@widget")
|
|
.invoke("height")
|
|
.should("eq", 435);
|
|
});
|
|
|
|
it("revokes auto height after manual height adjustment", () => {
|
|
// listen to results
|
|
cy.server();
|
|
cy.route("GET", "**/api/query_results/*").as("FreshResults");
|
|
|
|
editDashboard();
|
|
|
|
// start with 1 table row
|
|
cy.get("@paramInput")
|
|
.clear()
|
|
.type("1");
|
|
cy.getByTestId("ParameterApplyButton").click();
|
|
cy.wait("@FreshResults");
|
|
cy.get("@widget")
|
|
.invoke("height")
|
|
.should("eq", 285);
|
|
|
|
// resize height by 1 grid row
|
|
resizeBy(cy.get("@widget"), 0, 50)
|
|
.then(() => cy.get("@widget"))
|
|
.invoke("height")
|
|
.should("eq", 335); // resized by 50, , 135 -> 185
|
|
|
|
// add 4 table rows
|
|
cy.get("@paramInput")
|
|
.clear()
|
|
.type("5");
|
|
cy.getByTestId("ParameterApplyButton").click();
|
|
cy.wait("@FreshResults");
|
|
|
|
// expect height to stay unchanged (would have been 435)
|
|
cy.get("@widget")
|
|
.invoke("height")
|
|
.should("eq", 335);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("sets the correct height of table visualization", function() {
|
|
const queryData = {
|
|
query: `select '${"loremipsum".repeat(15)}' FROM generate_series(1,15)`,
|
|
};
|
|
|
|
const widgetOptions = { position: { col: 0, row: 0, sizeX: 3, sizeY: 10, autoHeight: false } };
|
|
|
|
createQueryAndAddWidget(this.dashboardId, queryData, widgetOptions).then(() => {
|
|
cy.visit(this.dashboardUrl);
|
|
cy.getByTestId("TableVisualization")
|
|
.its("0.offsetHeight")
|
|
.should("eq", 381);
|
|
cy.percySnapshot("Shows correct height of table visualization");
|
|
});
|
|
});
|
|
|
|
it("shows fixed pagination for overflowing tabular content ", function() {
|
|
const queryData = {
|
|
query: "select 'lorem ipsum' FROM generate_series(1,50)",
|
|
};
|
|
|
|
const widgetOptions = { position: { col: 0, row: 0, sizeX: 3, sizeY: 10, autoHeight: false } };
|
|
|
|
createQueryAndAddWidget(this.dashboardId, queryData, widgetOptions).then(() => {
|
|
cy.visit(this.dashboardUrl);
|
|
cy.getByTestId("TableVisualization")
|
|
.next(".ant-pagination.mini")
|
|
.should("be.visible");
|
|
cy.percySnapshot("Shows fixed mini pagination for overflowing tabular content");
|
|
});
|
|
});
|
|
|
|
it("keeps results on screen while refreshing", function() {
|
|
const queryData = {
|
|
query: "select pg_sleep({{sleep-time}}), 'sleep time: {{sleep-time}}' as sleeptime",
|
|
options: { parameters: [{ name: "sleep-time", title: "Sleep time", type: "number", value: 0 }] },
|
|
};
|
|
|
|
createQueryAndAddWidget(this.dashboardId, queryData).then(elTestId => {
|
|
cy.visit(this.dashboardUrl);
|
|
cy.getByTestId(elTestId).within(() => {
|
|
cy.getByTestId("TableVisualization").should("contain", "sleep time: 0");
|
|
cy.get(".refresh-indicator").should("not.be.visible");
|
|
|
|
cy.getByTestId("ParameterName-sleep-time").type("10");
|
|
cy.getByTestId("ParameterApplyButton").click();
|
|
cy.get(".refresh-indicator").should("be.visible");
|
|
cy.getByTestId("TableVisualization").should("contain", "sleep time: 0");
|
|
});
|
|
});
|
|
});
|
|
});
|