Skip to content
Snippets Groups Projects
Unverified Commit ed264af5 authored by Nemanja Glumac's avatar Nemanja Glumac Committed by GitHub
Browse files

[SQL filters coverage] Extract and apply basic SQL filter helpers (#16887)

* Extract the basic SQL filter helpers

* Apply basic helper filters to the `sql-filters.cy.spec.js`

* Fix typos

* Simplify banner comments

* Apply basic helper filters to the `sql-field-filter-string.cy.spec.js`

* Apply basic helper filters to the `sql-field-filter-number.cy.spec.js`

* Apply basic helper filters to the `sql-field-filter-date.cy.spec.js`
parent 5dd4e994
No related branches found
No related tags found
No related merge requests found
import { filterWidget, popover } from "__support__/e2e/cypress";
// FILTER TYPES
/**
* Opens popover with the list of possible SQL filter types to choose from.
* It does so from the currently selected SQL filter type.
*
* @param {("Text"|"Number"|"Date"|"Field Filter")} filterType
*/
export function openTypePickerFromSelectedFilterType(filterType) {
cy.get(".AdminSelect-content")
.contains(filterType)
.click();
}
/**
* Opens popover with the list of possible SQL filter types to choose from.
* It does so from the default SQL filter type, which is "Text".
*
* @see {@link openTypePickerFromSelectedFilterType}
*/
export function openTypePickerFromDefaultFilterType() {
openTypePickerFromSelectedFilterType("Text");
}
/**
* Sets the SQL filter type.
*
* @param {("Text"|"Number"|"Date"|"Field Filter")} filterType
*
* @example
* chooseType("Date");
*/
export function chooseType(filterType) {
popover().within(() => {
cy.findByText(filterType).click();
});
}
// FILTER VALUE
/**
* Enter filter value explicitly through the filter widget.
*
* @param {string} value
*/
export function setWidgetValue(value) {
filterWidget()
.click()
.type(value);
}
/**
* Enter a default value when filter is marked as required.
*
* @param {string} value
*/
export function setDefaultValue(value) {
cy.findByPlaceholderText("Enter a default value...").type(value);
}
// UI PATTERNS
/**
* Toggle the required SQL filter on or off. It is off by default.
*/
export function toggleRequired() {
cy.findByText("Required?")
.parent()
.find("a")
.click();
}
// FILTER QUERY
/**
* Executes native query and waits for the results to load.
* Makes sure that the question is not "dirty" after the query successfully ran.
* @param {string} [xhrAlias ="dataset"]
*/
export function runQuery(xhrAlias = "dataset") {
cy.get(".NativeQueryEditor .Icon-play").click();
cy.wait("@" + xhrAlias);
cy.icon("play").should("not.exist");
}
/**
* Enters parameterized native query into native editor.
*
* @param {string} query
*/
export function enterParameterizedQuery(query) {
cy.get("@editor").type(query, { parseSpecialCharSequences: false });
}
......@@ -5,6 +5,8 @@ import {
popover,
} from "__support__/e2e/cypress";
import * as SQLFilter from "./helpers/e2e-sql-filter-helpers";
const currentYearString = new Date().getFullYear().toString();
const DATE_FILTER_SUBTYPES = {
......@@ -55,10 +57,12 @@ describe("scenarios > filters > sql filters > field filter > Date", () => {
mockSessionProperty("field-filter-operators-enabled?", true);
openNativeEditor();
enterNativeQuery("SELECT * FROM products WHERE {{filter}}");
SQLFilter.enterParameterizedQuery(
"SELECT * FROM products WHERE {{filter}}",
);
openPopoverFromDefaultFilterType();
setFilterType("Field Filter");
SQLFilter.openTypePickerFromDefaultFilterType();
SQLFilter.chooseType("Field Filter");
mapFieldFilterTo({
table: "Products",
......@@ -76,7 +80,7 @@ describe("scenarios > filters > sql filters > field filter > Date", () => {
it("when set through the filter widget", () => {
dateFilterSelector({ filterType: subType, filterValue: value });
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText(representativeResult);
......@@ -90,7 +94,7 @@ describe("scenarios > filters > sql filters > field filter > Date", () => {
isFilterRequired: true,
});
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText(representativeResult);
......@@ -101,32 +105,6 @@ describe("scenarios > filters > sql filters > field filter > Date", () => {
);
});
function openPopoverFromSelectedFilterType(filterType) {
cy.get(".AdminSelect-content")
.contains(filterType)
.click();
}
function openPopoverFromDefaultFilterType() {
openPopoverFromSelectedFilterType("Text");
}
function setFilterType(filterType) {
popover().within(() => {
cy.findByText(filterType).click();
});
}
function runQuery(xhrAlias = "dataset") {
cy.get(".NativeQueryEditor .Icon-play").click();
cy.wait("@" + xhrAlias);
cy.icon("play").should("not.exist");
}
function enterNativeQuery(query) {
cy.get("@editor").type(query, { parseSpecialCharSequences: false });
}
function mapFieldFilterTo({ table, field } = {}) {
popover()
.contains(table)
......@@ -210,15 +188,8 @@ function setDateFilter({ condition, quantity, timeBucket } = {}) {
cy.button("Update filter").click();
}
function toggleRequiredFilter() {
cy.findByText("Required?")
.parent()
.find("a")
.click();
}
function openDateFilterPicker(isFilterRequired) {
isFilterRequired && toggleRequiredFilter();
isFilterRequired && SQLFilter.toggleRequired();
const selector = isFilterRequired
? cy.findByText("Select a default value…")
......@@ -232,34 +203,30 @@ function dateFilterSelector({
filterValue,
isFilterRequired = false,
} = {}) {
openDateFilterPicker(isFilterRequired);
switch (filterType) {
case "Month and Year":
openDateFilterPicker(isFilterRequired);
setMonthAndYearFilter(filterValue);
break;
case "Quarter and Year":
openDateFilterPicker(isFilterRequired);
setQuarterAndYearFilter(filterValue);
break;
case "Single Date":
openDateFilterPicker(isFilterRequired);
setSingleDateFilter(filterValue);
break;
case "Date Range":
openDateFilterPicker(isFilterRequired);
setDateRangeFilter(filterValue);
break;
case "Relative Date":
openDateFilterPicker(isFilterRequired);
setRelativeDateFilter(filterValue);
break;
case "Date Filter":
openDateFilterPicker(isFilterRequired);
setDateFilter(filterValue);
break;
......
......@@ -5,6 +5,8 @@ import {
popover,
} from "__support__/e2e/cypress";
import * as SQLFilter from "./helpers/e2e-sql-filter-helpers";
const NUMBER_FILTER_SUBTYPES = {
"Equal to": {
term: "4.3",
......@@ -38,10 +40,12 @@ describe("scenarios > filters > sql filters > field filter > Number", () => {
mockSessionProperty("field-filter-operators-enabled?", true);
openNativeEditor();
enterNativeQuery("SELECT * FROM products WHERE {{filter}}");
SQLFilter.enterParameterizedQuery(
"SELECT * FROM products WHERE {{filter}}",
);
openPopoverFromDefaultFilterType();
setFilterType("Field Filter");
SQLFilter.openTypePickerFromDefaultFilterType();
SQLFilter.chooseType("Field Filter");
mapFieldFilterTo({
table: "Products",
......@@ -57,7 +61,7 @@ describe("scenarios > filters > sql filters > field filter > Number", () => {
setFieldFilterWidgetValue(term);
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText(representativeResult);
......@@ -67,9 +71,10 @@ describe("scenarios > filters > sql filters > field filter > Number", () => {
it("when set as the default value for a required filter", () => {
setFilterWidgetType(subType);
SQLFilter.toggleRequired();
setRequiredFieldFilterDefaultValue(term);
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText(representativeResult);
......@@ -80,42 +85,7 @@ describe("scenarios > filters > sql filters > field filter > Number", () => {
);
});
function openPopoverFromSelectedFilterType(filterType) {
cy.get(".AdminSelect-content")
.contains(filterType)
.click();
}
function openPopoverFromDefaultFilterType() {
openPopoverFromSelectedFilterType("Text");
}
function setFilterType(filterType) {
popover().within(() => {
cy.findByText(filterType).click();
});
}
function runQuery(xhrAlias = "dataset") {
cy.get(".NativeQueryEditor .Icon-play").click();
cy.wait("@" + xhrAlias);
cy.icon("play").should("not.exist");
}
function enterNativeQuery(query) {
cy.get("@editor").type(query, { parseSpecialCharSequences: false });
}
function toggleRequiredFilter() {
cy.findByText("Required?")
.parent()
.find("a")
.click();
}
function setRequiredFieldFilterDefaultValue(value) {
toggleRequiredFilter();
cy.findByText("Enter a default value...").click();
if (Array.isArray(value)) {
......
......@@ -5,6 +5,8 @@ import {
openNativeEditor,
} from "__support__/e2e/cypress";
import * as SQLFilter from "./helpers/e2e-sql-filter-helpers";
const STRING_FILTER_SUBTYPES = {
String: {
term: "Synergistic Granite Chair",
......@@ -42,10 +44,12 @@ describe("scenarios > filters > sql filters > field filter > String", () => {
mockSessionProperty("field-filter-operators-enabled?", true);
openNativeEditor();
enterNativeQuery("SELECT * FROM products WHERE {{filter}}");
SQLFilter.enterParameterizedQuery(
"SELECT * FROM products WHERE {{filter}}",
);
openPopoverFromDefaultFilterType();
setFilterType("Field Filter");
SQLFilter.openTypePickerFromDefaultFilterType();
SQLFilter.chooseType("Field Filter");
mapFieldFilterTo({
table: "Products",
......@@ -61,7 +65,7 @@ describe("scenarios > filters > sql filters > field filter > String", () => {
setFieldFilterWidgetValue(term);
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText(representativeResult);
......@@ -71,9 +75,10 @@ describe("scenarios > filters > sql filters > field filter > String", () => {
it("when set as the default value for a required filter", () => {
setFilterWidgetType(subType);
SQLFilter.toggleRequired();
setRequiredFieldFilterDefaultValue(term);
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText(representativeResult);
......@@ -84,42 +89,7 @@ describe("scenarios > filters > sql filters > field filter > String", () => {
);
});
function openPopoverFromSelectedFilterType(filterType) {
cy.get(".AdminSelect-content")
.contains(filterType)
.click();
}
function openPopoverFromDefaultFilterType() {
openPopoverFromSelectedFilterType("Text");
}
function setFilterType(filterType) {
popover().within(() => {
cy.findByText(filterType).click();
});
}
function runQuery(xhrAlias = "dataset") {
cy.get(".NativeQueryEditor .Icon-play").click();
cy.wait("@" + xhrAlias);
cy.icon("play").should("not.exist");
}
function enterNativeQuery(query) {
cy.get("@editor").type(query, { parseSpecialCharSequences: false });
}
function toggleRequiredFilter() {
cy.findByText("Required?")
.parent()
.find("a")
.click();
}
function setRequiredFieldFilterDefaultValue(value) {
toggleRequiredFilter();
cy.findByText("Enter a default value...").click();
cy.findByPlaceholderText("Enter a default value...").type(value);
cy.button("Add filter").click();
......
import {
restore,
popover,
mockSessionProperty,
openNativeEditor,
filterWidget,
} from "__support__/e2e/cypress";
import * as SQLFilter from "./helpers/e2e-sql-filter-helpers";
describe("scenarios > filters > sql filters > basic filter types", () => {
beforeEach(() => {
restore();
......@@ -20,15 +21,15 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
describe("should work for text", () => {
beforeEach(() => {
enterNativeQuery(
SQLFilter.enterParameterizedQuery(
"SELECT * FROM products WHERE products.category = {{textFilter}}",
);
});
it("when set through the filter widget", () => {
setFilterWidgetValue("Gizmo");
SQLFilter.setWidgetValue("Gizmo");
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText("Rustic Paper Wallet");
......@@ -37,9 +38,10 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
});
it("when set as the default value for a required filter", () => {
setRequiredFilterDefaultValue("Gizmo");
SQLFilter.toggleRequired();
SQLFilter.setDefaultValue("Gizmo");
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText("Rustic Paper Wallet");
......@@ -50,18 +52,18 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
describe("should work for number", () => {
beforeEach(() => {
enterNativeQuery(
SQLFilter.enterParameterizedQuery(
"SELECT * FROM products WHERE products.rating = {{numberFilter}}",
);
openPopoverFromDefaultFilterType();
setFilterType("Number");
SQLFilter.openTypePickerFromDefaultFilterType();
SQLFilter.chooseType("Number");
});
it("when set through the filter widget", () => {
setFilterWidgetValue("4.3");
SQLFilter.setWidgetValue("4.3");
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText("Aerodynamic Linen Coat");
......@@ -70,9 +72,10 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
});
it("when set as the default value for a required filter (metabase#16811)", () => {
setRequiredFilterDefaultValue("4.3");
SQLFilter.toggleRequired();
SQLFilter.setDefaultValue("4.3");
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText("Aerodynamic Linen Coat");
......@@ -83,12 +86,12 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
describe("should work for date", () => {
beforeEach(() => {
enterNativeQuery(
SQLFilter.enterParameterizedQuery(
"SELECT * FROM products WHERE products.created_at = {{dateFilter}}",
);
openPopoverFromDefaultFilterType();
setFilterType("Date");
SQLFilter.openTypePickerFromDefaultFilterType();
SQLFilter.chooseType("Date");
});
it("when set through the filter widget", () => {
......@@ -97,7 +100,7 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
// Instead, let's choose the 15th of the current month and assert that there are no products / no results.
cy.findByText("15").click();
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText("No results!");
......@@ -105,12 +108,12 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
});
it("when set as the default value for a required filter", () => {
toggleRequiredFilter();
SQLFilter.toggleRequired();
cy.findByText("Select a default value…").click();
cy.findByText("15").click();
runQuery();
SQLFilter.runQuery();
cy.get(".Visualization").within(() => {
cy.findByText("No results!");
......@@ -118,47 +121,3 @@ describe("scenarios > filters > sql filters > basic filter types", () => {
});
});
});
function openPopoverFromSelectedFilterType(filterType) {
cy.get(".AdminSelect-content")
.contains(filterType)
.click();
}
function openPopoverFromDefaultFilterType() {
openPopoverFromSelectedFilterType("Text");
}
function setFilterType(filterType) {
popover().within(() => {
cy.findByText(filterType).click();
});
}
function runQuery(xhrAlias = "dataset") {
cy.get(".NativeQueryEditor .Icon-play").click();
cy.wait("@" + xhrAlias);
cy.icon("play").should("not.exist");
}
function enterNativeQuery(query) {
cy.get("@editor").type(query, { parseSpecialCharSequences: false });
}
function setFilterWidgetValue(value) {
filterWidget()
.click()
.type(value);
}
function toggleRequiredFilter() {
cy.findByText("Required?")
.parent()
.find("a")
.click();
}
function setRequiredFilterDefaultValue(value) {
toggleRequiredFilter();
cy.findByPlaceholderText("Enter a default value...").type(value);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment