From ca14e0f92f7c4d531cd948185d41e4f302171e57 Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Wed, 10 Aug 2016 03:55:45 -0700
Subject: [PATCH] Cleanup e2e test harnesses, implement a couple tests

---
 bin/build                                     |   8 +-
 frontend/test/e2e/auth/login.spec.js          |  66 ++++++++++--
 .../test/e2e/support/fixtures/setup.db.h2.db  | Bin 0 -> 933888 bytes
 frontend/test/e2e/support/start-server.js     | 101 +++++++++++-------
 package.json                                  |   1 +
 5 files changed, 126 insertions(+), 50 deletions(-)
 create mode 100644 frontend/test/e2e/support/fixtures/setup.db.h2.db

diff --git a/bin/build b/bin/build
index 9e7b287fb7d..5bc52d532c6 100755
--- a/bin/build
+++ b/bin/build
@@ -18,11 +18,15 @@ version() {
 }
 
 frontend() {
+    if [ -z ${WEBPACK_OPTS+x} ]; then
+        WEBPACK_OPTS="-p"
+    fi
+
     echo "Running 'npm install' to download javascript dependencies..." &&
     npm install &&
 
-    echo "Running 'webpack -p' to assemble and minify frontend assets..." &&
-    ./node_modules/webpack/bin/webpack.js -p
+    echo "Running 'webpack $WEBPACK_OPTS' to assemble and minify frontend assets..." &&
+    ./node_modules/.bin/webpack $WEBPACK_OPTS
 }
 
 sample-dataset() {
diff --git a/frontend/test/e2e/auth/login.spec.js b/frontend/test/e2e/auth/login.spec.js
index 6840d4826da..2759f3d0791 100644
--- a/frontend/test/e2e/auth/login.spec.js
+++ b/frontend/test/e2e/auth/login.spec.js
@@ -1,30 +1,74 @@
-import { startServer, stopServer, isReady } from "../support/start-server";
+import { startServer, isReady } from "../support/start-server";
 import webdriver, { By, until } from "selenium-webdriver";
 
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000;
 
+async function loginMetabase(driver, username, password) {
+    await driver.wait(until.elementLocated(By.css("[name=email]")));
+    await driver.findElement(By.css("[name=email]")).sendKeys(username);
+    await driver.findElement(By.css("[name=password]")).sendKeys(password);
+    await driver.manage().timeouts().implicitlyWait(1000);
+    await driver.findElement(By.css(".Button.Button--primary")).click();
+}
+
+function waitForUrl(driver, url, timeout = 5000) {
+    return driver.wait(async () => await driver.getCurrentUrl() === url, timeout);
+}
+
 describe("auth/login", () => {
-    let host, driver;
+    let server, driver;
 
     beforeAll(async () => {
-        host = await startServer("metabase");
+        server = await startServer("frontend/test/e2e/support/fixtures/setup.db");
         driver = new webdriver.Builder()
             .forBrowser('chrome')
             .build();
-        await driver.navigate().to(`${host}/`);
     });
 
-    it("should start", async () => {
-        expect(await isReady(host)).toEqual(true);
+    it ("should start", async () => {
+        expect(await isReady(server.host)).toEqual(true);
+    });
+
+    describe("has no cookie", () => {
+        beforeEach(async () => {
+            await driver.get(`${server.host}/`);
+            await driver.manage().deleteAllCookies();
+        });
+
+        it ("should take you to the login page", async () => {
+            await driver.get(`${server.host}/`);
+            await waitForUrl(driver, `${server.host}/auth/login?redirect=%2F`);
+            expect(await driver.isElementPresent(By.css("[name=email]"))).toEqual(true);
+        });
+
+        it ("should log you in", async () => {
+            await driver.get(`${server.host}/`);
+            await loginMetabase(driver, "bob@metabase.com", "12341234");
+            await waitForUrl(driver, `${server.host}/`);
+        });
+
+        it ("should redirect you after logging in", async () => {
+            await driver.get(`${server.host}/questions`);
+            await waitForUrl(driver, `${server.host}/auth/login?redirect=%2Fquestions`);
+            await loginMetabase(driver, "bob@metabase.com", "12341234");
+            await waitForUrl(driver, `${server.host}/questions`);
+        });
     });
 
-    it("should take you to the login page", async () => {
-        driver.wait(until.elementLocated(By.css("[name=email]")));
-        expect(await driver.isElementPresent(By.css("[name=email]"))).toEqual(true);
+    describe("valid session cookie", () => {
+        beforeEach(async () => {
+            await driver.get(`${server.host}/`);
+            await driver.manage().addCookie("metabase.SESSION_ID", "d65a297d-860b-46b6-a2dd-8f98d37fb2cd");
+        });
+
+        it ("is logged in", async () => {
+            await driver.get(`${server.host}/`);
+            await waitForUrl(driver, `${server.host}/`);
+        });
     });
 
     afterAll(async () => {
-        driver.quit();
-        await stopServer("metabase");
+        await server.stop();
+        await driver.quit();
     });
 });
diff --git a/frontend/test/e2e/support/fixtures/setup.db.h2.db b/frontend/test/e2e/support/fixtures/setup.db.h2.db
new file mode 100644
index 0000000000000000000000000000000000000000..6cda36762c740ce12cbc2047d0fd266b1c99ba19
GIT binary patch
literal 933888
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
Ct*z+*

literal 0
HcmV?d00001

diff --git a/frontend/test/e2e/support/start-server.js b/frontend/test/e2e/support/start-server.js
index 8a29e2c71d4..ad91bf30984 100644
--- a/frontend/test/e2e/support/start-server.js
+++ b/frontend/test/e2e/support/start-server.js
@@ -1,43 +1,82 @@
+import fs from "fs-promise";
+import os from "os";
+import path from "path";
 import { spawn } from "child_process";
+
 import fetch from 'isomorphic-fetch';
 import { delay } from '../../../src/metabase/lib/promise';
 
+let testDbId = 0;
+const getDbFile = () => path.join(os.tmpdir(), `metabase-test-${process.pid}-${testDbId++}.db`);
+
 let port = 4000;
 const getPort = () => port++;
 
 const servers = new Map();
 
-export async function startServer(dbFile) {
-    if (!servers.has(dbFile)) {
-        const port = getPort();
-        let server = {
-            dbFile: dbFile,
-            port: port,
-            host: `http://localhost:${port}`,
-            process: spawn("java", ["-jar", "target/uberjar/metabase.jar"], {
+class Server {
+    constructor(dbKey, dbFile) {
+        this.dbKey = dbKey;
+        this.dbFile = dbFile;
+
+        this.port = getPort();
+        this.host = `http://localhost:${this.port}`;
+    }
+
+    async start() {
+        if (!this.process) {
+            if (this.dbKey !== this.dbFile) {
+                await fs.copy(`${this.dbKey}.h2.db`, `${this.dbFile}.h2.db`);
+            }
+            this.count = 0;
+            this.process = spawn("java", ["-jar", "target/uberjar/metabase.jar"], {
                 env: {
-                    MB_DB_FILE: dbFile,
-                    MB_JETTY_PORT: port
+                    MB_DB_FILE: this.dbFile,
+                    MB_JETTY_PORT: this.port
                 },
-            }),
-            count: 0
+            })
+            this.process.on("close", () => {
+                this.kill();
+            })
+        }
+        this.count++;
+        return this.wait();
+    }
+
+    async stop() {
+        if (--this.count === 0) {
+            await this.kill();
+        }
+    }
+
+    async wait() {
+        while (!(await isReady(this.host))) {
+            await delay(500);
+        }
+    }
+
+    async kill() {
+        if (servers.has(this.dbKey)) {
+            servers.delete(this.dbKey);
+            this.process.kill('SIGKILL');
+            await fs.unlink(`${this.dbFile}.h2.db`);
         }
-        server.process.on("close", () => {
-            killServer(server);
-        })
-        servers.set(dbFile, server);
     }
-    const server = servers.get(dbFile);
-    server.count++;
-    await wait(server);
-    return server.host;
 }
 
-export async function stopServer(dbFile) {
-    const server = servers.get(dbFile);
-    if (--server.count === 0) {
-        killServer(server);
+export async function startServer(dbKey) {
+    let dbFile = getDbFile();
+    if (!dbKey) {
+        dbKey = dbFile;
     }
+
+    if (!servers.has(dbKey)) {
+        servers.set(dbKey, new Server(dbKey, dbFile));
+    }
+    let server = servers.get(dbKey);
+
+    await server.start();
+    return server;
 }
 
 export async function isReady(host) {
@@ -51,20 +90,8 @@ export async function isReady(host) {
     return false;
 }
 
-async function wait(server) {
-    while (!(await isReady(server.host))) {
-        await delay(500);
-    }
-}
-
-function killServer(server) {
-    console.log("shutting down " + server.dbFile);
-    servers.delete(server.dbFile);
-    server.process.kill();
-}
-
 process.once("exit", () => {
     for (const server of servers) {
-        killServer(server);
+        server.kill();
     }
 });
diff --git a/package.json b/package.json
index 6aa5a0c64e9..b9ea6ee1607 100644
--- a/package.json
+++ b/package.json
@@ -87,6 +87,7 @@
     "file-loader": "^0.8.5",
     "flow-bin": "^0.24.2",
     "flow-status-webpack-plugin": "^0.1.4",
+    "fs-promise": "^0.5.0",
     "glob": "^5.0.15",
     "html-webpack-plugin": "^2.14.0",
     "istanbul-instrumenter-loader": "^0.2.0",
-- 
GitLab