From 9168d3c802ff7ae0512aaed2e8aad9939c7b02f8 Mon Sep 17 00:00:00 2001 From: Cache Hamm Date: Sat, 29 Apr 2017 19:43:17 -0600 Subject: [PATCH 1/2] saucelabs rough draft --- .gitignore | 4 +++- .travis.yml | 5 +++- package.json | 16 ++++++++++--- test/browser/index.html | 19 +++++++++++++++ test/browser/index.js | 44 ++++++++++++++++++++++++++++++++++ test/browser/webpack.config.js | 15 ++++++++++++ test/browser/webserver.js | 34 ++++++++++++++++++++++++++ 7 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 test/browser/index.html create mode 100644 test/browser/index.js create mode 100644 test/browser/webpack.config.js create mode 100644 test/browser/webserver.js diff --git a/.gitignore b/.gitignore index c490e2a8..e63efda0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /node_modules npm-debug.log -.vscode \ No newline at end of file +.vscode +.DS_Store +/test/browser/build \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 592e9c92..3a3a575e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: node_js node_js: - - 4.2 + - 6 script: - npm test + - npm run test:browser +addons: + sauce_connect: true \ No newline at end of file diff --git a/package.json b/package.json index 9df50a5e..624ff893 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ "lint": "standard --verbose | snazzy || true", "lint:fix": "standard --fix", "prepublish": "npm run compile", + "test:browser": "npm run test:browser:setup && npm run test:browser:run", + "test:browser:setup": "webpack --config ./test/browser/webpack.config.js", + "test:browser:run": "node ./test/browser/index", "compile": "babel --stage 1 -d dist/ src/ && regenerator --no-cache-dir --include-runtime src/generator-runtime.js > dist/generator-runtime.js" }, "repository": { @@ -17,12 +20,16 @@ "keywords": [ "rules", "engine", - "rules engine" + "rules engine", + "rules processor", + "business-rules", + "json" ], "standard": { "parser": "babel-eslint", "ignore": [ - "/dist" + "/dist", + "/test/browser/build" ], "globals": [ "context", @@ -57,12 +64,15 @@ "chai-as-promised": "^6.0.0", "colors": "~1.1.2", "dirty-chai": "1.2.2", + "glob": "7.1.1", "mocha": "^3.2.0", "regenerator": "~0.9.7", + "selenium-webdriver": "3.4.0", "sinon": "^2.1.0", "sinon-chai": "^2.8.0", "snazzy": "^7.0.0", - "standard": "^10.0.1" + "standard": "^10.0.1", + "webpack": "2.4.1" }, "dependencies": { "debug": "~2.6.3", diff --git a/test/browser/index.html b/test/browser/index.html new file mode 100644 index 00000000..05fba94c --- /dev/null +++ b/test/browser/index.html @@ -0,0 +1,19 @@ + + + + json-rules-engine + + + +
+ + + + + + + + \ No newline at end of file diff --git a/test/browser/index.js b/test/browser/index.js new file mode 100644 index 00000000..e249ada1 --- /dev/null +++ b/test/browser/index.js @@ -0,0 +1,44 @@ +'use strict' + +let webdriver = require('selenium-webdriver') +let webserver = require('./webserver') +let username = process.env.SAUCE_USERNAME +let accessKey = process.env.SAUCE_ACCESS_KEY +let driver + +if (!username) throw new Error('Saucelabs username required') +if (!accessKey) throw new Error('Saucelabs access key required') + +driver = new webdriver.Builder() + .withCapabilities({ + 'browserName': 'chrome', + 'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER, + 'version': 'latest', + 'username': username, + 'accessKey': accessKey + }) + .usingServer(`http://${username}:${accessKey}@ondemand.saucelabs.com:80/wd/hub`) + .build() + +let server = webserver.start() +server.listen(parseInt(webserver.port), () => { + console.info(`web server listening on ${webserver.port}`) + driver.get(`http://localhost:${webserver.port}/index.html`) + + driver.getTitle().then(function (title) { + console.log('title is: ' + title) + }) + + let passCount = driver.findElement(webdriver.By.css('.passes > em')).innerHTML + let failCount = driver.findElement(webdriver.By.css('.failures > em')).innerHTML + + console.log(`${passCount} tests passed; ${failCount} tests failed.`) + + driver.quit() + server.close() + + if (Number(passCount) > 0 && Number(failCount) === 0) { + return process.exit(0) + } + process.exit(1) +}) diff --git a/test/browser/webpack.config.js b/test/browser/webpack.config.js new file mode 100644 index 00000000..2503df48 --- /dev/null +++ b/test/browser/webpack.config.js @@ -0,0 +1,15 @@ +const path = require('path') +const glob = require('glob') + +const config = { + entry: { + test: glob.sync('./test/*.test.js'), + bootstrap: './test/support/bootstrap' + }, + output: { + path: path.resolve(__dirname, 'build'), + filename: '[name].bundle.js' + } +} + +module.exports = config diff --git a/test/browser/webserver.js b/test/browser/webserver.js new file mode 100644 index 00000000..e973204d --- /dev/null +++ b/test/browser/webserver.js @@ -0,0 +1,34 @@ +'use strict' + +let http = require('http') +let url = require('url') +let fs = require('fs') +let path = require('path') +let port = process.env.HTTP_PORT || 3000 +const mimeTypes = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css' +} + +exports.port = port + +exports.start = () => { + return http.createServer((req, res) => { + let parsedUrl = url.parse(req.url) + let pathname = path.join(__dirname, `${parsedUrl.pathname}`) + console.log(`${req.method}::${req.url}::${pathname}`) + fs.readFile(pathname, (err, data) => { + if (err) { + res.statusCode = 500 + res.end(`Error getting the file: ${err}.`) + } else { + // based on the URL path, extract the file extention. e.g. .js, .doc, ... + const ext = path.parse(pathname).ext + // if the file is found, set Content-type and send data + res.setHeader('Content-type', mimeTypes[ext] || 'text/plain') + res.end(data) + } + }) + }) +} From f14b35a03691c9b6210cce3415ccfbecd4a52d32 Mon Sep 17 00:00:00 2001 From: Cache Hamm Date: Sun, 7 May 2017 10:36:38 -0600 Subject: [PATCH 2/2] add selenium logging --- test/browser/index.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/test/browser/index.js b/test/browser/index.js index e249ada1..2be12f2f 100644 --- a/test/browser/index.js +++ b/test/browser/index.js @@ -29,16 +29,18 @@ server.listen(parseInt(webserver.port), () => { console.log('title is: ' + title) }) - let passCount = driver.findElement(webdriver.By.css('.passes > em')).innerHTML - let failCount = driver.findElement(webdriver.By.css('.failures > em')).innerHTML - - console.log(`${passCount} tests passed; ${failCount} tests failed.`) - - driver.quit() - server.close() - - if (Number(passCount) > 0 && Number(failCount) === 0) { - return process.exit(0) - } - process.exit(1) + Promise.all([ + driver.findElement(webdriver.By.css('.passes > em')).getText(), + driver.findElement(webdriver.By.css('.failures > em')).getText() + ]).then(texts => { + let passCount = texts[0] + let failCount = texts[1] + console.log(`${passCount} tests passed; ${failCount} tests failed.`) + driver.quit() + server.close() + if (Number(passCount) > 0 && Number(failCount) === 0) { + return process.exit(0) + } + process.exit(1) + }) })