| (function(){ |
| var env, spec, suite, reporter, runner; |
| function fakeSpec(suite, name) { |
| var s = new jasmine.Spec(env, suite, name); |
| suite.add(s); |
| return s; |
| } |
| function fakeSuite(name, parentSuite) { |
| var s = new jasmine.Suite(env, name, null, parentSuite || null); |
| if (parentSuite) { |
| parentSuite.add(s); |
| } |
| runner.add(s); |
| return s; |
| } |
| |
| // make sure reporter is set before calling this |
| function triggerSuiteEvents(suites) { |
| for (var i=0; i<suites.length; i++) { |
| var s = suites[i]; |
| for (var j=0; j<s.specs().length; j++) { |
| reporter.reportSpecStarting(s.specs()[j]); |
| reporter.reportSpecResults(s.specs()[j]); |
| } |
| reporter.reportSuiteResults(s); |
| } |
| } |
| |
| describe("JUnitXmlReporter", function(){ |
| |
| beforeEach(function(){ |
| env = new jasmine.Env(); |
| env.updateInterval = 0; |
| runner = new jasmine.Runner(env); |
| |
| suite = fakeSuite("ParentSuite"); |
| spec = fakeSpec(suite, "should be a dummy with invalid characters: & < > \" '"); |
| reporter = new jasmine.JUnitXmlReporter(); |
| }); |
| |
| describe("constructor", function(){ |
| it("should default path to an empty string", function(){ |
| expect(reporter.savePath).toEqual(""); |
| }); |
| it("should default consolidate to true", function(){ |
| expect(reporter.consolidate).toBe(true); |
| }); |
| it("should default useDotNotation to true", function(){ |
| expect(reporter.useDotNotation).toBe(true); |
| }); |
| |
| describe("file prepend", function(){ |
| it("should default output file prepend to \'TEST-\'", function () { |
| expect(reporter.filePrefix).toBe("TEST-"); |
| }); |
| it("should allow the user to override the default xml output file prepend", function () { |
| reporter = new jasmine.JUnitXmlReporter("", true, true, "alt-prepend-"); |
| expect(reporter.filePrefix).toBe("alt-prepend-"); |
| }); |
| it("should output the file with the modified prepend", function () { |
| |
| reporter = new jasmine.JUnitXmlReporter("", true, true, "alt-prepend-"); |
| |
| spyOn(reporter, "writeFile"); |
| |
| triggerSuiteEvents([suite]); |
| |
| reporter.reportRunnerResults(runner); |
| |
| expect(reporter.writeFile).toHaveBeenCalledWith(reporter.savePath, "alt-prepend-ParentSuite.xml", jasmine.any(String)); |
| }); |
| }); |
| }); |
| |
| describe("reportSpecStarting", function(){ |
| it("should add start time", function(){ |
| reporter.reportSpecStarting(spec); |
| expect(spec.startTime).not.toBeUndefined(); |
| }); |
| it("should add start time to the suite", function(){ |
| expect(suite.startTime).toBeUndefined(); |
| reporter.reportSpecStarting(spec); |
| expect(suite.startTime).not.toBeUndefined(); |
| }); |
| it("should not add start time to the suite if it already exists", function(){ |
| var a = new Date(); |
| suite.startTime = a; |
| reporter.reportSpecStarting(spec); |
| expect(suite.startTime).toBe(a); |
| }); |
| }); |
| |
| describe("reportSpecResults", function(){ |
| beforeEach(function(){ |
| reporter.reportSpecStarting(spec); |
| //spec.results_ = fakeResults(); |
| reporter.reportSpecResults(spec); |
| }); |
| |
| it("should compute duration", function(){ |
| expect(spec.duration).not.toBeUndefined(); |
| }); |
| |
| it("should generate <testcase> output", function(){ |
| expect(spec.output).not.toBeUndefined(); |
| expect(spec.output).toContain("<testcase"); |
| }); |
| |
| it("should escape bad xml characters in spec description", function() { |
| expect(spec.output).toContain("& &lt; &gt; &quot; &apos;"); |
| }); |
| |
| it("should generate valid xml <failure> output if test failed", function(){ |
| spec = fakeSpec(suite, "should be a dummy"); |
| reporter.reportSpecStarting(spec); |
| |
| var expectationResult = new jasmine.ExpectationResult({ |
| matcherName: "toEqual", passed: false, |
| message: "Expected 'a' to equal '&'.", |
| trace: { stack: "in test1.js:12\nin test2.js:123" } |
| }); |
| |
| var results = { |
| passed: function() { return false; }, |
| getItems: function() { return [expectationResult]; } |
| }; |
| |
| spyOn(spec, "results").andReturn(results); |
| |
| reporter.reportSpecResults(spec); |
| |
| expect(spec.output).toContain("<failure"); |
| expect(spec.output).toContain("type=\"" + expectationResult.type + "\""); |
| expect(spec.output).toContain("message=\"Expected &apos;a&apos; to equal &apos;&&apos;.\""); |
| expect(spec.output).toContain(">in test1.js:12\nin test2.js:123</failure>"); |
| }); |
| }); |
| |
| describe("reportSuiteResults", function(){ |
| beforeEach(function(){ |
| triggerSuiteEvents([suite]); |
| }); |
| it("should compute duration", function(){ |
| expect(suite.duration).not.toBeUndefined(); |
| }); |
| it("should generate startTime if no specs were executed", function(){ |
| suite = fakeSuite("just a fake suite"); |
| triggerSuiteEvents([suite]); |
| expect(suite.startTime).not.toBeUndefined(); |
| }); |
| it("should generate <testsuite> output", function(){ |
| expect(suite.output).not.toBeUndefined(); |
| expect(suite.output).toContain("<testsuite"); |
| }); |
| it("should contain <testcase> output from specs", function(){ |
| expect(suite.output).toContain("<testcase"); |
| }); |
| }); |
| |
| describe("reportRunnerResults", function(){ |
| var subSuite, subSubSuite, siblingSuite; |
| |
| beforeEach(function(){ |
| subSuite = fakeSuite("SubSuite", suite); |
| subSubSuite = fakeSuite("SubSubSuite", subSuite); |
| siblingSuite = fakeSuite("SiblingSuite With Invalid Chars & < > \" ' | : \\ /"); |
| var subSpec = fakeSpec(subSuite, "should be one level down"); |
| var subSubSpec = fakeSpec(subSubSuite, "should be two levels down"); |
| var siblingSpec = fakeSpec(siblingSuite, "should be a sibling of Parent"); |
| |
| spyOn(reporter, "writeFile"); |
| spyOn(reporter, "getNestedOutput").andCallThrough(); |
| triggerSuiteEvents([suite, subSuite, subSubSuite, siblingSuite]); |
| }); |
| |
| describe("general functionality", function() { |
| beforeEach(function() { |
| reporter.reportRunnerResults(runner); |
| }); |
| it("should remove invalid filename chars from the filename", function() { |
| expect(reporter.writeFile).toHaveBeenCalledWith(reporter.savePath, "TEST-SiblingSuiteWithInvalidChars.xml", jasmine.any(String)); |
| }); |
| it("should remove invalid xml chars from the classname", function() { |
| expect(siblingSuite.output).toContain("SiblingSuite With Invalid Chars & &lt; &gt; &quot; &apos; | : \\ /"); |
| }); |
| }); |
| |
| describe("consolidated is true and consolidatedAll is false", function(){ |
| beforeEach(function(){ |
| reporter.reportRunnerResults(runner); |
| }); |
| it("should write one file per parent suite", function(){ |
| expect(reporter.writeFile.callCount).toEqual(2); |
| }); |
| it("should consolidate suite output", function(){ |
| expect(reporter.getNestedOutput.callCount).toEqual(4); |
| }); |
| it("should wrap output in <testsuites>", function(){ |
| expect(reporter.writeFile.mostRecentCall.args[2]).toContain("<testsuites>"); |
| }); |
| it("should include xml header in every file", function(){ |
| for (var i = 0; i < reporter.writeFile.callCount; i++) { |
| expect(reporter.writeFile.argsForCall[i][2]).toContain("<?xml"); |
| } |
| }); |
| }); |
| |
| describe("consolidated is false and consolidatedAll is false", function(){ |
| beforeEach(function(){ |
| reporter.consolidate = false; |
| reporter.reportRunnerResults(runner); |
| }); |
| it("should write one file per suite", function(){ |
| expect(reporter.writeFile.callCount).toEqual(4); |
| }); |
| it("should not wrap results in <testsuites>", function(){ |
| expect(reporter.writeFile.mostRecentCall.args[2]).not.toContain("<testsuites>"); |
| }); |
| it("should include xml header in every file", function(){ |
| for (var i = 0; i < reporter.writeFile.callCount; i++) { |
| expect(reporter.writeFile.argsForCall[i][2]).toContain("<?xml"); |
| } |
| }); |
| }); |
| |
| describe("consolidatedAll is true", function(){ |
| beforeEach(function(){ |
| reporter.consolidateAll = true; |
| reporter.reportRunnerResults(runner); |
| }); |
| it("should write one file for all test suites", function(){ |
| expect(reporter.writeFile.callCount).toEqual(1); |
| }); |
| it("should consolidate suites output", function(){ |
| expect(reporter.getNestedOutput.callCount).toEqual(4); |
| }); |
| it("should wrap output in <testsuites>", function(){ |
| expect(reporter.writeFile.mostRecentCall.args[2]).toContain("<testsuites>"); |
| }); |
| it("should include xml header in the file", function(){ |
| expect(reporter.writeFile.argsForCall[0][2]).toContain("<?xml"); |
| }); |
| }); |
| describe("dot notation is true", function(){ |
| beforeEach(function(){ |
| reporter.reportRunnerResults(runner); |
| }); |
| it("should separate descriptions with dot notation", function(){ |
| expect(subSubSuite.output).toContain('classname="ParentSuite.SubSuite.SubSubSuite"'); |
| }); |
| }); |
| |
| describe("dot notation is false", function(){ |
| beforeEach(function(){ |
| reporter.useDotNotation = false; |
| triggerSuiteEvents([suite, subSuite, subSubSuite, siblingSuite]); |
| reporter.reportRunnerResults(runner); |
| }); |
| it("should separate descriptions with whitespace", function(){ |
| expect(subSubSuite.output).toContain('classname="ParentSuite SubSuite SubSubSuite"'); |
| }); |
| }); |
| }); |
| }); |
| })(); |
| |