From 888660ac20b21a9d8e2f57d13da307498db23ee2 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 5 Oct 2018 09:19:54 +0200 Subject: [PATCH] Fix #475: get rid of in-browser tests --- .travis.yml | 4 -- README.md | 22 -------- package.json | 15 +++--- test-browser/.eslintrc | 5 -- test-browser/auth_test.js | 48 ----------------- test-browser/bucket_test.js | 78 --------------------------- test-browser/collection_test.js | 78 --------------------------- test-browser/kinto.ini | 22 -------- test-browser/utils.js | 95 --------------------------------- 9 files changed, 6 insertions(+), 361 deletions(-) delete mode 100644 test-browser/.eslintrc delete mode 100644 test-browser/auth_test.js delete mode 100644 test-browser/bucket_test.js delete mode 100644 test-browser/collection_test.js delete mode 100644 test-browser/kinto.ini delete mode 100644 test-browser/utils.js diff --git a/.travis.yml b/.travis.yml index 0cb951932..ec92e4458 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,4 @@ env: - ACTION="build:lib" - ACTION="test-all:ci" - ACTION="cs-check" - - ACTION="test-browser" -matrix: - allow_failures: - - env: ACTION="test-browser" script: npm run $ACTION diff --git a/README.md b/README.md index 2ca13530e..d0b14f838 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ Kinto-based systems. - [Hacking on kinto-admin](#hacking-on-kinto-admin) - [Development server](#development-server) - [Tests](#tests) - - [Browser tests](#browser-tests) - [FAQ](#faq) - [Browser support](#browser-support) - [How to display a nested field value using the collection displayFields property?](#how-to-display-a-nested-field-value-using-the-collection-displayfields-property) @@ -187,27 +186,6 @@ $ npm run test-all long time and may result in intermittent failures on Travis (see [#146](https://github.com/Kinto/kinto-admin/pull/146)). -## Browser tests - -The browser test suite uses [NightmareJS](http://www.nightmarejs.org/) and -[Electron](http://electron.atom.io/). To run browser tests: - -``` -$ npm run dist -$ npm run test-browser -``` - -To show the browser interactions while running them, set the `NIGHTMARE_SHOW` env var: - -``` -$ NIGHTMARE_SHOW=1 npm run test-browser -``` - -There's also a TDD mode: - -``` -$ npm run tdd-browser -``` ## FAQ diff --git a/package.json b/package.json index a1fdc9a72..6eec964da 100644 --- a/package.json +++ b/package.json @@ -6,18 +6,16 @@ "build": "rimraf build && NODE_ENV=production node_modules/.bin/webpack --progress --config webpack.prod.js && cp html/prod.html build/index.html", "build:lib": "rimraf lib && NODE_ENV=production babel -d lib/ src/", "build:readme": "toctoc README.md -w", - "cs-check": "prettier -l '{src,test,test-browser}/**/*.js'", - "cs-format": "prettier '{src,test,test-browser}/**/*.js' --write", + "cs-check": "prettier -l '{src,test}/**/*.js'", + "cs-format": "prettier '{src,test}/**/*.js' --write", "flow-check": "node_modules/.bin/flow check", - "lint": "node_modules/.bin/eslint src test test-browser", + "lint": "node_modules/.bin/eslint src test", "publish-to-gh-pages": "npm run build && gh-pages --add --dist build/", "publish-to-npm": "npm run build:lib && npm publish", "start": "NODE_ENV=development node server/dev.js", "tdd": "npm run test -- --watch --bail", - "tdd-browser": "npm run test-browser --watch", - "test": "NODE_ENV=test node_modules/.bin/jest --setupTestFrameworkScriptFile=`pwd`/test/setup-jsdom.js --testRegex '.*_test.js' --testPathIgnorePatterns 'test-browser/'", + "test": "NODE_ENV=test node_modules/.bin/jest --setupTestFrameworkScriptFile=`pwd`/test/setup-jsdom.js --testRegex '.*_test.js'", "test:ci": "npm run test -- --maxWorkers=4", - "test-browser": "NODE_ENV=test node_modules/.bin/babel-node node_modules/.bin/_mocha --recursive test-browser/ --testPathIgnorePatterns 'test/'", "test-all": "npm run lint && npm run flow-check && npm run test", "test-all:ci": "npm run lint && npm install flow-typed && flow-typed install && npm run flow-check && npm run test:ci" }, @@ -68,6 +66,7 @@ "@babel/plugin-transform-flow-strip-types": "^7.0.0", "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", + "@babel/preset-flow": "^7.0.0", "@babel/preset-react": "^7.0.0", "babel-core": "^7.0.0-bridge.0", "babel-eslint": "^10.0.0", @@ -89,7 +88,6 @@ "kinto-node-test-server": "^1.0.2", "mocha": "^5.0.2", "mocha-generators": "^2.0.0", - "nightmare": "^3.0.0", "prettier": "^1.14.2", "react-test-renderer": "^16.5.1", "redbox-react": "^1.2.6", @@ -100,8 +98,7 @@ "webpack": "^4.16.2", "webpack-cli": "^3.1.0", "webpack-dev-middleware": "^3.0.0", - "webpack-hot-middleware": "^2.22.3", - "@babel/preset-flow": "^7.0.0" + "webpack-hot-middleware": "^2.22.3" }, "repository": { "type": "git", diff --git a/test-browser/.eslintrc b/test-browser/.eslintrc deleted file mode 100644 index 7eeefc33b..000000000 --- a/test-browser/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "env": { - "mocha": true - } -} diff --git a/test-browser/auth_test.js b/test-browser/auth_test.js deleted file mode 100644 index 217c87ef7..000000000 --- a/test-browser/auth_test.js +++ /dev/null @@ -1,48 +0,0 @@ -import { install as installGeneratorSupport } from "mocha-generators"; -import { expect } from "chai"; - -import { - startServers, - stopServers, - createBrowser, - authenticate, -} from "./utils"; - -installGeneratorSupport(); - -describe("Auth tests", function() { - this.timeout(60000); - - let browser; - - beforeEach(function*() { - browser = createBrowser(); - yield startServers(); - }); - - afterEach(function*() { - yield browser.end(); - yield stopServers(); - }); - - it("should authenticate a user", function*() { - const result = yield authenticate(browser, "__user__", "__pass__") - .evaluate(() => { - return document.querySelector(".session-info-bar strong").textContent; - }) - .end(); - - expect(result).eql("__user__"); - }); - - it("should log a user out", function*() { - const result = yield authenticate(browser, "__user__", "__pass__") - .click(".session-info-bar .btn-logout") - .wait(".notification.alert-success") - .evaluate(() => { - return document.querySelector(".session-info-bar"); - }); - - expect(result).to.be.null; - }); -}); diff --git a/test-browser/bucket_test.js b/test-browser/bucket_test.js deleted file mode 100644 index af9845655..000000000 --- a/test-browser/bucket_test.js +++ /dev/null @@ -1,78 +0,0 @@ -import { install as installGeneratorSupport } from "mocha-generators"; -import { expect } from "chai"; - -import { - startServers, - stopServers, - createBrowser, - createClient, - authenticate, - createBucket, -} from "./utils"; - -installGeneratorSupport(); - -describe("Bucket tests", function() { - this.timeout(60000); - - let browser, client; - - beforeEach(function*() { - client = createClient("__test__", "__pass__"); - browser = createBrowser(); - yield startServers(); - yield authenticate(browser, "__test__", "__pass__"); - }); - - afterEach(function*() { - yield browser.end(); - yield stopServers(); - }); - - it("should create a bucket", function*() { - const result = yield createBucket(browser, "MyBucket") - .evaluate(() => { - return document.querySelector(".bucket-menu .panel-heading strong") - .textContent; - }) - .end(); - expect(result).eql("MyBucket"); - - const { data } = yield client.listBuckets(); - expect(data).to.have.a.lengthOf(1); - expect(data[0].id).eql("MyBucket"); - }); - - it("should edit a bucket", function*() { - const result = yield createBucket(browser, "MyBucket") - .click("[href='#/buckets/MyBucket/attributes']") - .wait(".rjsf") - .evaluate(() => { - return document.querySelector(".rjsf input[type=submit]").value; - }) - .end(); - - expect(result).eql("Update bucket"); - }); - - it("should delete a bucket", function*() { - const result = yield createBucket(browser, "MyBucket") - .evaluate(() => { - // Force accepting confirmation prompt - window.confirm = () => true; - }) - .click("[href='#/buckets/MyBucket/attributes']") - .wait(".panel-danger") - .type(".panel-danger #root", "MyBucket") - .click(".panel-danger button[type=submit]") - .wait(".notification.alert-success") - .evaluate(() => { - return document.querySelectorAll(".bucket-menu").length; - }) - .end(); - expect(result).eql(0); - - const { data } = yield client.listBuckets(); - expect(data).to.have.a.lengthOf(0); - }); -}); diff --git a/test-browser/collection_test.js b/test-browser/collection_test.js deleted file mode 100644 index 6b559bd55..000000000 --- a/test-browser/collection_test.js +++ /dev/null @@ -1,78 +0,0 @@ -import { install as installGeneratorSupport } from "mocha-generators"; -import { expect } from "chai"; - -import { - startServers, - stopServers, - createBrowser, - createClient, - authenticate, - createCollection, -} from "./utils"; - -installGeneratorSupport(); - -describe("Collection tests", function() { - this.timeout(60000); - - let browser, client; - - beforeEach(function*() { - browser = createBrowser(); - yield startServers(); - yield authenticate(browser, "__test__", "__pass__"); - client = createClient("__test__", "__pass__"); - }); - - afterEach(function*() { - yield browser.end(); - yield stopServers(); - }); - - it("should create a collection", function*() { - const result = yield createCollection(browser, "MyBucket", "MyCollection") - .wait(".collections-menu-entry") - .evaluate(() => { - return document.querySelector(".collections-menu-entry").textContent; - }) - .end(); - expect(result).eql("MyCollection"); - - const { data } = yield client.bucket("MyBucket").listCollections(); - expect(data).to.have.a.lengthOf(1); - expect(data[0].id).eql("MyCollection"); - }); - - it("should update a collection", function*() { - const result = yield createCollection(browser, "MyBucket", "MyCollection") - .click("[href='#/buckets/MyBucket/collections/MyCollection/attributes']") - .wait(".rjsf") - .evaluate(() => { - return document.querySelector(".rjsf input[type=submit]").value; - }) - .end(); - - expect(result).eql("Update collection"); - }); - - it("should delete a collection", function*() { - const result = yield createCollection(browser, "MyBucket", "MyCollection") - .evaluate(() => { - // Force accepting confirmation prompt - window.confirm = () => true; - }) - .click("[href='#/buckets/MyBucket/collections/MyCollection/attributes']") - .wait(".rjsf") - .type(".panel-danger #root", "MyCollection") - .click(".panel-danger button[type=submit]") - .wait(".notification.alert-success") - .evaluate(() => { - return document.querySelectorAll(".collections-menu-entry").length; - }) - .end(); - expect(result).eql(0); - - const { data } = yield client.bucket("MyBucket").listCollections(); - expect(data).to.have.a.lengthOf(0); - }); -}); diff --git a/test-browser/kinto.ini b/test-browser/kinto.ini deleted file mode 100644 index b61259056..000000000 --- a/test-browser/kinto.ini +++ /dev/null @@ -1,22 +0,0 @@ -[app:main] -use = egg:kinto - -# Required by integration tests -kinto.flush_endpoint_enabled = true - -# Required by basic auth -kinto.userid_hmac_secret = a-secret-string - -# Add standard plugins -kinto.includes = kinto.plugins.default_bucket - kinto_attachment - kinto.plugins.history - -# Attachments configuration -kinto.attachment.base_path = /tmp -kinto.attachment.base_url = "/attachments/" - -[server:main] -use = egg:waitress#main -host = 0.0.0.0 -port = 8888 diff --git a/test-browser/utils.js b/test-browser/utils.js deleted file mode 100644 index 48dd201a6..000000000 --- a/test-browser/utils.js +++ /dev/null @@ -1,95 +0,0 @@ -import Nightmare from "nightmare"; -import KintoServer from "kinto-node-test-server"; -import KintoClient from "kinto-http"; -import btoa from "btoa"; - -import staticServer from "../server/test"; - -const KINTO_SERVER = "http://0.0.0.0:8888/v1"; -const NIGHTMARE_SHOW = !!process.env.NIGHTMARE_SHOW; - -let kintoServer; - -function delay(ms) { - return new Promise(r => setTimeout(r, ms)); -} - -export function startServers() { - kintoServer = new KintoServer("http://0.0.0.0:8888/v1", { - pservePath: ".venv/bin/pserve", - }); - return Promise.all([kintoServer.start(), staticServer.start()]).then( - delay(200) - ); -} - -export function stopServers() { - for (const line of kintoServer.logs) { - console.log(line.toString()); - } - return Promise.all([kintoServer.killAll(), staticServer.stop()]).then( - delay(200) - ); -} - -export function createBrowser(options = {}) { - options = { - show: NIGHTMARE_SHOW, - persistent: false, - ...options, - }; - return Nightmare({ - waitTimeout: 60000, - show: options.show, - openDevTools: true, - width: 1600, - height: 1024, - center: true, - alwaysOnTop: false, - skipTaskbar: true, - webPreferences: options.persistent ? {} : { partition: "nopersist" }, - }); -} - -export function createClient(username, password) { - return new KintoClient("http://0.0.0.0:8888/v1", { - headers: { - Authorization: "Basic " + btoa(`${username}:${password}`), - }, - }); -} - -export function authenticate(browser, username, password) { - return browser - .goto("http://localhost:3000/") - .wait(".rjsf") - .type("#root_server", "") - .type("#root_server", KINTO_SERVER) - .type("#root_credentials_username", "") - .type("#root_credentials_username", username) - .type("#root_credentials_password", "") - .type("#root_credentials_password", password) - .click(".rjsf button[type=submit]") - .wait(".session-info-bar"); -} - -export function createBucket(browser, bucket) { - return browser - .wait("[href='#/buckets/create']") - .click("[href='#/buckets/create']") - .wait(".rjsf") - .type("#root_id", bucket) - .click(".rjsf [type=submit]") - .wait(".notification.alert-success") - .wait(`[href='#/buckets/${bucket}/attributes']`); -} - -export function createCollection(browser, bucket, collection) { - return createBucket(browser, bucket) - .click(`[href='#/buckets/${bucket}/collections/create']`) - .wait(".rjsf") - .type("#root_id", collection) - .click(".rjsf [type=submit]") - .wait(".notification.alert-success") - .wait(`[href='#/buckets/${bucket}/collections/${collection}/attributes']`); -}