UNPKG

1.61 kBJavaScriptView Raw
1'use strict';
2
3/**
4 * Module dependencies.
5 */
6
7var Base = require('./base');
8
9/**
10 * Expose `JSON`.
11 */
12
13exports = module.exports = JSONReporter;
14
15/**
16 * Initialize a new `JSON` reporter.
17 *
18 * @api public
19 * @param {Runner} runner
20 */
21function JSONReporter (runner) {
22 Base.call(this, runner);
23
24 var self = this;
25 var tests = [];
26 var pending = [];
27 var failures = [];
28 var passes = [];
29
30 runner.on('test end', function (test) {
31 tests.push(test);
32 });
33
34 runner.on('pass', function (test) {
35 passes.push(test);
36 });
37
38 runner.on('fail', function (test) {
39 failures.push(test);
40 });
41
42 runner.on('pending', function (test) {
43 pending.push(test);
44 });
45
46 runner.on('end', function () {
47 var obj = {
48 stats: self.stats,
49 tests: tests.map(clean),
50 pending: pending.map(clean),
51 failures: failures.map(clean),
52 passes: passes.map(clean)
53 };
54
55 runner.testResults = obj;
56
57 process.stdout.write(JSON.stringify(obj, null, 2));
58 });
59}
60
61/**
62 * Return a plain-object representation of `test`
63 * free of cyclic properties etc.
64 *
65 * @api private
66 * @param {Object} test
67 * @return {Object}
68 */
69function clean (test) {
70 return {
71 title: test.title,
72 fullTitle: test.fullTitle(),
73 duration: test.duration,
74 currentRetry: test.currentRetry(),
75 err: errorJSON(test.err || {})
76 };
77}
78
79/**
80 * Transform `error` into a JSON object.
81 *
82 * @api private
83 * @param {Error} err
84 * @return {Object}
85 */
86function errorJSON (err) {
87 var res = {};
88 Object.getOwnPropertyNames(err).forEach(function (key) {
89 res[key] = err[key];
90 }, err);
91 return res;
92}