client/cypress/integration/dashboard/sharing_spec.js (153 lines of code) (raw):
/* global cy */
import { createDashboard, createQuery } from "../../support/redash-api";
import { editDashboard, shareDashboard, createQueryAndAddWidget } from "../../support/dashboard";
describe("Dashboard Sharing", () => {
beforeEach(function() {
cy.login();
createDashboard("Foo Bar").then(({ slug, id }) => {
this.dashboardId = id;
this.dashboardUrl = `/dashboard/${slug}`;
});
});
it("is possible if all queries are safe", function() {
const options = {
parameters: [
{
name: "foo",
type: "number",
},
],
};
const dashboardUrl = this.dashboardUrl;
createQuery({ options }).then(({ id: queryId }) => {
cy.visit(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.clickThrough(
{
button: `
Done Editing
Publish
`,
},
`OpenShareForm
PublicAccessEnabled`
);
cy.getByTestId("SecretAddress").should("exist");
});
});
describe("is available to unauthenticated users", () => {
it("when there are no parameters", function() {
const queryData = {
query: "select 1",
};
const position = { autoHeight: false, sizeY: 6 };
createQueryAndAddWidget(this.dashboardId, queryData, { position }).then(() => {
cy.visit(this.dashboardUrl);
shareDashboard().then(secretAddress => {
cy.logout();
cy.visit(secretAddress);
cy.getByTestId("TableVisualization", { timeout: 10000 }).should("exist");
cy.percySnapshot("Successfully Shared Unparameterized Dashboard");
});
});
});
it("when there are only safe parameters", function() {
const queryData = {
query: "select '{{foo}}'",
options: {
parameters: [
{
name: "foo",
type: "number",
value: 1,
},
],
},
};
const position = { autoHeight: false, sizeY: 6 };
createQueryAndAddWidget(this.dashboardId, queryData, { position }).then(() => {
cy.visit(this.dashboardUrl);
shareDashboard().then(secretAddress => {
cy.logout();
cy.visit(secretAddress);
cy.getByTestId("TableVisualization", { timeout: 10000 }).should("exist");
cy.percySnapshot("Successfully Shared Parameterized Dashboard");
});
});
});
it("even when there are suddenly some unsafe parameters", function() {
const queryData = {
query: "select 1",
};
// start out by creating a dashboard with no parameters & share it
const position = { autoHeight: false, sizeY: 6 };
createQueryAndAddWidget(this.dashboardId, queryData, { position })
.then(() => {
cy.visit(this.dashboardUrl);
return shareDashboard();
})
.then(secretAddress => {
const unsafeQueryData = {
query: "select '{{foo}}'",
options: {
parameters: [
{
name: "foo",
type: "text",
value: "oh snap!",
},
],
},
};
// then, after it is shared, add an unsafe parameterized query to it
const secondWidgetPos = { autoHeight: false, col: 3, sizeY: 6 };
createQueryAndAddWidget(this.dashboardId, unsafeQueryData, { position: secondWidgetPos }).then(() => {
cy.logout();
cy.title().should("eq", "Login to Redash"); // Make sure it's logged out
cy.visit(secretAddress);
cy.getByTestId("TableVisualization", { timeout: 10000 }).should("exist");
cy.contains(
".alert",
"This query contains potentially unsafe parameters" +
" and cannot be executed on a shared dashboard or an embedded visualization."
);
cy.percySnapshot("Successfully Shared Parameterized Dashboard With Some Unsafe Queries");
});
});
});
});
it("is not possible if some queries are not safe", function() {
const options = {
parameters: [
{
name: "foo",
type: "text",
},
],
};
const dashboardUrl = this.dashboardUrl;
createQuery({ options }).then(({ id: queryId }) => {
cy.visit(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.clickThrough(
{
button: `
Done Editing
Publish
`,
},
"OpenShareForm"
);
cy.getByTestId("PublicAccessEnabled").should("be.disabled");
});
});
});