Commit 6f744e765280af1c0ad3ed2b6e102bf32d9c57b3

Authored by ABNER SILVA DE OLIVEIRA
1 parent d316e303

added coverage

.vscode/tasks.json
... ... @@ -18,8 +18,10 @@
18 18 ]
19 19 },
20 20 {
  21 + "taskName": "coverage"
  22 + },
  23 + {
21 24 "taskName": "test",
22   - "args": ["test"],
23 25 "isTestCommand": true
24 26 }
25 27 ]
... ...
dev-scripts/node_modules
... ... @@ -1 +0,0 @@
1   -../node_modules
2 0 \ No newline at end of file
dev-scripts/remapCoverage.ts 0 → 100644
... ... @@ -0,0 +1,66 @@
  1 +/**
  2 + * @script remap-coverage.ts
  3 + *
  4 + * Esse script serve para transformar as informações de cobertura geradas pelo karma-coverage
  5 + * e que originalmente é construída apontando para os arquivos javascript (já que os testes são executados em javascript)
  6 + * para a informação de cobertura apontando para os arquivos Typescript, utilizando os source maps gerados pelo compilador
  7 + * typescript
  8 + * @author: Abner Oliveira
  9 + *
  10 + * Examplo de uso:
  11 + *
  12 + * Na linha de comando, na pasta raiz do projeto, digite:
  13 + *
  14 + * ts-node dev-scripts/remap-coverage.ts
  15 + *
  16 + * Observação: O karma já deve ter sido executado antes, e a pasta de coverage deve ser "./coverage"
  17 + */
  18 +
  19 +import * as path from "path";
  20 +import * as fs from "fs";
  21 +
  22 +let remapIstanbul = require("remap-istanbul");
  23 +
  24 +// pasta onde os arquivos do coverage são gerados
  25 +let coveragePath = path.join(__dirname, "..", "coverage");
  26 +
  27 +// o pré-processador "coverage" do runner de tests "karma" gera uma pasta
  28 +// de coverage para cada browser em que os testes foram executados
  29 +// iteraremos arqui então entre essas pastas para realizar o remap de cada uma
  30 +
  31 +console.log("COVERAGE PATH:", coveragePath);
  32 +// lendo o diretório coveragePath
  33 +fs.readdir(coveragePath, (err, directories) => {
  34 + if (err) {
  35 + console.error(err.message);
  36 + throw err;
  37 + }
  38 + // para cada diretório na pasta coveragePath faz map transformando o path para o caminho absoluto
  39 + directories.map((file) => {
  40 + return path.join(coveragePath, file);
  41 + }).forEach((coverageFolder) => {
  42 +
  43 + let coverageFile = path.join(coverageFolder, "coverage-final.json");
  44 +
  45 + let replace = require("replace");
  46 +
  47 + let absoluteProjectPath = path.join(__dirname, "../");
  48 +
  49 + replace({
  50 + regex: absoluteProjectPath,
  51 + replacement: "",
  52 + paths: [coverageFile],
  53 + sillent: true
  54 + });
  55 + // para cada pasta executa o remap do coverage que está apontando para os arquivos js
  56 + // para apontar para os arquivos Typecript
  57 + // gerando dois reports: JSON e HTML
  58 + remapIstanbul(coverageFile,
  59 + {
  60 + "basePath": "./src/",
  61 + "json": path.join(coverageFolder, "coverage-final-remaped.json"),
  62 + "html": path.join(coverageFolder)
  63 + });
  64 + });
  65 +
  66 +});
0 67 \ No newline at end of file
... ...
karma.conf.js
... ... @@ -4,6 +4,44 @@
4 4 var path = require('path');
5 5 var conf = require('./gulp/conf');
6 6  
  7 +var argv = require("yargs").argv;
  8 +
  9 +var singleRun = false;
  10 +
  11 +if (argv.singleRun) {
  12 + singleRun = true;
  13 +}
  14 +
  15 +var projectFiles = [
  16 + './src/commons.js',
  17 + './src/noosfero.js',
  18 + './src/noosfero-specs.js'
  19 +];
  20 +
  21 +var karmaPlugins = [
  22 + 'karma-chrome-launcher',
  23 + 'karma-phantomjs-launcher',
  24 + 'karma-angular-filesort',
  25 + 'karma-phantomjs-shim',
  26 + 'karma-jasmine',
  27 + 'karma-spec-reporter',
  28 + 'karma-ng-html2js-preprocessor',
  29 + 'karma-sourcemap-loader'
  30 +];
  31 +
  32 +
  33 +var karmaReporters = ['spec'];
  34 +
  35 +if (argv.coverage) {
  36 + //projectFiles = ['./src/shim.ts', './src/app/index.ts', './src/**/*.spec.ts'];
  37 + singleRun = true;
  38 +
  39 + karmaPlugins.push('karma-coverage');
  40 + //karmaPlugins.push('karma-webpack');
  41 +
  42 + karmaReporters.push('coverage');
  43 +}
  44 +
