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