blob: 19cdddde1c32f8934f81319864f02ceb6d0e9123 [file] [log] [blame]
var jasmineNode = require(__dirname + "/../lib/jasmine-node/reporter").jasmineNode;
describe('TerminalReporter', function() {
beforeEach(function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
});
describe("initialize", function() {
it('initializes print_ from config', function() {
var config = { print: true };
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.print_).toBeTruthy();
});
it('initializes color_ from config', function() {
var config = { color: true }
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.color_).toEqual(jasmineNode.TerminalReporter.prototype.ANSIColors);
});
it('initializes includeStackTrace_ from config', function () {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.includeStackTrace_).toBeTruthy();
});
it('sets the started_ flag to false', function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.started_).toBeFalsy();
});
it('sets the finished_ flag to false', function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.finished_).toBeFalsy();
});
it('initializes the suites_ array', function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.suites_.length).toEqual(0);
});
it('initializes the specResults_ to an Object', function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.specResults_).toBeDefined();
});
it('initializes the failures_ array', function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.failures_.length).toEqual(0);
});
it('sets the callback_ property to false by default', function() {
var config = {}
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.callback_).toEqual(false)
});
it('sets the callback_ property to onComplete if supplied', function() {
var foo = function() { }
var config = { onComplete: foo }
this.reporter = new jasmineNode.TerminalReporter(config);
expect(this.reporter.callback_).toBe(foo)
});
});
describe('when the report runner starts', function() {
beforeEach(function() {
this.spy = spyOn(this.reporter, 'printLine_');
var runner = {
topLevelSuites: function() {
var suites = [];
var suite = { id: 25 };
suites.push(suite);
return suites;
}
};
this.reporter.reportRunnerStarting(runner);
});
it('sets the started_ field to true', function() {
expect(this.reporter.started_).toBeTruthy();
});
it('sets the startedAt field', function() {
// instanceof does not work cross-context (such as when run with requirejs)
var ts = Object.prototype.toString;
expect(ts.call(this.reporter.startedAt)).toBe(ts.call(new Date()));
});
it('buildes the suites_ collection', function() {
expect(this.reporter.suites_.length).toEqual(1);
expect(this.reporter.suites_[0].id).toEqual(25);
});
});
describe('the summarize_ creates suite and spec tree', function() {
beforeEach(function() {
this.spec = {
id: 1,
description: 'the spec',
isSuite: false
}
});
it('creates a summary object from spec', function() {
var result = this.reporter.summarize_(this.spec);
expect(result.id).toEqual(1);
expect(result.name).toEqual('the spec');
expect(result.type).toEqual('spec');
expect(result.children.length).toEqual(0);
});
it('creates a summary object from suite with 1 spec', function() {
var env = { nextSuiteId: false }
var suite = new jasmine.Suite(env, 'suite name', undefined, undefined);
suite.description = 'the suite';
suite.parentSuite = null;
suite.children_.push(this.spec);
var result = this.reporter.summarize_(suite);
expect(result.name).toEqual('the suite');
expect(result.type).toEqual('suite');
expect(result.children.length).toEqual(1);
var suiteChildSpec = result.children[0];
expect(suiteChildSpec.id).toEqual(1);
});
});
describe('reportRunnerResults', function() {
beforeEach(function() {
this.printLineSpy = spyOn(this.reporter, 'printLine_');
});
it('generates the report', function() {
var failuresSpy = spyOn(this.reporter, 'reportFailures_');
var printRunnerResultsSpy = spyOn(this.reporter, 'printRunnerResults_').
andReturn('this is the runner result');
var callbackSpy = spyOn(this.reporter, 'callback_');
var runner = {
results: function() {
var result = { failedCount: 0 };
return result;
},
specs: function() { return []; }
};
this.reporter.startedAt = new Date();
this.reporter.reportRunnerResults(runner);
expect(failuresSpy).toHaveBeenCalled();
expect(this.printLineSpy).toHaveBeenCalled();
expect(callbackSpy).toHaveBeenCalled();
});
});
describe('reportSpecResults', function() {
beforeEach(function() {
this.printSpy = spyOn(this.reporter, 'print_');
this.spec = {
id: 1,
description: 'the spec',
isSuite: false,
results: function() {
var result = {
passed: function() { return true; }
}
return result;
}
}
});
it('prints a \'.\' for pass', function() {
this.reporter.reportSpecResults(this.spec);
expect(this.printSpy).toHaveBeenCalledWith('.');
});
it('prints an \'F\' for failure', function() {
var addFailureToFailuresSpy = spyOn(this.reporter, 'addFailureToFailures_');
var results = function() {
var result = {
passed: function() { return false; }
}
return result;
}
this.spec.results = results;
this.reporter.reportSpecResults(this.spec);
expect(this.printSpy).toHaveBeenCalledWith('F');
expect(addFailureToFailuresSpy).toHaveBeenCalled();
});
});
describe('addFailureToFailures', function() {
it('adds message and stackTrace to failures_', function() {
var spec = {
suite: {
getFullName: function() { return 'Suite name' }
},
description: 'the spec',
results: function() {
var result = {
items_: function() {
var theItems = new Array();
var item = {
passed_: false,
message: 'the message',
trace: {
stack: 'the stack'
}
}
theItems.push(item);
return theItems;
}.call()
};
return result;
}
};
this.reporter.addFailureToFailures_(spec);
var failures = this.reporter.failures_;
expect(failures.length).toEqual(1);
var failure = failures[0];
expect(failure.spec).toEqual('Suite name the spec');
expect(failure.message).toEqual('the message');
expect(failure.stackTrace).toEqual('the stack');
});
});
describe('prints the runner results', function() {
beforeEach(function() {
this.runner = {
results: function() {
var _results = {
totalCount: 23,
failedCount: 52
};
return _results;
},
specs: function() {
var _specs = new Array();
spec = {
results: function() {
var _results = {
skipped: false
}
return _results;
}
};
_specs.push(spec);
return _specs;
}
};
});
it('uses the specs\'s length, totalCount and failedCount', function() {
var message = this.reporter.printRunnerResults_(this.runner);
expect(message).toEqual('1 test, 23 assertions, 52 failures, 0 skipped\n');
});
});
describe('reports failures', function() {
beforeEach(function() {
this.printSpy = spyOn(this.reporter, 'print_');
this.printLineSpy = spyOn(this.reporter, 'printLine_');
});
it('does not report anything when there are no failures', function() {
this.reporter.failures_ = new Array();
this.reporter.reportFailures_();
expect(this.printLineSpy).not.toHaveBeenCalled();
});
it('prints the failures', function() {
var failure = {
spec: 'the spec',
message: 'the message',
stackTrace: 'the stackTrace'
}
this.reporter.failures_ = new Array();
this.reporter.failures_.push(failure);
this.reporter.reportFailures_();
var generatedOutput =
[ [ '\n' ],
[ '\n' ],
[ ' 1) the spec' ],
[ ' Message:' ],
[ ' the message' ],
[ ' Stacktrace:' ] ];
expect(this.printLineSpy).toHaveBeenCalled();
expect(this.printLineSpy.argsForCall).toEqual(generatedOutput);
expect(this.printSpy).toHaveBeenCalled();
expect(this.printSpy.argsForCall[0]).toEqual(['Failures:']);
expect(this.printSpy.argsForCall[1]).toEqual([' the stackTrace']);
});
it('prints the failures without a Stacktrace', function () {
var config = { includeStackTrace: false };
this.reporter = new jasmineNode.TerminalReporter(config);
this.printSpy = spyOn(this.reporter, 'print_');
this.printLineSpy = spyOn(this.reporter, 'printLine_');
var failure = {
spec: 'the spec',
message: 'the message',
stackTrace: 'the stackTrace'
}
this.reporter.failures_ = new Array();
this.reporter.failures_.push(failure);
this.reporter.reportFailures_();
var generatedOutput =
[ [ '\n' ],
[ '\n' ],
[ ' 1) the spec' ],
[ ' Message:' ],
[ ' the message' ] ];
expect(this.printLineSpy).toHaveBeenCalled();
expect(this.printLineSpy.argsForCall).toEqual(generatedOutput);
expect(this.printSpy).toHaveBeenCalled();
expect(this.printSpy.argsForCall[0]).toEqual(['Failures:']);
expect(this.printSpy.argsForCall[1]).toBeUndefined();
});
});
});
describe('TerminalVerboseReporter', function() {
beforeEach(function() {
var config = {}
this.verboseReporter = new jasmineNode.TerminalVerboseReporter(config);
this.addFailureToFailuresSpy = spyOn(this.verboseReporter, 'addFailureToFailures_');
this.spec = {
id: 23,
results: function() {
return {
failedCount: 1,
getItems: function() {
return ["this is the message"];
}
}
}
};
});
describe('#reportSpecResults', function() {
it('adds the spec to the failures_', function() {
this.verboseReporter.reportSpecResults(this.spec);
expect(this.addFailureToFailuresSpy).toHaveBeenCalledWith(this.spec);
});
it('adds a new object to the specResults_', function() {
this.verboseReporter.reportSpecResults(this.spec);
expect(this.verboseReporter.specResults_[23].messages).toEqual(['this is the message']);
expect(this.verboseReporter.specResults_[23].result).toEqual('failed');
});
});
describe('#buildMessagesFromResults_', function() {
beforeEach(function() {
this.suite = {
id: 17,
type: 'suite',
name: 'a describe block',
suiteNestingLevel: 0,
children: [],
getFullName: function() { return "A spec"; },
};
this.spec = {
id: 23,
type: 'spec',
name: 'a spec block',
children: []
};
this.verboseReporter.specResults_['23'] = {
result: 'passed',
runtime: 200
};
this.verboseReporter.suiteResults_['17'] = {
runtime: 500
};
});
it('does not build anything when the results collection is empty', function() {
var results = [],
messages = [];
this.verboseReporter.buildMessagesFromResults_(messages, results);
expect(messages.length).toEqual(0);
});
it('adds a single suite to the messages', function() {
var results = [],
messages = [];
results.push(this.suite);
this.verboseReporter.buildMessagesFromResults_(messages, results);
expect(messages.length).toEqual(2);
expect(messages[0]).toEqual('');
expect(messages[1]).toEqual('a describe block - 500 ms');
});
it('adds a single spec with success to the messages', function() {
var results = [],
messages = [];
this.passSpy = spyOn(this.verboseReporter.color_, 'pass');
results.push(this.spec);
this.verboseReporter.buildMessagesFromResults_(messages, results);
expect(this.passSpy).toHaveBeenCalled();
expect(messages.length).toEqual(1);
expect(messages[0]).toEqual('a spec block - 200 ms');
});
it('adds a single spec with failure to the messages', function() {
var results = [],
messages = [];
this.verboseReporter.specResults_['23'].result = 'failed';
this.passSpy = spyOn(this.verboseReporter.color_, 'pass');
this.failSpy = spyOn(this.verboseReporter.color_, 'fail');
results.push(this.spec);
this.verboseReporter.buildMessagesFromResults_(messages, results);
expect(this.failSpy).toHaveBeenCalled();
expect(this.passSpy).not.toHaveBeenCalled();
});
it('adds a suite, a suite and a single spec with success to the messages', function() {
var results = [],
messages = [];
var subSuite = new Object();
subSuite.id = '29';
subSuite.type = 'suite';
subSuite.name = 'a sub describe block';
subSuite.suiteNestingLevel = 1;
subSuite.children = [];
subSuite.children.push(this.spec);
this.suite.children.push(subSuite);
results.push(this.suite);
this.verboseReporter.suiteResults_['29'] = {
runtime: 350
};
this.verboseReporter.buildMessagesFromResults_(messages, results);
expect(messages.length).toEqual(5);
expect(messages[0]).toEqual('');
expect(messages[1]).toEqual('a describe block - 500 ms');
expect(messages[2]).toEqual('');
expect(messages[3]).toEqual(' a sub describe block - 350 ms');
expect(messages[4]).toEqual(' a spec block - 200 ms');
});
});
});