From 6f744e765280af1c0ad3ed2b6e102bf32d9c57b3 Mon Sep 17 00:00:00 2001 From: ABNER SILVA DE OLIVEIRA Date: Fri, 4 Mar 2016 11:31:16 -0300 Subject: [PATCH] added coverage --- .vscode/tasks.json | 4 +++- dev-scripts/node_modules | 1 - dev-scripts/remapCoverage.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ karma.conf.js | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------- package.json | 6 ++++++ webpack.config.js | 2 +- 6 files changed, 182 insertions(+), 61 deletions(-) delete mode 120000 dev-scripts/node_modules create mode 100644 dev-scripts/remapCoverage.ts diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e34d346..637fca2 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -18,8 +18,10 @@ ] }, { + "taskName": "coverage" + }, + { "taskName": "test", - "args": ["test"], "isTestCommand": true } ] diff --git a/dev-scripts/node_modules b/dev-scripts/node_modules deleted file mode 120000 index 68a084a..0000000 --- a/dev-scripts/node_modules +++ /dev/null @@ -1 +0,0 @@ -../node_modules \ No newline at end of file diff --git a/dev-scripts/remapCoverage.ts b/dev-scripts/remapCoverage.ts new file mode 100644 index 0000000..6588e6f --- /dev/null +++ b/dev-scripts/remapCoverage.ts @@ -0,0 +1,66 @@ +/** + * @script remap-coverage.ts + * + * Esse script serve para transformar as informações de cobertura geradas pelo karma-coverage + * e que originalmente é construída apontando para os arquivos javascript (já que os testes são executados em javascript) + * para a informação de cobertura apontando para os arquivos Typescript, utilizando os source maps gerados pelo compilador + * typescript + * @author: Abner Oliveira + * + * Examplo de uso: + * + * Na linha de comando, na pasta raiz do projeto, digite: + * + * ts-node dev-scripts/remap-coverage.ts + * + * Observação: O karma já deve ter sido executado antes, e a pasta de coverage deve ser "./coverage" + */ + +import * as path from "path"; +import * as fs from "fs"; + +let remapIstanbul = require("remap-istanbul"); + +// pasta onde os arquivos do coverage são gerados +let coveragePath = path.join(__dirname, "..", "coverage"); + +// o pré-processador "coverage" do runner de tests "karma" gera uma pasta +// de coverage para cada browser em que os testes foram executados +// iteraremos arqui então entre essas pastas para realizar o remap de cada uma + +console.log("COVERAGE PATH:", coveragePath); +// lendo o diretório coveragePath +fs.readdir(coveragePath, (err, directories) => { + if (err) { + console.error(err.message); + throw err; + } + // para cada diretório na pasta coveragePath faz map transformando o path para o caminho absoluto + directories.map((file) => { + return path.join(coveragePath, file); + }).forEach((coverageFolder) => { + + let coverageFile = path.join(coverageFolder, "coverage-final.json"); + + let replace = require("replace"); + + let absoluteProjectPath = path.join(__dirname, "../"); + + replace({ + regex: absoluteProjectPath, + replacement: "", + paths: [coverageFile], + sillent: true + }); + // para cada pasta executa o remap do coverage que está apontando para os arquivos js + // para apontar para os arquivos Typecript + // gerando dois reports: JSON e HTML + remapIstanbul(coverageFile, + { + "basePath": "./src/", + "json": path.join(coverageFolder, "coverage-final-remaped.json"), + "html": path.join(coverageFolder) + }); + }); + +}); \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 813fa06..857d894 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -4,6 +4,44 @@ var path = require('path'); var conf = require('./gulp/conf'); +var argv = require("yargs").argv; + +var singleRun = false; + +if (argv.singleRun) { + singleRun = true; +} + +var projectFiles = [ + './src/commons.js', + './src/noosfero.js', + './src/noosfero-specs.js' +]; + +var karmaPlugins = [ + 'karma-chrome-launcher', + 'karma-phantomjs-launcher', + 'karma-angular-filesort', + 'karma-phantomjs-shim', + 'karma-jasmine', + 'karma-spec-reporter', + 'karma-ng-html2js-preprocessor', + 'karma-sourcemap-loader' +]; + + +var karmaReporters = ['spec']; + +if (argv.coverage) { + //projectFiles = ['./src/shim.ts', './src/app/index.ts', './src/**/*.spec.ts']; + singleRun = true; + + karmaPlugins.push('karma-coverage'); + //karmaPlugins.push('karma-webpack'); + + karmaReporters.push('coverage'); +} + var _ = require('lodash'); var wiredep = require('wiredep'); @@ -13,7 +51,7 @@ var pathSrcHtml = [ ]; var glob = require("glob"); -var testFiles = glob.sync("./src/**/*.[sS]pec.ts"); +//var testFiles = glob.sync("./src/**/*.[sS]pec.ts"); function listFiles() { var wiredepOptions = _.extend({}, conf.wiredep, { @@ -22,22 +60,7 @@ function listFiles() { }); var patterns = [].concat(wiredep(wiredepOptions).js) - .concat([ - './src/commons.js', - './src/noosfero.js', - './src/noosfero-specs.js' - ] - //[ - //path.join(conf.paths.src, 'common.js'), - //, path.join(conf.paths.src, 'index.ts') - //path.join(conf.paths.src, 'test.js') - // path.join(conf.paths.src, '/app/**/*.module.js'), - // path.join(conf.paths.src, '/app/**/*.js'), - // path.join(conf.paths.src, '/**/*.spec.js'), - // path.join(conf.paths.src, '/**/*.mock.js') - - //] - ) + .concat(projectFiles) .concat(pathSrcHtml); var files = patterns.map(function (pattern) { @@ -51,11 +74,11 @@ function listFiles() { served: true, watched: false }); - files.push({ - pattern: path.join(conf.paths.src, '/test.js.map'), - included: false, - served: true - }); + // files.push({ + // pattern: path.join(conf.paths.src, '/test.js.map'), + // included: false, + // served: true + // }); return files; } @@ -64,9 +87,11 @@ var webpackConfig = require("./webpack.config.js"); module.exports = function (config) { var configuration = { + basePath: '../angular-theme', + files: listFiles(), - singleRun: false, + singleRun: singleRun, autoWatch: true, colors: true, @@ -87,48 +112,71 @@ module.exports = function (config) { browsers: ['PhantomJS'], - /* webpack: _.merge({ - - }, webpackConfig, { - devtool: 'inline-source-map' - }), - webpackServer: { - quite: true - },*/ - plugins: [ -// require('karma-webpack'), - 'karma-chrome-launcher', - 'karma-phantomjs-launcher', - 'karma-angular-filesort', - 'karma-webpack', - 'karma-phantomjs-shim', - 'karma-coverage', - 'karma-jasmine', - 'karma-spec-reporter', - 'karma-ng-html2js-preprocessor', - 'karma-sourcemap-loader' - ], - - coverageReporter: { - type: 'html', - dir: 'coverage/' - }, - reporters: ['spec', "coverage"], + plugins: karmaPlugins, + + + + reporters: karmaReporters, proxies: { '/assets/': path.join('/base/', conf.paths.src, '/assets/') } }; - // This is the default preprocessors configuration for a usage with Karma cli - // The coverage preprocessor is added in gulp/unit-test.js only for single tests - // It was not possible to do it there because karma doesn't let us now if we are - // running a single test or not - configuration.preprocessors = { - 'src/**/*.js': ['sourcemap'], - 'src/**/*.ts': ['sourcemap'] - }; + if (argv.coverage) { + + /*configuration.webpack = { + module: { + loaders: [ + { + test: /\.tsx?$/, + loader: 'ts-loader' + } + ] + }, + resolve: { + extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js'], + modulesDirectories: ['node_modules'], + root: path.resolve(__dirname) + } + };*/ + /*configuration.webpack = _.merge({ + + }, webpackConfig, { + devtool: 'source-map' + }), + configuration.webpackServer = { + quite: true + };*/ + + // This is the default preprocessors configuration for a usage with Karma cli + // The coverage preprocessor is added in gulp/unit-test.js only for single tests + // It was not possible to do it there because karma doesn't let us now if we are + // running a single test or not + configuration.preprocessors = { + 'src/noosfero.js': ['sourcemap', 'coverage'] + }; + + configuration.coverageReporter = { + dir: 'coverage/', + reporters: [ + /*{ type: 'html' },*/ + { type: 'json', file: 'coverage-final.json' }, + { type: 'text-summary' } + ] + }; + } else { + // This is the default preprocessors configuration for a usage with Karma cli + // The coverage preprocessor is added in gulp/unit-test.js only for single tests + // It was not possible to do it there because karma doesn't let us now if we are + // running a single test or not + configuration.preprocessors = { + 'src/noosfero.js': ['sourcemap'], + 'src/**/*.ts': ['sourcemap'] + }; + } + // 'src/**/*.js': ['sourcemap'], // 'src/**/*.[sS]pec.ts': ['sourcemap'] // }; diff --git a/package.json b/package.json index 2b4cdad..4022869 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,9 @@ "moment": "^2.11.2" }, "scripts": { + "coverage": "karma start --coverage & npm run remap-coverage", + "remap-coverage": "ts-node --project ./dev-scripts ./dev-scripts/remapCoverage.ts", + "test-single": "webpack && karma start --single-run", "test": "concurrently \"webpack -w\" \"karma start\"", "postinstall": "npm install -g bower && bower install", "start": "concurrently \"webpack -w\" \"gulp serve\"", @@ -48,6 +51,7 @@ "gulp-useref": "~1.3.0", "gulp-util": "~3.0.6", "http-proxy-middleware": "~0.9.0", + "istanbul": "^1.0.0-alpha.2", "karma": "~0.13.10", "karma-angular-filesort": "~1.0.0", "karma-chrome-launcher": "^0.2.2", @@ -65,6 +69,8 @@ "phantomjs": "~1.9.18", "phantomjs-polyfill": "0.0.2", "reflect-metadata": "^0.1.3", + "remap-istanbul": "^0.5.1", + "replace": "^0.3.0", "ts-loader": "^0.8.1", "ts-node": "^0.5.5", "typescript": "^1.8.2", diff --git a/webpack.config.js b/webpack.config.js index 11e493f..f7de5be 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -42,7 +42,7 @@ var webpackConfig = { extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js'] }, // Source maps support (or 'inline-source-map' also works) - devtool: 'inline-source-map', + devtool: 'source-map', module: { loaders: [{ -- libgit2 0.21.2