From 191c02af1ebfc7e6c53dc88d97c4e3ca23fbea8b Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Wed, 26 Oct 2016 16:46:32 +0200 Subject: Basic skeleton --- test/e2e/custom-assertions/elementCount.js | 26 +++++++++++ test/e2e/nightwatch.conf.js | 46 ++++++++++++++++++ test/e2e/runner.js | 31 ++++++++++++ test/e2e/specs/test.js | 19 ++++++++ test/unit/.eslintrc | 9 ++++ test/unit/index.js | 13 ++++++ test/unit/karma.conf.js | 75 ++++++++++++++++++++++++++++++ test/unit/specs/Hello.spec.js | 13 ++++++ 8 files changed, 232 insertions(+) create mode 100644 test/e2e/custom-assertions/elementCount.js create mode 100644 test/e2e/nightwatch.conf.js create mode 100644 test/e2e/runner.js create mode 100644 test/e2e/specs/test.js create mode 100644 test/unit/.eslintrc create mode 100644 test/unit/index.js create mode 100644 test/unit/karma.conf.js create mode 100644 test/unit/specs/Hello.spec.js (limited to 'test') diff --git a/test/e2e/custom-assertions/elementCount.js b/test/e2e/custom-assertions/elementCount.js new file mode 100644 index 00000000..c0d5fe00 --- /dev/null +++ b/test/e2e/custom-assertions/elementCount.js @@ -0,0 +1,26 @@ +// A custom Nightwatch assertion. +// the name of the method is the filename. +// can be used in tests like this: +// +// browser.assert.elementCount(selector, count) +// +// for how to write custom assertions see +// http://nightwatchjs.org/guide#writing-custom-assertions +exports.assertion = function (selector, count) { + this.message = 'Testing if element <' + selector + '> has count: ' + count + this.expected = count + this.pass = function (val) { + return val === this.expected + } + this.value = function (res) { + return res.value + } + this.command = function (cb) { + var self = this + return this.api.execute(function (selector) { + return document.querySelectorAll(selector).length + }, [selector], function (res) { + cb.call(self, res) + }) + } +} diff --git a/test/e2e/nightwatch.conf.js b/test/e2e/nightwatch.conf.js new file mode 100644 index 00000000..a5e55e90 --- /dev/null +++ b/test/e2e/nightwatch.conf.js @@ -0,0 +1,46 @@ +require('babel-register') +var config = require('../../config') + +// http://nightwatchjs.org/guide#settings-file +module.exports = { + "src_folders": ["test/e2e/specs"], + "output_folder": "test/e2e/reports", + "custom_assertions_path": ["test/e2e/custom-assertions"], + + "selenium": { + "start_process": true, + "server_path": "node_modules/selenium-server/lib/runner/selenium-server-standalone-2.53.1.jar", + "host": "127.0.0.1", + "port": 4444, + "cli_args": { + "webdriver.chrome.driver": require('chromedriver').path + } + }, + + "test_settings": { + "default": { + "selenium_port": 4444, + "selenium_host": "localhost", + "silent": true, + "globals": { + "devServerURL": "http://localhost:" + (process.env.PORT || config.dev.port) + } + }, + + "chrome": { + "desiredCapabilities": { + "browserName": "chrome", + "javascriptEnabled": true, + "acceptSslCerts": true + } + }, + + "firefox": { + "desiredCapabilities": { + "browserName": "firefox", + "javascriptEnabled": true, + "acceptSslCerts": true + } + } + } +} diff --git a/test/e2e/runner.js b/test/e2e/runner.js new file mode 100644 index 00000000..2a5c6ef9 --- /dev/null +++ b/test/e2e/runner.js @@ -0,0 +1,31 @@ +// 1. start the dev server using production config +process.env.NODE_ENV = 'testing' +var server = require('../../build/dev-server.js') + +// 2. run the nightwatch test suite against it +// to run in additional browsers: +// 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" +// 2. add it to the --env flag below +// or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` +// For more information on Nightwatch's config file, see +// http://nightwatchjs.org/guide#settings-file +var opts = process.argv.slice(2) +if (opts.indexOf('--config') === -1) { + opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) +} +if (opts.indexOf('--env') === -1) { + opts = opts.concat(['--env', 'chrome']) +} + +var spawn = require('cross-spawn') +var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) + +runner.on('exit', function (code) { + server.close() + process.exit(code) +}) + +runner.on('error', function (err) { + server.close() + throw err +}) diff --git a/test/e2e/specs/test.js b/test/e2e/specs/test.js new file mode 100644 index 00000000..a7b1bd92 --- /dev/null +++ b/test/e2e/specs/test.js @@ -0,0 +1,19 @@ +// For authoring Nightwatch tests, see +// http://nightwatchjs.org/guide#usage + +module.exports = { + 'default e2e tests': function (browser) { + // automatically uses dev Server port from /config.index.js + // default: http://localhost:8080 + // see nightwatch.conf.js + const devServer = browser.globals.devServerURL + + browser + .url(devServer) + .waitForElementVisible('#app', 5000) + .assert.elementPresent('.hello') + .assert.containsText('h1', 'Welcome to Your Vue.js App') + .assert.elementCount('img', 1) + .end() + } +} diff --git a/test/unit/.eslintrc b/test/unit/.eslintrc new file mode 100644 index 00000000..959a4f4b --- /dev/null +++ b/test/unit/.eslintrc @@ -0,0 +1,9 @@ +{ + "env": { + "mocha": true + }, + "globals": { + "expect": true, + "sinon": true + } +} diff --git a/test/unit/index.js b/test/unit/index.js new file mode 100644 index 00000000..03b19e32 --- /dev/null +++ b/test/unit/index.js @@ -0,0 +1,13 @@ +// Polyfill fn.bind() for PhantomJS +/* eslint-disable no-extend-native */ +Function.prototype.bind = require('function-bind') + +// require all test files (files that ends with .spec.js) +const testsContext = require.context('./specs', true, /\.spec$/) +testsContext.keys().forEach(testsContext) + +// require all src files except main.js for coverage. +// you can also change this to match only the subset of files that +// you want coverage for. +const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) +srcContext.keys().forEach(srcContext) diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js new file mode 100644 index 00000000..048b7290 --- /dev/null +++ b/test/unit/karma.conf.js @@ -0,0 +1,75 @@ +// This is a karma config file. For more details see +// http://karma-runner.github.io/0.13/config/configuration-file.html +// we are also using it with karma-webpack +// https://github.com/webpack/karma-webpack + +var path = require('path') +var merge = require('webpack-merge') +var baseConfig = require('../../build/webpack.base.conf') +var utils = require('../../build/utils') +var webpack = require('webpack') +var projectRoot = path.resolve(__dirname, '../../') + +var webpackConfig = merge(baseConfig, { + // use inline sourcemap for karma-sourcemap-loader + module: { + loaders: utils.styleLoaders() + }, + devtool: '#inline-source-map', + vue: { + loaders: { + js: 'isparta' + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../../config/test.env') + }) + ] +}) + +// no need for app entry during tests +delete webpackConfig.entry + +// make sure isparta loader is applied before eslint +webpackConfig.module.preLoaders = webpackConfig.module.preLoaders || [] +webpackConfig.module.preLoaders.unshift({ + test: /\.js$/, + loader: 'isparta', + include: path.resolve(projectRoot, 'src') +}) + +// only apply babel for test files when using isparta +webpackConfig.module.loaders.some(function (loader, i) { + if (loader.loader === 'babel') { + loader.include = path.resolve(projectRoot, 'test/unit') + return true + } +}) + +module.exports = function (config) { + config.set({ + // to run in additional browsers: + // 1. install corresponding karma launcher + // http://karma-runner.github.io/0.13/config/browsers.html + // 2. add it to the `browsers` array below. + browsers: ['PhantomJS'], + frameworks: ['mocha', 'sinon-chai'], + reporters: ['spec', 'coverage'], + files: ['./index.js'], + preprocessors: { + './index.js': ['webpack', 'sourcemap'] + }, + webpack: webpackConfig, + webpackMiddleware: { + noInfo: true + }, + coverageReporter: { + dir: './coverage', + reporters: [ + { type: 'lcov', subdir: '.' }, + { type: 'text-summary' } + ] + } + }) +} diff --git a/test/unit/specs/Hello.spec.js b/test/unit/specs/Hello.spec.js new file mode 100644 index 00000000..a6965db0 --- /dev/null +++ b/test/unit/specs/Hello.spec.js @@ -0,0 +1,13 @@ +import Vue from 'vue' +import Hello from 'src/components/Hello' + +describe('Hello.vue', () => { + it('should render correct contents', () => { + const vm = new Vue({ + el: document.createElement('div'), + render: (h) => h(Hello) + }) + expect(vm.$el.querySelector('.hello h1').textContent) + .to.equal('Welcome to Your Vue.js App') + }) +}) -- cgit v1.2.3-70-g09d2