From 07b90c23b0f076cc7e48c42d9eb3f272d9c30cd4 Mon Sep 17 00:00:00 2001
From: Alexander Lesnenko <alxnddr@users.noreply.github.com>
Date: Wed, 11 May 2022 13:08:10 +0400
Subject: [PATCH] fix invalid unit on dashboard relative date time filters
 (#22596)

---
 frontend/src/metabase/lib/query_time.js       |  4 +-
 .../22482-round-relative-ranges.cy.spec.js    | 56 +++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js

diff --git a/frontend/src/metabase/lib/query_time.js b/frontend/src/metabase/lib/query_time.js
index 5cbee218f7e..b17e2f621ed 100644
--- a/frontend/src/metabase/lib/query_time.js
+++ b/frontend/src/metabase/lib/query_time.js
@@ -30,14 +30,16 @@ export const DATETIME_UNITS = [
 
 export function computeFilterTimeRange(filter) {
   let expandedFilter;
+  let defaultUnit;
   if (filter[0] === "time-interval") {
+    defaultUnit = filter[3];
     expandedFilter = expandTimeIntervalFilter(filter);
   } else {
     expandedFilter = filter;
   }
 
   const [operator, field, ...values] = expandedFilter;
-  const bucketing = parseFieldBucketing(field, "day");
+  const bucketing = parseFieldBucketing(field, defaultUnit ?? "day");
 
   let start, end;
   if (isStartingFrom(filter)) {
diff --git a/frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js
new file mode 100644
index 00000000000..6d333cf5dea
--- /dev/null
+++ b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js
@@ -0,0 +1,56 @@
+import moment from "moment";
+import {
+  restore,
+  popover,
+  filterWidget,
+  editDashboard,
+  saveDashboard,
+  setFilter,
+  visitDashboard,
+} from "__support__/e2e/cypress";
+
+describe("issue 22482", () => {
+  beforeEach(() => {
+    restore();
+    cy.signInAsAdmin();
+
+    visitDashboard(1);
+
+    editDashboard();
+    setFilter("Time", "All Options");
+
+    cy.findByText("Select…").click();
+    popover()
+      .contains("Created At")
+      .eq(0)
+      .click();
+
+    saveDashboard();
+
+    filterWidget().click();
+    cy.findByText("Relative dates...").click();
+  });
+
+  it("should round relative date range (metabase#22482)", () => {
+    cy.findByTestId("relative-datetime-value")
+      .clear()
+      .type(15);
+    cy.findByTestId("relative-datetime-unit").click();
+    cy.findByText("months").click();
+
+    const expectedRange = getFormattedRange(
+      moment()
+        .startOf("month")
+        .add(-16, "month"),
+      moment()
+        .add(-1, "month")
+        .endOf("month"),
+    );
+
+    cy.findByText(expectedRange);
+  });
+});
+
+function getFormattedRange(start, end) {
+  return `${start.format("MMM D, YYYY")} - ${end.format("MMM D, YYYY")}`;
+}
-- 
GitLab