diff --git a/package.json b/package.json index 1bef320..86ca075 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "example": "example" }, "scripts": { - "test": "mocha", + "test-travis": "./node_modules/karma/bin/karma start ./test/karma.conf.js --single-run", + "test": "./node_modules/karma/bin/karma start ./test/karma.conf.js --no-single-run", "build": "gulp" }, "repository": { @@ -25,22 +26,33 @@ }, "homepage": "https://github.com/keegan-lillo/pebble-clay#readme", "devDependencies": { - "deamdify": "^0.1.1", + "browserify-istanbul": "^0.2.1", + "chai": "^3.4.1", + "deamdify": "^0.2.0", "eslint": "^1.5.1", "eslint-config-pebble": "^1.2.0", "eslint-plugin-standard": "^1.3.1", "gulp-autoprefixer": "^3.1.0", "gulp-sass": "^2.1.1", - "gulp-sourcemaps": "^1.6.0" + "gulp-sourcemaps": "^1.6.0", + "karma": "^0.13.19", + "karma-browserify": "^5.0.1", + "karma-chrome-launcher": "^0.2.2", + "karma-coverage": "^0.5.3", + "karma-mocha": "^0.2.1", + "karma-mocha-reporter": "^1.1.5", + "karma-source-map-support": "^1.1.0", + "mocha": "^2.3.4", + "watchify": "^3.7.0" }, "dependencies": { - "browserify": "^11.2.0", + "browserify": "^13.0.0", "del": "^2.0.2", "gulp": "^3.9.0", "gulp-inline": "0.0.15", "gulp-minify-html": "^1.0.4", "gulp-minify-inline": "^0.1.1", - "stringify": "^3.1.0", + "stringify": "^3.2.0", "vinyl-source-stream": "^1.1.0" } } diff --git a/test/fixture.js b/test/fixture.js new file mode 100644 index 0000000..17cbe9a --- /dev/null +++ b/test/fixture.js @@ -0,0 +1,19 @@ +'use strict'; + +var idCounter = 0; + +function fixture(type, config) { + + var basic = { + type: type, + label: type + '-label', + appKey: 'appKey-' + idCounter, + id: 'id-' + idCounter + }; + + idCounter ++; + + return Object.assign({}, basic, config); +} + +module.exports = fixture; diff --git a/test/karma.conf.js b/test/karma.conf.js new file mode 100644 index 0000000..e4732ff --- /dev/null +++ b/test/karma.conf.js @@ -0,0 +1,86 @@ +'use strict'; + +// Karma configuration + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '..', + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['browserify', 'source-map-support', 'mocha'], + + browserify: { + debug: true, + transform: [ + [ + 'stringify', + { extensions: ['.html', '.tpl'] } + ], + 'deamdify', + [ + 'browserify-istanbul', + { ignore: ['**/test/**', '**/src/scripts/vendor/**'] } + ] + ] + }, + + // list of files / patterns to load in the browser + files: [ + 'test/spec/**/*.js' + ], + + // list of files to exclude + exclude: [], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + 'test/spec/**/*.js': ['browserify'], + 'src/*.js': ['coverage'] + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress', 'mocha', 'coverage'], + + // optionally, configure the reporter + coverageReporter: { + dir: 'coverage/', + reporters: [ + {type: 'text-summary'}, + {type: 'html', subdir: '.'} + ] + }, + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || + // config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: true, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }); +}; + diff --git a/test/spec/.eslintrc b/test/spec/.eslintrc new file mode 100644 index 0000000..7eeefc3 --- /dev/null +++ b/test/spec/.eslintrc @@ -0,0 +1,5 @@ +{ + "env": { + "mocha": true + } +} diff --git a/test/spec/lib/api-item.js b/test/spec/lib/api-item.js new file mode 100644 index 0000000..bbfc6a3 --- /dev/null +++ b/test/spec/lib/api-item.js @@ -0,0 +1,46 @@ +'use strict'; + +var assert = require('chai').assert; +var ApiItem = require('../../../src/scripts/lib/api-item'); +var fixture = require('../../fixture'); +var items = require('../../../src/scripts/lib/items'); + +/** + * @param {Object} object + * @param {Array} properties + */ +function checkReadOnly(object, properties) { + properties.forEach(function(property) { + assert.strictEqual( + Object.getOwnPropertyDescriptor(object, property).writable, + false + ); + }); +} + +describe('ApiItem', function() { + it('defines read-only properties', function() { + var properties = [ + 'id', + 'appKey', + 'config', + '$element', + '$manipulatorTarget', + 'on', + 'one', + 'off', + 'trigger', + 'initialize' + ]; + var apiItem = new ApiItem(fixture('input')); + checkReadOnly(apiItem, properties); + }); + + it('attaches the manipulator methods', function() { + Object.keys(items).forEach(function(itemName) { + var apiItem = new ApiItem(fixture(itemName)); + var manipulator = items[itemName].manipulator; + checkReadOnly(apiItem, Object.keys(manipulator)); + }); + }); +});