From a7351e9b303dfcf8525ffe9331e58f1715ece1ce Mon Sep 17 00:00:00 2001
From: Gustavo Saiani <gustavo@poe.ma>
Date: Mon, 30 Aug 2021 15:52:47 -0300
Subject: [PATCH] When creating database, pass syncing schedule options to api
 (#17639)

---
 .../src/metabase/admin/databases/database.js  |  8 ++-
 .../editParamsForUserControlledScheduling.js  | 20 +++++++
 ...msForUserControlledScheduling.unit.spec.js | 56 +++++++++++++++++++
 .../scenarios/admin/databases/add.cy.spec.js  |  2 +-
 4 files changed, 84 insertions(+), 2 deletions(-)
 create mode 100644 frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.js
 create mode 100644 frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.unit.spec.js

diff --git a/frontend/src/metabase/admin/databases/database.js b/frontend/src/metabase/admin/databases/database.js
index 17397dc3fdf..72a4d9e1c11 100644
--- a/frontend/src/metabase/admin/databases/database.js
+++ b/frontend/src/metabase/admin/databases/database.js
@@ -12,6 +12,8 @@ import MetabaseSettings from "metabase/lib/settings";
 import { MetabaseApi } from "metabase/services";
 import Databases from "metabase/entities/databases";
 
+import { editParamsForUserControlledScheduling } from "./editParamsForUserControlledScheduling";
+
 // Default schedules for db sync and deep analysis
 export const DEFAULT_SCHEDULES = {
   cache_field_values: {
@@ -165,10 +167,12 @@ export const proceedWithDbCreation = function(database) {
     if (database.details["let-user-control-scheduling"]) {
       try {
         dispatch.action(VALIDATE_DATABASE_STARTED);
+
         const { valid } = await MetabaseApi.db_validate({ details: database });
+
         if (valid) {
           dispatch.action(SET_DATABASE_CREATION_STEP, {
-            database: database,
+            database,
             step: DB_EDIT_FORM_SCHEDULING_TAB,
           });
         } else {
@@ -190,6 +194,8 @@ export const proceedWithDbCreation = function(database) {
 };
 
 export const createDatabase = function(database) {
+  editParamsForUserControlledScheduling(database);
+
   return async function(dispatch, getState) {
     try {
       dispatch.action(CREATE_DATABASE_STARTED, {});
diff --git a/frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.js b/frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.js
new file mode 100644
index 00000000000..9b29a9e6254
--- /dev/null
+++ b/frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.js
@@ -0,0 +1,20 @@
+export function editParamsForUserControlledScheduling(database) {
+  editSyncParamsForUserControlledScheduling(database);
+  editScheduleParamsForUserControlledScheduling(database);
+}
+
+function editSyncParamsForUserControlledScheduling(database) {
+  if (database.details["let-user-control-scheduling"]) {
+    database.is_full_sync = false;
+  }
+}
+
+function editScheduleParamsForUserControlledScheduling(database) {
+  const { details, schedules } = database;
+
+  if (details["let-user-control-scheduling"] && !schedules?.metadata_sync) {
+    database.schedules.metadata_sync = {
+      schedule_type: "daily",
+    };
+  }
+}
diff --git a/frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.unit.spec.js b/frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.unit.spec.js
new file mode 100644
index 00000000000..3b32538412c
--- /dev/null
+++ b/frontend/src/metabase/admin/databases/editParamsForUserControlledScheduling.unit.spec.js
@@ -0,0 +1,56 @@
+import { editParamsForUserControlledScheduling } from "./editParamsForUserControlledScheduling";
+
+it("adds full_sync param if user will control scheduling", () => {
+  const database = {
+    schedules: {},
+    details: { "let-user-control-scheduling": true },
+  };
+
+  editParamsForUserControlledScheduling(database);
+
+  expect(database.is_full_sync).toBe(false);
+});
+
+it("does not add full_sync param if user will not control scheduling", () => {
+  const database = {
+    schedules: {},
+    details: {},
+  };
+
+  editParamsForUserControlledScheduling(database);
+
+  expect(database.is_full_sync).toBe(undefined);
+});
+
+it("adds metadata_sync param if user will control scheduling and no metadata_sync data is present", () => {
+  const database = {
+    schedules: {},
+    details: { "let-user-control-scheduling": true },
+  };
+
+  editParamsForUserControlledScheduling(database);
+
+  expect(database.schedules.metadata_sync.schedule_type).toBe("daily");
+});
+
+it("does not add metadata_sync param if user will not control scheduling", () => {
+  const database = {
+    schedules: {},
+    details: {},
+  };
+
+  editParamsForUserControlledScheduling(database);
+
+  expect(database.schedules).toStrictEqual({});
+});
+
+it("does not add metadata_sync param if user will control scheduling and metadata_sync data is present", () => {
+  const database = {
+    schedules: { metadata_sync: { schedule_type: "hourly" } },
+    details: { "let-user-control-scheduling": true },
+  };
+
+  editParamsForUserControlledScheduling(database);
+
+  expect(database.schedules.metadata_sync.schedule_type).toBe("hourly");
+});
diff --git a/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
index 8a0a0d290c5..a1430d6ac82 100644
--- a/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
@@ -184,7 +184,7 @@ describe("scenarios > admin > databases > add", () => {
     );
   });
 
-  it.skip("should respect users' decision to manually sync large database (metabase#17450)", () => {
+  it("should respect users' decision to manually sync large database (metabase#17450)", () => {
     const H2_CONNECTION_STRING =
       "zip:./target/uberjar/metabase.jar!/sample-dataset.db;USER=GUEST;PASSWORD=guest";
 
-- 
GitLab