Skip to content

Commit 3057098

Browse files
committed
Extract summary logger from progress formatter (#59, #63)
Feature run summaries can now be reused among formatters.
1 parent 837c021 commit 3057098

File tree

5 files changed

+1291
-1025
lines changed

5 files changed

+1291
-1025
lines changed

lib/cucumber/listener.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ Listener.EVENT_HANDLER_NAME_SUFFIX = 'Event';
3535

3636
Listener.ProgressFormatter = require('./listener/progress_formatter');
3737
Listener.StatsJournal = require('./listener/stats_journal');
38+
Listener.SummaryLogger = require('./listener/summary_logger');
3839
module.exports = Listener;

lib/cucumber/listener/progress_formatter.js

Lines changed: 9 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,18 @@ var ProgressFormatter = function(options) {
22
var Cucumber = require('../../cucumber');
33

44
var logs = "";
5-
var failedScenarioLogBuffer = "";
6-
var undefinedStepLogBuffer = "";
7-
var failedStepResults = Cucumber.Type.Collection();
8-
var statsJournal = Cucumber.Listener.StatsJournal();
95

106
if (!options)
117
options = {};
128
if (options['logToConsole'] == undefined)
139
options['logToConsole'] = true;
1410

15-
var self = Cucumber.Listener();
11+
var self = Cucumber.Listener();
12+
var summaryLogger = Cucumber.Listener.SummaryLogger();
1613

1714
var parentHear = self.hear;
18-
1915
self.hear = function hear(event, callback) {
20-
statsJournal.hear(event, function () {
16+
summaryLogger.hear(event, function () {
2117
parentHear(event, callback);
2218
});
2319
};
@@ -43,9 +39,9 @@ var ProgressFormatter = function(options) {
4339
else if (stepResult.isSkipped())
4440
self.handleSkippedStepResult();
4541
else if (stepResult.isUndefined())
46-
self.handleUndefinedStepResult(stepResult);
42+
self.handleUndefinedStepResult();
4743
else
48-
self.handleFailedStepResult(stepResult);
44+
self.handleFailedStepResult();
4945
callback();
5046
};
5147

@@ -61,145 +57,20 @@ var ProgressFormatter = function(options) {
6157
self.log(ProgressFormatter.SKIPPED_STEP_CHARACTER);
6258
};
6359

64-
self.handleUndefinedStepResult = function handleUndefinedStepResult(stepResult) {
65-
var step = stepResult.getStep();
66-
self.storeUndefinedStep(step);
60+
self.handleUndefinedStepResult = function handleUndefinedStepResult() {
6761
self.log(ProgressFormatter.UNDEFINED_STEP_CHARACTER);
6862
};
6963

70-
self.handleFailedStepResult = function handleFailedStepResult(stepResult) {
71-
self.storeFailedStepResult(stepResult);
64+
self.handleFailedStepResult = function handleFailedStepResult() {
7265
self.log(ProgressFormatter.FAILED_STEP_CHARACTER);
7366
};
7467

7568
self.handleAfterFeaturesEvent = function handleAfterFeaturesEvent(event, callback) {
76-
self.logSummary();
69+
var summaryLogs = summaryLogger.getLogs();
70+
self.log(summaryLogs);
7771
callback();
7872
};
7973

80-
self.handleAfterScenarioEvent = function handleAfterScenarioEvent(event, callback) {
81-
if (statsJournal.isCurrentScenarioFailing()) {
82-
var scenario = event.getPayloadItem('scenario');
83-
self.storeFailedScenario(scenario);
84-
}
85-
callback();
86-
};
87-
88-
self.storeFailedStepResult = function storeFailedStepResult(failedStepResult) {
89-
failedStepResults.add(failedStepResult);
90-
};
91-
92-
self.storeFailedScenario = function storeFailedScenario(failedScenario) {
93-
var name = failedScenario.getName();
94-
var line = failedScenario.getLine();
95-
self.appendStringToFailedScenarioLogBuffer(":" + line + " # Scenario: " + name);
96-
};
97-
98-
self.storeUndefinedStep = function storeUndefinedStep(step) {
99-
var snippetBuilder = Cucumber.SupportCode.StepDefinitionSnippetBuilder(step);
100-
var snippet = snippetBuilder.buildSnippet();
101-
self.appendStringToUndefinedStepLogBuffer(snippet);
102-
};
103-
104-
self.appendStringToFailedScenarioLogBuffer = function appendStringToFailedScenarioLogBuffer(string) {
105-
failedScenarioLogBuffer += string + "\n";
106-
};
107-
108-
self.appendStringToUndefinedStepLogBuffer = function appendStringToUndefinedStepLogBuffer(string) {
109-
if (undefinedStepLogBuffer.indexOf(string) == -1)
110-
undefinedStepLogBuffer += string + "\n";
111-
};
112-
113-
self.getFailedScenarioLogBuffer = function getFailedScenarioLogBuffer() {
114-
return failedScenarioLogBuffer;
115-
};
116-
117-
self.getUndefinedStepLogBuffer = function getUndefinedStepLogBuffer() {
118-
return undefinedStepLogBuffer;
119-
};
120-
121-
self.logSummary = function logSummary() {
122-
self.log("\n\n");
123-
if (statsJournal.witnessedAnyFailedStep())
124-
self.logFailedStepResults();
125-
self.logScenariosSummary();
126-
self.logStepsSummary();
127-
if (statsJournal.witnessedAnyUndefinedStep())
128-
self.logUndefinedStepSnippets();
129-
};
130-
131-
self.logFailedStepResults = function logFailedStepResults() {
132-
self.log("(::) failed steps (::)\n\n");
133-
failedStepResults.syncForEach(function(stepResult) {
134-
self.logFailedStepResult(stepResult);
135-
});
136-
self.log("Failing scenarios:\n");
137-
var failedScenarios = self.getFailedScenarioLogBuffer();
138-
self.log(failedScenarios);
139-
self.log("\n");
140-
};
141-
142-
self.logFailedStepResult = function logFailedStepResult(stepResult) {
143-
var failureMessage = stepResult.getFailureException();
144-
self.log(failureMessage.stack || failureMessage);
145-
self.log("\n\n");
146-
};
147-
148-
self.logScenariosSummary = function logScenariosSummary() {
149-
var scenarioCount = statsJournal.getScenarioCount();
150-
var passedScenarioCount = statsJournal.getPassedScenarioCount();
151-
var undefinedScenarioCount = statsJournal.getUndefinedScenarioCount();
152-
var pendingScenarioCount = statsJournal.getPendingScenarioCount();
153-
var failedScenarioCount = statsJournal.getFailedScenarioCount();
154-
var details = [];
155-
156-
self.log(scenarioCount + " scenario" + (scenarioCount != 1 ? "s" : ""));
157-
if (scenarioCount > 0 ) {
158-
if (failedScenarioCount > 0)
159-
details.push(failedScenarioCount + " failed");
160-
if (undefinedScenarioCount > 0)
161-
details.push(undefinedScenarioCount + " undefined");
162-
if (pendingScenarioCount > 0)
163-
details.push(pendingScenarioCount + " pending");
164-
if (passedScenarioCount > 0)
165-
details.push(passedScenarioCount + " passed");
166-
self.log(" (" + details.join(', ') + ")");
167-
}
168-
self.log("\n");
169-
};
170-
171-
self.logStepsSummary = function logStepsSummary() {
172-
var stepCount = statsJournal.getStepCount();
173-
var passedStepCount = statsJournal.getPassedStepCount();
174-
var undefinedStepCount = statsJournal.getUndefinedStepCount();
175-
var skippedStepCount = statsJournal.getSkippedStepCount();
176-
var pendingStepCount = statsJournal.getPendingStepCount();
177-
var failedStepCount = statsJournal.getFailedStepCount();
178-
var details = [];
179-
180-
self.log(stepCount + " step" + (stepCount != 1 ? "s" : ""));
181-
if (stepCount > 0) {
182-
if (failedStepCount > 0)
183-
details.push(failedStepCount + " failed");
184-
if (undefinedStepCount > 0)
185-
details.push(undefinedStepCount + " undefined");
186-
if (pendingStepCount > 0)
187-
details.push(pendingStepCount + " pending");
188-
if (skippedStepCount > 0)
189-
details.push(skippedStepCount + " skipped");
190-
if (passedStepCount > 0)
191-
details.push(passedStepCount + " passed");
192-
self.log(" (" + details.join(', ') + ")");
193-
}
194-
self.log("\n");
195-
};
196-
197-
self.logUndefinedStepSnippets = function logUndefinedStepSnippets() {
198-
var undefinedStepLogBuffer = self.getUndefinedStepLogBuffer();
199-
self.log("\nYou can implement step definitions for undefined steps with these snippets:\n\n");
200-
self.log(undefinedStepLogBuffer);
201-
};
202-
20374
return self;
20475
};
20576
ProgressFormatter.PASSED_STEP_CHARACTER = '.';
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
var SummaryLogger = function () {
2+
var Cucumber = require('../../cucumber');
3+
4+
var logs = "";
5+
var failedScenarioLogBuffer = "";
6+
var undefinedStepLogBuffer = "";
7+
var failedStepResults = Cucumber.Type.Collection();
8+
var statsJournal = Cucumber.Listener.StatsJournal();
9+
10+
var self = Cucumber.Listener();
11+
12+
var parentHear = self.hear;
13+
self.hear = function hear(event, callback) {
14+
statsJournal.hear(event, function () {
15+
parentHear(event, callback);
16+
});
17+
};
18+
19+
self.log = function log(string) {
20+
logs += string;
21+
};
22+
23+
self.getLogs = function getLogs() {
24+
return logs;
25+
};
26+
27+
self.handleStepResultEvent = function handleStepResult(event, callback) {
28+
var stepResult = event.getPayloadItem('stepResult');
29+
if (stepResult.isUndefined()) {
30+
self.handleUndefinedStepResult(stepResult);
31+
} else if (stepResult.isFailed()) {
32+
self.handleFailedStepResult(stepResult);
33+
}
34+
callback();
35+
};
36+
37+
self.handleUndefinedStepResult = function handleUndefinedStepResult(stepResult) {
38+
var step = stepResult.getStep();
39+
self.storeUndefinedStep(step);
40+
};
41+
42+
self.handleFailedStepResult = function handleFailedStepResult(stepResult) {
43+
self.storeFailedStepResult(stepResult);
44+
};
45+
46+
self.handleAfterScenarioEvent = function handleAfterScenarioEvent(event, callback) {
47+
if (statsJournal.isCurrentScenarioFailing()) {
48+
var scenario = event.getPayloadItem('scenario');
49+
self.storeFailedScenario(scenario);
50+
}
51+
callback();
52+
};
53+
54+
self.handleAfterFeaturesEvent = function handleAfterFeaturesEvent(event, callback) {
55+
self.logSummary();
56+
callback();
57+
};
58+
59+
self.storeFailedStepResult = function storeFailedStepResult(failedStepResult) {
60+
failedStepResults.add(failedStepResult);
61+
};
62+
63+
self.storeFailedScenario = function storeFailedScenario(failedScenario) {
64+
var name = failedScenario.getName();
65+
var line = failedScenario.getLine();
66+
self.appendStringToFailedScenarioLogBuffer(":" + line + " # Scenario: " + name);
67+
};
68+
69+
self.storeUndefinedStep = function storeUndefinedStep(step) {
70+
var snippetBuilder = Cucumber.SupportCode.StepDefinitionSnippetBuilder(step);
71+
var snippet = snippetBuilder.buildSnippet();
72+
self.appendStringToUndefinedStepLogBuffer(snippet);
73+
};
74+
75+
self.appendStringToFailedScenarioLogBuffer = function appendStringToFailedScenarioLogBuffer(string) {
76+
failedScenarioLogBuffer += string + "\n";
77+
};
78+
79+
self.appendStringToUndefinedStepLogBuffer = function appendStringToUndefinedStepLogBuffer(string) {
80+
if (undefinedStepLogBuffer.indexOf(string) == -1)
81+
undefinedStepLogBuffer += string + "\n";
82+
};
83+
84+
self.getFailedScenarioLogBuffer = function getFailedScenarioLogBuffer() {
85+
return failedScenarioLogBuffer;
86+
};
87+
88+
self.getUndefinedStepLogBuffer = function getUndefinedStepLogBuffer() {
89+
return undefinedStepLogBuffer;
90+
};
91+
92+
self.logSummary = function logSummary() {
93+
self.log("\n\n");
94+
if (statsJournal.witnessedAnyFailedStep())
95+
self.logFailedStepResults();
96+
self.logScenariosSummary();
97+
self.logStepsSummary();
98+
if (statsJournal.witnessedAnyUndefinedStep())
99+
self.logUndefinedStepSnippets();
100+
};
101+
102+
self.logFailedStepResults = function logFailedStepResults() {
103+
self.log("(::) failed steps (::)\n\n");
104+
failedStepResults.syncForEach(function(stepResult) {
105+
self.logFailedStepResult(stepResult);
106+
});
107+
self.log("Failing scenarios:\n");
108+
var failedScenarios = self.getFailedScenarioLogBuffer();
109+
self.log(failedScenarios);
110+
self.log("\n");
111+
};
112+
113+
self.logFailedStepResult = function logFailedStepResult(stepResult) {
114+
var failureMessage = stepResult.getFailureException();
115+
self.log(failureMessage.stack || failureMessage);
116+
self.log("\n\n");
117+
};
118+
119+
self.logScenariosSummary = function logScenariosSummary() {
120+
var scenarioCount = statsJournal.getScenarioCount();
121+
var passedScenarioCount = statsJournal.getPassedScenarioCount();
122+
var undefinedScenarioCount = statsJournal.getUndefinedScenarioCount();
123+
var pendingScenarioCount = statsJournal.getPendingScenarioCount();
124+
var failedScenarioCount = statsJournal.getFailedScenarioCount();
125+
var details = [];
126+
127+
self.log(scenarioCount + " scenario" + (scenarioCount != 1 ? "s" : ""));
128+
if (scenarioCount > 0 ) {
129+
if (failedScenarioCount > 0)
130+
details.push(failedScenarioCount + " failed");
131+
if (undefinedScenarioCount > 0)
132+
details.push(undefinedScenarioCount + " undefined");
133+
if (pendingScenarioCount > 0)
134+
details.push(pendingScenarioCount + " pending");
135+
if (passedScenarioCount > 0)
136+
details.push(passedScenarioCount + " passed");
137+
self.log(" (" + details.join(', ') + ")");
138+
}
139+
self.log("\n");
140+
};
141+
142+
self.logStepsSummary = function logStepsSummary() {
143+
var stepCount = statsJournal.getStepCount();
144+
var passedStepCount = statsJournal.getPassedStepCount();
145+
var undefinedStepCount = statsJournal.getUndefinedStepCount();
146+
var skippedStepCount = statsJournal.getSkippedStepCount();
147+
var pendingStepCount = statsJournal.getPendingStepCount();
148+
var failedStepCount = statsJournal.getFailedStepCount();
149+
var details = [];
150+
151+
self.log(stepCount + " step" + (stepCount != 1 ? "s" : ""));
152+
if (stepCount > 0) {
153+
if (failedStepCount > 0)
154+
details.push(failedStepCount + " failed");
155+
if (undefinedStepCount > 0)
156+
details.push(undefinedStepCount + " undefined");
157+
if (pendingStepCount > 0)
158+
details.push(pendingStepCount + " pending");
159+
if (skippedStepCount > 0)
160+
details.push(skippedStepCount + " skipped");
161+
if (passedStepCount > 0)
162+
details.push(passedStepCount + " passed");
163+
self.log(" (" + details.join(', ') + ")");
164+
}
165+
self.log("\n");
166+
};
167+
168+
self.logUndefinedStepSnippets = function logUndefinedStepSnippets() {
169+
var undefinedStepLogBuffer = self.getUndefinedStepLogBuffer();
170+
self.log("\nYou can implement step definitions for undefined steps with these snippets:\n\n");
171+
self.log(undefinedStepLogBuffer);
172+
};
173+
174+
return self;
175+
};
176+
module.exports = SummaryLogger;

0 commit comments

Comments
 (0)