client/cypress/support/redash-api/index.js (138 lines of code) (raw):
/* global cy, Cypress */
const { extend, get, merge, find } = Cypress._;
export function createDashboard(name) {
return cy.request("POST", "api/dashboards", { name }).then(({ body }) => body);
}
export function createQuery(data, shouldPublish = true) {
const merged = extend(
{
name: "Test Query",
query: "select 1",
data_source_id: 1,
options: {
parameters: [],
},
schedule: null,
},
data
);
// eslint-disable-next-line cypress/no-assigning-return-values
let request = cy.request("POST", "/api/queries", merged).then(({ body }) => body);
if (shouldPublish) {
request = request.then(query =>
cy.request("POST", `/api/queries/${query.id}`, { is_draft: false }).then(() => query)
);
}
return request;
}
export function createVisualization(queryId, type, name, options) {
const data = { query_id: queryId, type, name, options };
return cy.request("POST", "/api/visualizations", data).then(({ body }) => ({
query_id: queryId,
...body,
}));
}
export function addTextbox(dashboardId, text = "text", options = {}) {
const defaultOptions = {
position: { col: 0, row: 0, sizeX: 3, sizeY: 3 },
};
const data = {
width: 1,
dashboard_id: dashboardId,
visualization_id: null,
text,
options: merge(defaultOptions, options),
};
return cy.request("POST", "api/widgets", data).then(({ body }) => {
const id = get(body, "id");
assert.isDefined(id, "Widget api call returns widget id");
return body;
});
}
export function addWidget(dashboardId, visualizationId, options = {}) {
const defaultOptions = {
position: { col: 0, row: 0, sizeX: 3, sizeY: 3 },
};
const data = {
width: 1,
dashboard_id: dashboardId,
visualization_id: visualizationId,
options: merge(defaultOptions, options),
};
return cy.request("POST", "api/widgets", data).then(({ body }) => {
const id = get(body, "id");
assert.isDefined(id, "Widget api call returns widget id");
return body;
});
}
export function createAlert(queryId, options = {}, name) {
const defaultOptions = {
column: "?column?",
op: "greater than",
rearm: 0,
value: 1,
};
const data = {
query_id: queryId,
name: name || "Alert for query " + queryId,
options: merge(defaultOptions, options),
};
return cy.request("POST", "api/alerts", data).then(({ body }) => {
const id = get(body, "id");
assert.isDefined(id, "Alert api call returns alert id");
return body;
});
}
export function createUser({ name, email, password }) {
return cy
.request({
method: "POST",
url: "api/users?no_invite=yes",
body: { name, email },
failOnStatusCode: false,
})
.then(xhr => {
const { status, body } = xhr;
if (status < 200 || status > 400) {
throw new Error(xhr);
}
if (status === 400 && body.message === "Email already taken.") {
// all is good, do nothing
return;
}
const id = get(body, "id");
assert.isDefined(id, "User api call returns user id");
return cy.request({
url: body.invite_link,
method: "POST",
form: true,
body: { password },
});
});
}
export function createDestination(name, type, options = {}) {
return cy.request({
method: "POST",
url: "api/destinations",
body: { name, type, options },
failOnStatusCode: false,
});
}
export function getDestinations() {
return cy.request("GET", "api/destinations").then(({ body }) => body);
}
export function addDestinationSubscription(alertId, destinationName) {
return getDestinations()
.then(destinations => {
const destination = find(destinations, { name: destinationName });
if (!destination) {
throw new Error("Destination not found");
}
return cy.request("POST", `api/alerts/${alertId}/subscriptions`, {
alert_id: alertId,
destination_id: destination.id,
});
})
.then(({ body }) => {
const id = get(body, "id");
assert.isDefined(id, "Subscription api call returns subscription id");
return body;
});
}