From 14cde77a8292d50c160ca5fd45a1e0033fed5883 Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Tue, 1 Nov 2016 14:11:31 -0700
Subject: [PATCH] Add a e2e test for settings, use nice webchauffeur webdriver
 wrapper [ci e2e]

---
 frontend/interfaces/webdriver.js         | 15 +++++++++---
 frontend/test/e2e/.eslintrc              |  1 +
 frontend/test/e2e/admin/settings.spec.js | 30 ++++++++++++++++++++++++
 frontend/test/e2e/support/utils.js       |  3 +++
 package.json                             |  1 +
 yarn.lock                                | 10 ++++++++
 6 files changed, 57 insertions(+), 3 deletions(-)
 create mode 100644 frontend/test/e2e/admin/settings.spec.js

diff --git a/frontend/interfaces/webdriver.js b/frontend/interfaces/webdriver.js
index 46ca335f39c..c3516aeee83 100644
--- a/frontend/interfaces/webdriver.js
+++ b/frontend/interfaces/webdriver.js
@@ -2,14 +2,23 @@
 declare module "selenium-webdriver" {
 
     declare class WebDriver {
-        wait(condition: Condition|Function, timeout: ?number): Promise<WebElement>;
-        findElement(selector: By): WebElement;
+        get(url: string): Promise<void>;
+        wait(condition: Condition|Function, timeout: ?number): WebElementPromise;
+        findElement(selector: By): WebElementPromise;
+        deleteAllCookies(): Promise<void>;
+        getCurrentUrl(): Promise<string>;
     }
 
     declare class WebElement {
+        findElement(selector: By): WebElementPromise;
         click(): Promise<void>;
-        findElement(selector: By): WebElement;
+        sendKeys(keys: string): Promise<void>;
+        clear(): Promise<void>;
         getText(): Promise<string>;
+        getAttribute(attribute: string): Promise<string>;
+    }
+
+    declare class WebElementPromise extends WebElement {
     }
 
     declare class Condition {
diff --git a/frontend/test/e2e/.eslintrc b/frontend/test/e2e/.eslintrc
index ae3567fae18..268deef82ec 100644
--- a/frontend/test/e2e/.eslintrc
+++ b/frontend/test/e2e/.eslintrc
@@ -4,6 +4,7 @@
         "node": true
     },
     "globals": {
+        "d": true,
         "driver": true,
         "server": true
     }
diff --git a/frontend/test/e2e/admin/settings.spec.js b/frontend/test/e2e/admin/settings.spec.js
new file mode 100644
index 00000000000..60124fd413e
--- /dev/null
+++ b/frontend/test/e2e/admin/settings.spec.js
@@ -0,0 +1,30 @@
+
+import {
+    ensureLoggedIn,
+    describeE2E
+} from "../support/utils";
+
+jasmine.DEFAULT_TIMEOUT_INTERVAL = 600000;
+
+describeE2E("admin/settings", () => {
+    beforeEach(() =>
+        ensureLoggedIn(server, driver, "bob@metabase.com", "12341234")
+    );
+
+    describe("admin settings", () => {
+        fit("should persist a setting", async () => {
+            const siteName = "Metabase" + Math.random();
+
+            await d.get(`${server.host}/admin/settings/general`);
+
+            expect(await d.select(".SettingsInput").wait().attribute("value")).not.toBe(siteName);
+
+            await d.select(".SettingsInput").wait().clear().sendKeys(siteName).blur();
+            await d.select(".SaveStatus.text-success").wait();
+
+            await d.get(`${server.host}/admin/settings/general`);
+
+            expect(await d.select(".SettingsInput").wait().attribute("value")).toBe(siteName);
+        });
+    });
+});
diff --git a/frontend/test/e2e/support/utils.js b/frontend/test/e2e/support/utils.js
index 5973e89dc1c..92c460d5abe 100644
--- a/frontend/test/e2e/support/utils.js
+++ b/frontend/test/e2e/support/utils.js
@@ -3,6 +3,8 @@ import path from "path";
 
 import { By, until } from "selenium-webdriver";
 
+import { Driver } from "webchauffeur";
+
 const DEFAULT_TIMEOUT = 50000;
 
 const delay = (timeout = 0) => new Promise((resolve) => setTimeout(resolve, timeout));
@@ -189,6 +191,7 @@ export const describeE2E = (name, options, describeCallback) => {
             ]);
 
             global.driver = webdriver.driver;
+            global.d = new Driver(webdriver.driver);
             global.server = server;
 
             await driver.get(`${server.host}/`);
diff --git a/package.json b/package.json
index d80fbdf9908..db2ac183042 100644
--- a/package.json
+++ b/package.json
@@ -114,6 +114,7 @@
     "selenium-webdriver": "^2.53.3",
     "style-loader": "^0.13.0",
     "unused-files-webpack-plugin": "^2.0.2",
+    "webchauffeur": "^1.0.1",
     "webpack": "^1.12.14",
     "webpack-dev-server": "^1.14.0",
     "webpack-hot-middleware": "^2.10.0",
diff --git a/yarn.lock b/yarn.lock
index 56e18bb0f1b..e5ea5d52256 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5377,6 +5377,10 @@ progress@^1.1.8:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
 
+promise-chain-decorator@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/promise-chain-decorator/-/promise-chain-decorator-1.2.0.tgz#3ed952bd37f6351b3989468d1aff40e7d740b451"
+
 promise@^7.1.1:
   version "7.1.1"
   resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
@@ -6902,6 +6906,12 @@ watchpack@^0.2.1:
     chokidar "^1.0.0"
     graceful-fs "^4.1.2"
 
+webchauffeur:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/webchauffeur/-/webchauffeur-1.0.1.tgz#ed9d4ae28bb3a2e87d755b2d470c535e39cf30e4"
+  dependencies:
+    promise-chain-decorator "^1.2.0"
+
 webpack-core@~0.6.0:
   version "0.6.8"
   resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.8.tgz#edf9135de00a6a3c26dd0f14b208af0aa4af8d0a"
-- 
GitLab