Skip to content

Commit a83514d

Browse files
committed
parse-json with tests
1 parent ef122d3 commit a83514d

File tree

10 files changed

+412
-27
lines changed

10 files changed

+412
-27
lines changed

.npmignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
test
2+
node_modules
3+
.cache
4+
tsconfig.json
5+
tslint.json
6+
src

lib/parse-json.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,29 @@ function formatFailureMessage(message) {
66
return message.split('_').join(' ');
77
}
88
function parseJson(pathToResults) {
9-
var result = JSON.parse(require(pathToResults));
10-
if (!result.report || !result.report.tests.length) {
9+
var result = JSON.parse(JSON.stringify(require(pathToResults)));
10+
if (!result.report || !result.report.tests.length || !result.report.summary) {
1111
console.log('error with test output in report.json');
1212
return;
1313
}
14-
var finalTest = result.report.tests[0];
14+
var finalIndex = result.report.summary.num_tests - 1;
15+
var finalTest = result.report.tests.find(function (test) {
16+
return test.run_index === finalIndex;
17+
});
1518
var taskPosition = parseInt(finalTest.name.match(testNumber)[1], 10);
1619
if (!taskPosition) {
1720
console.log('Error with test. There is no valid task number in the Test class title');
1821
return;
1922
}
20-
if (finalTest.outcome === 'passed') {
23+
var failed = result.report.summary.failed > 0;
24+
if (!failed) {
2125
final = {
2226
completed: true,
23-
msg: 'Task ${taskPosition} Complete',
24-
taskPosition: taskPosition + 1
27+
msg: "Task " + taskPosition + " Complete",
28+
taskPosition: taskPosition
2529
};
2630
}
27-
else if (finalTest.outcome === 'failed') {
31+
else {
2832
var message = finalTest.name.match(testMessage)[1];
2933
if (!message) {
3034
console.log('Error with test. There is no valid test message');
@@ -33,13 +37,10 @@ function parseJson(pathToResults) {
3337
final = {
3438
completed: false,
3539
msg: formatFailureMessage(message),
36-
taskPosition: taskPosition,
40+
taskPosition: taskPosition - 1,
3741
timedOut: false
3842
};
3943
}
40-
else {
41-
console.log('error processing result: ', result);
42-
}
4344
return final;
4445
}
4546
exports.parseJson = parseJson;

src/parse-json.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,33 @@ function formatFailureMessage(message: string): string {
1414
}
1515

1616
export function parseJson(pathToResults: string): ParseFinal {
17-
let result = JSON.parse(require(pathToResults));
18-
if (!result.report || !result.report.tests.length) {
17+
let result = JSON.parse(JSON.stringify(require(pathToResults)));
18+
if (!result.report || !result.report.tests.length || !result.report.summary) {
1919
console.log('error with test output in report.json');
2020
return;
2121
}
2222

23-
let finalTest = result.report.tests[0];
23+
let finalIndex = result.report.summary.num_tests - 1;
24+
let finalTest = result.report.tests.find(function(test) {
25+
return test.run_index === finalIndex;
26+
});
2427
let taskPosition: number = parseInt(finalTest.name.match(testNumber)[1], 10);
2528

2629
if (!taskPosition) {
2730
console.log('Error with test. There is no valid task number in the Test class title');
2831
return;
2932
}
3033

31-
if (finalTest.outcome === 'passed') {
34+
let failed = result.report.summary.failed > 0;
35+
36+
if (!failed) {
3237
// pass
3338
final = {
3439
completed: true,
35-
msg: 'Task ${taskPosition} Complete',
36-
taskPosition: taskPosition + 1
40+
msg: `Task ${taskPosition} Complete`,
41+
taskPosition
3742
};
38-
} else if (finalTest.outcome === 'failed') {
43+
} else {
3944
// fail: return first failure
4045

4146
// failure message
@@ -48,12 +53,10 @@ export function parseJson(pathToResults: string): ParseFinal {
4853
final = {
4954
completed: false,
5055
msg: formatFailureMessage(message),
51-
taskPosition,
56+
taskPosition: taskPosition - 1,
5257
timedOut: false // TODO
5358
};
5459

55-
} else {
56-
console.log('error processing result: ', result);
5760
}
5861

5962
return final;

test/parse-json.spec.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import test from 'ava';
2+
import * as path from 'path';
3+
import {
4+
parseJson
5+
} from '../lib/parse-json';
6+
7+
test('will pass all', t => {
8+
let result = parseJson(path.join(__dirname, 'reports', 'pass-three.json'));
9+
10+
let expected = {
11+
completed: true,
12+
msg: 'Task 3 Complete',
13+
taskPosition: 3
14+
};
15+
t.same(result, expected);
16+
});
17+
18+
test('will fail on first', t => {
19+
let result = parseJson(path.join(__dirname, 'reports', 'fail-at-one.json'));
20+
21+
let expected = {
22+
completed: false,
23+
msg: 'failing test',
24+
taskPosition: 0,
25+
timedOut: false
26+
};
27+
t.same(result, expected);
28+
});
29+
30+
test('will fail on first', t => {
31+
let result = parseJson(path.join(__dirname, 'reports', 'fail-at-three.json'));
32+
33+
let expected = {
34+
completed: false,
35+
msg: 'failing test',
36+
taskPosition: 2,
37+
timedOut: false
38+
};
39+
t.same(result, expected);
40+
});

test/reports/fail-at-one.json

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"report": {
3+
"environment": {
4+
"Python": "2.7.9",
5+
"Platform": "Darwin-15.4.0-x86_64-i386-64bit"
6+
},
7+
"tests": [{
8+
"name": "test/test_class.py::Test01Class::()::test_failing_test",
9+
"teardown": {
10+
"duration": 0.0001010894775390625,
11+
"outcome": "passed",
12+
"name": "teardown"
13+
},
14+
"setup": {
15+
"duration": 0.0004420280456542969,
16+
"outcome": "passed",
17+
"name": "setup"
18+
},
19+
"run_index": 1,
20+
"call": {
21+
"duration": 0.0007879734039306641,
22+
"outcome": "failed",
23+
"name": "call",
24+
"longrepr": "self = <test_class.Test01Class instance at 0x104e8e200>\n\n def test_failing_test(self):\n> assert a > 2\nE assert 1 > 2\n\ntest/test_class.py:8: AssertionError"
25+
},
26+
"duration": 0.0017731189727783203,
27+
"outcome": "failed"
28+
}, {
29+
"name": "test/test_class.py::Test01Class::()::test_passing_one",
30+
"teardown": {
31+
"duration": 0.00018095970153808594,
32+
"outcome": "passed",
33+
"name": "teardown"
34+
},
35+
"setup": {
36+
"duration": 0.011831045150756836,
37+
"outcome": "passed",
38+
"name": "setup"
39+
},
40+
"run_index": 0,
41+
"call": {
42+
"duration": 0.0004029273986816406,
43+
"outcome": "passed",
44+
"name": "call"
45+
},
46+
"duration": 0.0242459774017334,
47+
"outcome": "passed"
48+
}],
49+
"created_at": "2016-03-28 18:42:48.530587",
50+
"summary": {
51+
"duration": 2.2441980838775635,
52+
"failed": 1,
53+
"passed": 1,
54+
"num_tests": 2
55+
}
56+
}
57+
}

test/reports/fail-at-three.json

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
{
2+
"report": {
3+
"environment": {
4+
"Python": "2.7.9",
5+
"Platform": "Darwin-15.4.0-x86_64-i386-64bit"
6+
},
7+
"tests": [{
8+
"name": "test/test_class.py::Test02Class::()::test_passing_one",
9+
"teardown": {
10+
"duration": 6.4849853515625e-05,
11+
"outcome": "passed",
12+
"name": "teardown"
13+
},
14+
"setup": {
15+
"duration": 0.00022101402282714844,
16+
"outcome": "passed",
17+
"name": "setup"
18+
},
19+
"run_index": 2,
20+
"call": {
21+
"duration": 8.702278137207031e-05,
22+
"outcome": "passed",
23+
"name": "call"
24+
},
25+
"duration": 0.0005939006805419922,
26+
"outcome": "passed"
27+
}, {
28+
"name": "test/test_class.py::Test03Class::()::test_passing_one",
29+
"teardown": {
30+
"duration": 5.817413330078125e-05,
31+
"outcome": "passed",
32+
"name": "teardown"
33+
},
34+
"setup": {
35+
"duration": 0.00015997886657714844,
36+
"outcome": "passed",
37+
"name": "setup"
38+
},
39+
"run_index": 4,
40+
"call": {
41+
"duration": 8.702278137207031e-05,
42+
"outcome": "passed",
43+
"name": "call"
44+
},
45+
"duration": 0.00046515464782714844,
46+
"outcome": "passed"
47+
}, {
48+
"name": "test/test_class.py::Test01Class::()::test_passing_test",
49+
"teardown": {
50+
"duration": 0.00014400482177734375,
51+
"outcome": "passed",
52+
"name": "teardown"
53+
},
54+
"setup": {
55+
"duration": 0.00018906593322753906,
56+
"outcome": "passed",
57+
"name": "setup"
58+
},
59+
"run_index": 1,
60+
"call": {
61+
"duration": 0.0003800392150878906,
62+
"outcome": "passed",
63+
"name": "call"
64+
},
65+
"duration": 0.0009021759033203125,
66+
"outcome": "passed"
67+
}, {
68+
"name": "test/test_class.py::Test02Class::()::test_passing_test",
69+
"teardown": {
70+
"duration": 6.508827209472656e-05,
71+
"outcome": "passed",
72+
"name": "teardown"
73+
},
74+
"setup": {
75+
"duration": 0.00016498565673828125,
76+
"outcome": "passed",
77+
"name": "setup"
78+
},
79+
"run_index": 3,
80+
"call": {
81+
"duration": 8.487701416015625e-05,
82+
"outcome": "passed",
83+
"name": "call"
84+
},
85+
"duration": 0.0004799365997314453,
86+
"outcome": "passed"
87+
}, {
88+
"name": "test/test_class.py::Test01Class::()::test_passing_one",
89+
"teardown": {
90+
"duration": 0.00010085105895996094,
91+
"outcome": "passed",
92+
"name": "teardown"
93+
},
94+
"setup": {
95+
"duration": 0.016894817352294922,
96+
"outcome": "passed",
97+
"name": "setup"
98+
},
99+
"run_index": 0,
100+
"call": {
101+
"duration": 0.000247955322265625,
102+
"outcome": "passed",
103+
"name": "call"
104+
},
105+
"duration": 0.03413844108581543,
106+
"outcome": "passed"
107+
}, {
108+
"name": "test/test_class.py::Test03Class::()::test_failing_test",
109+
"teardown": {
110+
"duration": 0.0001220703125,
111+
"outcome": "passed",
112+
"name": "teardown"
113+
},
114+
"setup": {
115+
"duration": 0.00014901161193847656,
116+
"outcome": "passed",
117+
"name": "setup"
118+
},
119+
"run_index": 5,
120+
"call": {
121+
"duration": 0.0003058910369873047,
122+
"outcome": "failed",
123+
"name": "call",
124+
"longrepr": "self = <test_class.Test03Class instance at 0x1115c8b48>\n\n def test_failing_test(self):\n> assert a > 2\nE assert 1 > 2\n\ntest/test_class.py:22: AssertionError"
125+
},
126+
"duration": 0.0007259845733642578,
127+
"outcome": "failed"
128+
}],
129+
"created_at": "2016-03-28 18:43:18.267547",
130+
"summary": {
131+
"duration": 2.2427611351013184,
132+
"failed": 1,
133+
"passed": 5,
134+
"num_tests": 6
135+
}
136+
}
137+
}

0 commit comments

Comments
 (0)