From 60bbe531c9883f64b8cc37b42561cd5e7959f0c4 Mon Sep 17 00:00:00 2001 From: skratchdot Date: Sun, 29 Nov 2015 21:55:07 -0500 Subject: [PATCH] using gulp/mocha/chai. adding code coverage --- .eslintrc | 67 +++++++++++++ .gitignore | 7 +- .jshintrc | 14 --- .npmignore | 2 +- .tonic.example.js | 3 + .travis.yml | 15 ++- Gruntfile.js | 48 ---------- README.md | 6 +- lib/create-data.js => create-data.js | 1 + gulpfile.js | 62 ++++++++++++ lib/random-useragent.js => index.js | 0 package.json | 50 +++++----- test.js | 54 +++++++++++ test/random-useragent_test.js | 94 ------------------- ...useragent-data.json => useragent-data.json | 0 15 files changed, 234 insertions(+), 189 deletions(-) create mode 100644 .eslintrc delete mode 100644 .jshintrc create mode 100644 .tonic.example.js delete mode 100644 Gruntfile.js rename lib/create-data.js => create-data.js (98%) create mode 100644 gulpfile.js rename lib/random-useragent.js => index.js (100%) create mode 100644 test.js delete mode 100644 test/random-useragent_test.js rename lib/useragent-data.json => useragent-data.json (100%) diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..d2a57ce --- /dev/null +++ b/.eslintrc @@ -0,0 +1,67 @@ +// adapted from: https://github.com/Khan/style-guides/pull/25 +{ + "plugins": [ + ], + "ecmaFeatures": { + "modules": true + }, + "env": { + "browser": true, + "node": true, + "mocha": true + }, + "rules": { + "arrow-parens": [2, "always"], + "arrow-spacing": 2, + "brace-style": 2, + "camelcase": [2, { + "properties": "always" + }], + "comma-dangle": [1, "always-multiline"], + "comma-dangle": [2, "never"], + "comma-spacing": [2, { + "before": false, + "after": true + }], + "eol-last": [0], + "guard-for-in": 2, + //"indent": [2, 4], + "linebreak-style": [2, "unix"], + /* + "max-len": [2, 80, 4, { + "ignoreUrls": true, + "ignorePattern": "^\\s*const\\s.+=\\s*require\\s*\\(" + }], + */ + "no-alert": 2, + "no-array-constructor": 2, + "no-const-assign": 2, + "no-debugger": 2, + "no-dupe-keys": 2, + "no-new-object": 2, + "no-spaced-func": 2, + "no-this-before-super": 2, + "no-throw-literal": 2, + "no-trailing-spaces": 2, + "no-unreachable": 2, + "no-unused-vars": 1, + "no-var": 0, + //"object-curly-spacing": [2, "always"], + "one-var": [2, "never"], + "prefer-const": 1, + "prefer-template": 2, + "quotes": [2, "single"], + "semi": [2, "always"], + "space-after-keywords": [2, "always"], + "space-before-blocks": 2, + "space-before-function-paren": [2, { + "anonymous": "always", + "named": "never" + }], + "space-infix-ops": 2, + "space-return-throw-case": 2, + "strict": [0, "never"], + "valid-jsdoc": 2 + }, + "extends": "eslint:recommended" +} diff --git a/.gitignore b/.gitignore index 2ccbe46..cb281a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ -/node_modules/ +_ignore/ +coverage/ +node_modules/ +.DS_Store +.npm-debug.log +.project diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 8c86fc7..0000000 --- a/.jshintrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "curly": true, - "eqeqeq": true, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "sub": true, - "undef": true, - "unused": true, - "boss": true, - "eqnull": true, - "node": true -} diff --git a/.npmignore b/.npmignore index 0ec229d..02abe38 100644 --- a/.npmignore +++ b/.npmignore @@ -1,7 +1,7 @@ .git* _ignore/ -test/ .DS_Store +.gitignore .npm-debug.log .project .travis.yml diff --git a/.tonic.example.js b/.tonic.example.js new file mode 100644 index 0000000..993f820 --- /dev/null +++ b/.tonic.example.js @@ -0,0 +1,3 @@ +var random_useragent = require('random-useragent'); +var result = random_useragent.getRandom(); // gets a random user agent string +console.log(result); diff --git a/.travis.yml b/.travis.yml index 816f195..e04c140 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,14 @@ language: node_js node_js: - - "0.10" -before_install: npm install -g grunt-cli -install: npm install + - 'stable' + - '4.2' + - '4.1' + - '4.0' + - '0.12' + - '0.11' + - '0.10' +before_script: + - npm install -g gulp +script: + - gulp test + - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls --verbose diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index e7b68bc..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -module.exports = function(grunt) { - - // Project configuration. - grunt.initConfig({ - nodeunit: { - files: ['test/**/*_test.js'], - }, - jshint: { - options: { - jshintrc: '.jshintrc' - }, - gruntfile: { - src: 'Gruntfile.js' - }, - lib: { - src: ['lib/**/*.js'] - }, - test: { - src: ['test/**/*.js'] - }, - }, - watch: { - gruntfile: { - files: '<%= jshint.gruntfile.src %>', - tasks: ['jshint:gruntfile'] - }, - lib: { - files: '<%= jshint.lib.src %>', - tasks: ['jshint:lib', 'nodeunit'] - }, - test: { - files: '<%= jshint.test.src %>', - tasks: ['jshint:test', 'nodeunit'] - }, - }, - }); - - // These plugins provide necessary tasks. - grunt.loadNpmTasks('grunt-contrib-nodeunit'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-watch'); - - // Default task. - grunt.registerTask('default', ['jshint', 'nodeunit']); - -}; diff --git a/README.md b/README.md index fb9c7fc..33b8a1b 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,12 @@ [![NPM version](https://badge.fury.io/js/random-useragent.svg)](http://badge.fury.io/js/random-useragent) [![Build Status](https://travis-ci.org/skratchdot/random-useragent.png?branch=master)](https://travis-ci.org/skratchdot/random-useragent) [![Code Climate](https://codeclimate.com/github/skratchdot/random-useragent.png)](https://codeclimate.com/github/skratchdot/random-useragent) -[![Coverage Status](https://coveralls.io/repos/skratchdot/random-useragent/badge.png)](https://coveralls.io/r/skratchdot/random-useragent) +[![Coverage Status](https://coveralls.io/repos/skratchdot/random-useragent/badge.svg?branch=master&service=github)](https://coveralls.io/github/skratchdot/random-useragent?branch=master) [![Dependency Status](https://david-dm.org/skratchdot/random-useragent.svg)](https://david-dm.org/skratchdot/random-useragent) [![devDependency Status](https://david-dm.org/skratchdot/random-useragent/dev-status.svg)](https://david-dm.org/skratchdot/random-useragent#info=devDependencies) +[![NPM](https://nodei.co/npm/random-useragent.png)](https://npmjs.org/package/random-useragent) + ## Description @@ -22,6 +24,8 @@ var random_useragent = require('random-useragent'); random_useragent.getRandom(); // gets a random user agent string ``` +- [Live example on Tonic](https://tonicdev.com/npm/random-useragent) + ## Documentation diff --git a/lib/create-data.js b/create-data.js similarity index 98% rename from lib/create-data.js rename to create-data.js index 73384c3..2976ea2 100644 --- a/lib/create-data.js +++ b/create-data.js @@ -5,6 +5,7 @@ * Copyright (c) 2014 skratchdot * Licensed under the MIT license. */ +/*eslint prefer-template:0, no-console:0 */ 'use strict'; // config diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..9f5b4b2 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,62 @@ +/*eslint no-console: 0 */ +'use strict'; +var gulp = require('gulp'); +var eslint = require('gulp-eslint'); +var isparta = require('isparta'); +var istanbul = require('gulp-istanbul'); +var mocha = require('gulp-mocha'); +var files = { + lint: ['*.js'], + src: ['index.js'], + test: ['test.js'] +}; + +gulp.task('lint', function () { + return gulp.src(files.lint) + // eslint() attaches the lint output to the eslint property + // of the file object so it can be used by other modules. + .pipe(eslint()) + // eslint.format() outputs the lint results to the console. + // Alternatively use eslint.formatEach() (see Docs). + .pipe(eslint.format('stylish')) + // To have the process exit with an error code (1) on + // lint error, return the stream and pipe to failAfterError last. + .pipe(eslint.failAfterError()); +}); + +gulp.task('test', function () { + return gulp.src(files.src) + .pipe(istanbul({ + instrumenter: isparta.Instrumenter, + includeUntested: true + })) + // Force `require` to return covered files + .pipe(istanbul.hookRequire()) + .on('finish', function () { + gulp.src(files.test, {read: false}) + // gulp-mocha needs filepaths so you can't have any plugins before it + .pipe(mocha({ + reporter: 'spec' + })) + .on('error', function (err) { + console.error(err.toString()); + this.emit('end'); + }) + .pipe(istanbul.writeReports({ + dir: './coverage', + reporters: ['lcov', 'json', 'text-summary'] + })); + }); +}); + +gulp.task('watch', function () { + gulp.watch([files.lint], ['lint', 'test']); +}); + +// setup default task +gulp.task('default', ['lint', 'test', 'watch']); + +// handle errors +process.on('uncaughtException', function (e) { + console.error(e); +}); diff --git a/lib/random-useragent.js b/index.js similarity index 100% rename from lib/random-useragent.js rename to index.js diff --git a/package.json b/package.json index 0260fdd..d8f9342 100644 --- a/package.json +++ b/package.json @@ -1,44 +1,40 @@ { "name": "random-useragent", + "version": "0.2.0", "description": "Get a random useragent (with an optional filter)", - "version": "0.1.2", - "homepage": "https://github.com/skratchdot/random-useragent", - "author": { - "name": "skratchdot", - "email": "git@skratchdot.com" + "main": "index.js", + "scripts": { + "test": "gulp test" + }, + "author": "skratchdot", + "license": "MIT", + "bugs": { + "url": "https://github.com/skratchdot/random-useragent/issues" }, + "homepage": "https://github.com/skratchdot/random-useragent", "repository": { "type": "git", "url": "git://github.com/skratchdot/random-useragent.git" }, - "bugs": { - "url": "https://github.com/skratchdot/random-useragent/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/skratchdot/random-useragent/blob/master/LICENSE-MIT" - } - ], - "main": "lib/random-useragent", "engines": { "node": ">= 0.10.0" }, - "scripts": { - "test": "grunt nodeunit" - }, "dependencies": { - "random-seed": "^0.2.0" + "random-seed": "^0.3.0" }, "devDependencies": { - "grunt": "~0.4.5", - "grunt-contrib-jshint": "~0.11.2", - "grunt-contrib-nodeunit": "~0.4.1", - "grunt-contrib-watch": "~0.6.1", - "request": "^2.55.0", - "ua-parser-js": "^0.7.6", - "xml2js": "^0.4.8" + "chai": "^3.4.1", + "coveralls": "^2.11.4", + "gulp": "^3.9.0", + "gulp-eslint": "^1.1.1", + "gulp-istanbul": "^0.10.3", + "gulp-mocha": "^2.2.0", + "isparta": "^4.0.0", + "request": "^2.67.0", + "ua-parser-js": "^0.7.9", + "xml2js": "^0.4.15" }, + "tonicExampleFilename": ".tonic.example.js", "keywords": [ "random", "useragent", @@ -49,4 +45,4 @@ "web", "developer" ] -} \ No newline at end of file +} diff --git a/test.js b/test.js new file mode 100644 index 0000000..911777a --- /dev/null +++ b/test.js @@ -0,0 +1,54 @@ +'use strict'; + +var expect = require('chai').expect; +var lib = require('./index.js'); +var iterations = 100; + +describe('random-useragent', function () { + it('don\'t change data', function () { + var d1; + var d2; + var key = 'someNewKey'; + d1 = lib.getAllData(); + d1[0][key] = 'foo'; + d2 = lib.getAllData(); + expect(d1[0].hasOwnProperty(key)).to.equal(true); + expect(d2[0].hasOwnProperty(key)).to.equal(false); + }); + it('return values', function () { + expect(lib.getRandom()).to.be.a.string; + expect(lib.getRandomData()).to.be.an.object; + expect(lib.getAll()).to.be.an.array; + expect(lib.getAllData()).to.be.an.array; + }); + it('randomization works', function (done) { + var i; + for (i = 0; i < iterations; i++) { + expect(lib.getRandom()).to.be.a.string; + expect(lib.getRandomData()).to.be.an.object; + } + done(); + }); + it('valid filters work', function () { + var filter = function (item) { + return item.browserName === 'Chrome'; + }; + expect(lib.getRandom(filter)).to.be.a.string; + expect(lib.getRandomData(filter)).to.be.an.object; + expect(lib.getAll(filter)).to.be.an.array; + expect(lib.getAllData(filter)).to.be.an.array; + expect(lib.getAll(filter)).to.have.length.gt(0); + expect(lib.getAllData(filter)).to.have.length.gt(0); + }); + it('invalid filters work', function () { + var filter = function (item) { + return item.browserName === 'Some Fake Browser'; + }; + expect(lib.getRandom(filter)).to.be.null; + expect(lib.getRandomData(filter)).to.be.null; + expect(lib.getAll(filter)).to.be.an.array; + expect(lib.getAllData(filter)).to.be.an.array; + expect(lib.getAll(filter)).to.have.length(0); + expect(lib.getAllData(filter)).to.have.length(0); + }); +}); diff --git a/test/random-useragent_test.js b/test/random-useragent_test.js deleted file mode 100644 index 57e5a36..0000000 --- a/test/random-useragent_test.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * random-useragent - * https://github.com/skratchdot/random-useragent - * - * Copyright (c) 2014 skratchdot - * Licensed under the MIT license. - */ -/* - ======== A Handy Little Nodeunit Reference ======== - https://github.com/caolan/nodeunit - - Test methods: - test.expect(numAssertions) - test.done() - Test assertions: - test.ok(value, [message]) - test.equal(actual, expected, [message]) - test.notEqual(actual, expected, [message]) - test.deepEqual(actual, expected, [message]) - test.notDeepEqual(actual, expected, [message]) - test.strictEqual(actual, expected, [message]) - test.notStrictEqual(actual, expected, [message]) - test.throws(block, [error], [message]) - test.doesNotThrow(block, [error], [message]) - test.ifError(value) -*/ -'use strict'; - -var random_useragent = require('../lib/random-useragent.js'); -var iterations = 100; - -var getType = function (obj) { - return ({}).toString.call(obj).match(/(\[object )(.*)(\])/)[2]; -}; - -exports['random-useragent tests'] = { - setUp: function (done) { - // setup here - done(); - }, - 'don\'t change data': function (test) { - var d1, d2, key = 'someNewKey'; - test.expect(2); - d1 = random_useragent.getAllData(); - d1[0][key] = 'foo'; - d2 = random_useragent.getAllData(); - test.equal(d1[0].hasOwnProperty(key), true, 'new key should exist'); - test.equal(d2[0].hasOwnProperty(key), false, 'new key should not exist'); - test.done(); - }, - 'return values': function (test) { - test.expect(4); - test.equal(getType(random_useragent.getRandom()), 'String', 'getRandom() should return a String'); - test.equal(getType(random_useragent.getRandomData()), 'Object', 'getRandomData() should return an Object'); - test.equal(getType(random_useragent.getAll()), 'Array', 'getAll() should return a Array'); - test.equal(getType(random_useragent.getAllData()), 'Array', 'getAllData() should return an Array'); - test.done(); - }, - 'randomization works': function (test) { - var i; - test.expect(iterations * 2); - for (i = 0; i < iterations; i++) { - test.equal(getType(random_useragent.getRandom()), 'String', 'getRandom() should return a String'); - test.equal(getType(random_useragent.getRandomData()), 'Object', 'getRandomData() should return a Object'); - } - test.done(); - }, - 'valid filters work': function (test) { - var filter = function (item) { - return item.browserName === 'Chrome'; - }; - test.expect(6); - test.equal(getType(random_useragent.getRandom(filter)), 'String', 'getRandom(valid_filter) should return a String'); - test.equal(getType(random_useragent.getRandomData(filter)), 'Object', 'getRandomObject(valid_filter) should return a Object'); - test.equal(getType(random_useragent.getAll(filter)), 'Array', 'getAll(valid_filter) should return an Array'); - test.equal(getType(random_useragent.getAllData(filter)), 'Array', 'getAllData(valid_filter) should return an Array'); - test.equal(random_useragent.getAll(filter).length > 0, true, 'getAll(valid_filter) should return an Array with length > 0'); - test.equal(random_useragent.getAllData(filter).length > 0, true, 'getAllData(valid_filter) should return an Array with length > 0'); - test.done(); - }, - 'invalid filters work': function (test) { - var filter = function (item) { - return item.browserName === 'Some Fake Browser'; - }; - test.expect(6); - test.equal(getType(random_useragent.getRandom(filter)), 'Null', 'getRandom(invalid_filter) should return null'); - test.equal(getType(random_useragent.getRandomData(filter)), 'Null', 'getRandomData(invalid_filter) should return null'); - test.equal(getType(random_useragent.getAll(filter)), 'Array', 'getAll(invalid_filter) should return an Array'); - test.equal(getType(random_useragent.getAllData(filter)), 'Array', 'getAllData(invalid_filter) should return an Array'); - test.equal(random_useragent.getAll(filter).length === 0, true, 'getAll(valid_filter) should return an Array with length === 0'); - test.equal(random_useragent.getAllData(filter).length === 0, true, 'getAllData(valid_filter) should return an Array with length === 0'); - test.done(); - } -}; diff --git a/lib/useragent-data.json b/useragent-data.json similarity index 100% rename from lib/useragent-data.json rename to useragent-data.json