7 45  
8 46 var _ = require('lodash');
9 47 var wiredep = require('wiredep');
... ... @@ -13,7 +51,7 @@ var pathSrcHtml = [
13 51 ];
14 52  
15 53 var glob = require("glob");
16   -var testFiles = glob.sync("./src/**/*.[sS]pec.ts");
  54 +//var testFiles = glob.sync("./src/**/*.[sS]pec.ts");
17 55  
18 56 function listFiles() {
19 57 var wiredepOptions = _.extend({}, conf.wiredep, {
... ... @@ -22,22 +60,7 @@ function listFiles() {
22 60 });
23 61  
24 62 var patterns = [].concat(wiredep(wiredepOptions).js)
25   - .concat([
26   - './src/commons.js',
27   - './src/noosfero.js',
28   - './src/noosfero-specs.js'
29   - ]
30   - //[
31   - //path.join(conf.paths.src, 'common.js'),
32   - //, path.join(conf.paths.src, 'index.ts')
33   - //path.join(conf.paths.src, 'test.js')
34   - // path.join(conf.paths.src, '/app/**/*.module.js'),
35   - // path.join(conf.paths.src, '/app/**/*.js'),
36   - // path.join(conf.paths.src, '/**/*.spec.js'),
37   - // path.join(conf.paths.src, '/**/*.mock.js')
38   -
39   - //]
40   - )
  63 + .concat(projectFiles)
41 64 .concat(pathSrcHtml);
42 65  
43 66 var files = patterns.map(function (pattern) {
... ... @@ -51,11 +74,11 @@ function listFiles() {
51 74 served: true,
52 75 watched: false
53 76 });
54   - files.push({
55   - pattern: path.join(conf.paths.src, '/test.js.map'),
56   - included: false,
57   - served: true
58   - });
  77 + // files.push({
  78 + // pattern: path.join(conf.paths.src, '/test.js.map'),
  79 + // included: false,
  80 + // served: true
  81 + // });
59 82 return files;
60 83 }
61 84  
... ... @@ -64,9 +87,11 @@ var webpackConfig = require("./webpack.config.js");
64 87 module.exports = function (config) {
65 88  
66 89 var configuration = {
  90 + basePath: '../angular-theme',
  91 +
67 92 files: listFiles(),
68 93  
69   - singleRun: false,
  94 + singleRun: singleRun,
70 95  
71 96 autoWatch: true,
72 97 colors: true,
... ... @@ -87,48 +112,71 @@ module.exports = function (config) {
87 112  
88 113 browsers: ['PhantomJS'],
89 114  
90   - /* webpack: _.merge({
91   -
92   - }, webpackConfig, {
93   - devtool: 'inline-source-map'
94   - }),
95   - webpackServer: {
96   - quite: true
97   - },*/
98   - plugins: [
99   -// require('karma-webpack'),
100   - 'karma-chrome-launcher',
101   - 'karma-phantomjs-launcher',
102   - 'karma-angular-filesort',
103   - 'karma-webpack',
104   - 'karma-phantomjs-shim',
105   - 'karma-coverage',
106   - 'karma-jasmine',
107   - 'karma-spec-reporter',
108   - 'karma-ng-html2js-preprocessor',
109   - 'karma-sourcemap-loader'
110   - ],
111   -
112   - coverageReporter: {
113   - type: 'html',
114   - dir: 'coverage/'
115   - },
116 115  
117   - reporters: ['spec', "coverage"],
  116 + plugins: karmaPlugins,
  117 +
  118 +
  119 +
  120 + reporters: karmaReporters,
118 121  
119 122 proxies: {
120 123 '/assets/': path.join('/base/', conf.paths.src, '/assets/')
121 124 }
122 125 };
123 126  
124   - // This is the default preprocessors configuration for a usage with Karma cli
125   - // The coverage preprocessor is added in gulp/unit-test.js only for single tests
126   - // It was not possible to do it there because karma doesn't let us now if we are
127   - // running a single test or not
128   - configuration.preprocessors = {
129   - 'src/**/*.js': ['sourcemap'],
130   - 'src/**/*.ts': ['sourcemap']
131   - };
  127 + if (argv.coverage) {
  128 +
  129 + /*configuration.webpack = {
  130 + module: {
  131 + loaders: [
  132 + {
  133 + test: /\.tsx?$/,
  134 + loader: 'ts-loader'
  135 + }
  136 + ]
  137 + },
  138 + resolve: {
  139 + extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js'],
  140 + modulesDirectories: ['node_modules'],
  141 + root: path.resolve(__dirname)
  142 + }
  143 + };*/
  144 + /*configuration.webpack = _.merge({
  145 +
  146 + }, webpackConfig, {
  147 + devtool: 'source-map'
  148 + }),
  149 + configuration.webpackServer = {
  150 + quite: true
  151 + };*/
  152 +
  153 + // This is the default preprocessors configuration for a usage with Karma cli
  154 + // The coverage preprocessor is added in gulp/unit-test.js only for single tests
  155 + // It was not possible to do it there because karma doesn't let us now if we are
  156 + // running a single test or not
  157 + configuration.preprocessors = {
  158 + 'src/noosfero.js': ['sourcemap', 'coverage']
  159 + };
  160 +
  161 + configuration.coverageReporter = {
  162 + dir: 'coverage/',
  163 + reporters: [
  164 + /*{ type: 'html' },*/
  165 + { type: 'json', file: 'coverage-final.json' },
  166 + { type: 'text-summary' }
  167 + ]
  168 + };
  169 + } else {
  170 + // This is the default preprocessors configuration for a usage with Karma cli
  171 + // The coverage preprocessor is added in gulp/unit-test.js only for single tests
  172 + // It was not possible to do it there because karma doesn't let us now if we are
  173 + // running a single test or not
  174 + configuration.preprocessors = {
  175 + 'src/noosfero.js': ['sourcemap'],
  176 + 'src/**/*.ts': ['sourcemap']
  177 + };
  178 + }
  179 +
132 180 // 'src/**/*.js': ['sourcemap'],
133 181 // 'src/**/*.[sS]pec.ts': ['sourcemap']
134 182 // };
... ...
package.json
... ... @@ -7,6 +7,9 @@
7 7 "moment": "^2.11.2"
8 8 },
9 9 "scripts": {
  10 + "coverage": "karma start --coverage & npm run remap-coverage",
  11 + "remap-coverage": "ts-node --project ./dev-scripts ./dev-scripts/remapCoverage.ts",
  12 + "test-single": "webpack && karma start --single-run",
10 13 "test": "concurrently \"webpack -w\" \"karma start\"",
11 14 "postinstall": "npm install -g bower && bower install",
12 15 "start": "concurrently \"webpack -w\" \"gulp serve\"",
... ... @@ -48,6 +51,7 @@
48 51 "gulp-useref": "~1.3.0",
49 52 "gulp-util": "~3.0.6",
50 53 "http-proxy-middleware": "~0.9.0",
  54 + "istanbul": "^1.0.0-alpha.2",
51 55 "karma": "~0.13.10",
52 56 "karma-angular-filesort": "~1.0.0",
53 57 "karma-chrome-launcher": "^0.2.2",
... ... @@ -65,6 +69,8 @@
65 69 "phantomjs": "~1.9.18",
66 70 "phantomjs-polyfill": "0.0.2",
67 71 "reflect-metadata": "^0.1.3",
  72 + "remap-istanbul": "^0.5.1",
  73 + "replace": "^0.3.0",
68 74 "ts-loader": "^0.8.1",
69 75 "ts-node": "^0.5.5",
70 76 "typescript": "^1.8.2",
... ...
webpack.config.js
... ... @@ -42,7 +42,7 @@ var webpackConfig = {
42 42 extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js']
43 43 },
44 44 // Source maps support (or 'inline-source-map' also works)
45   - devtool: 'inline-source-map',
  45 + devtool: 'source-map',
46 46  
47 47 module: {
48 48 loaders: [{
... ...