Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for base64 inline images in html report #38

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@ If the directory doesn't exist, it will be created automatically or otherwise cl

Default folder: <code>screenshots</code>

### Inline images (optional)

Enabling inline images will create the html image tags with base64 encoding inline, removing the need to have a separate screenshot directory

<pre><code>jasmine.getEnv().addReporter(new Jasmine2HtmlReporter({
savePath: './test/reports/',
inlineImages: true
}));</code></pre>

Default is <code>false</code>

### Take screenshots (optional)

When this option is enabled, reporter will create screenshots for specs.
Expand Down
93 changes: 58 additions & 35 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ var fs = require('fs'),
mkdirp = require('mkdirp'),
_ = require('lodash'),
path = require('path'),
hat = require('hat');
hat = require('hat'),
q = require('q');

require('string.prototype.startswith');

Expand Down Expand Up @@ -71,6 +72,7 @@ function rmdir(dir) {
function Jasmine2HTMLReporter(options) {

var self = this;
var deferred;

self.started = false;
self.finished = false;
Expand All @@ -79,7 +81,8 @@ function Jasmine2HTMLReporter(options) {
self.takeScreenshots = options.takeScreenshots === UNDEFINED ? true : options.takeScreenshots;
self.savePath = options.savePath || '';
self.takeScreenshotsOnlyOnFailures = options.takeScreenshotsOnlyOnFailures === UNDEFINED ? false : options.takeScreenshotsOnlyOnFailures;
self.screenshotsFolder = (options.screenshotsFolder || 'screenshots').replace(/^\//, '') + '/';
self.inlineImages = options.inlineImages || '';
self.screenshotsFolder = options.inlineImages ? '' : (options.screenshotsFolder || 'screenshots').replace(/^\//, '') + '/';
self.useDotNotation = options.useDotNotation === UNDEFINED ? true : options.useDotNotation;
self.fixedScreenshotName = options.fixedScreenshotName === UNDEFINED ? false : options.fixedScreenshotName;
self.consolidate = options.consolidate === UNDEFINED ? true : options.consolidate;
Expand Down Expand Up @@ -154,27 +157,33 @@ function Jasmine2HTMLReporter(options) {
if ((self.takeScreenshots && !self.takeScreenshotsOnlyOnFailures) ||
(self.takeScreenshots && self.takeScreenshotsOnlyOnFailures && isFailed(spec))) {
if (!self.fixedScreenshotName)
spec.screenshot = hat() + '.png';
spec.screenshot = hat() + '.png';
else
spec.screenshot = sanitizeFilename(spec.description) + '.png';


deferred = q.defer();
browser.takeScreenshot().then(function (png) {
browser.getCapabilities().then(function (capabilities) {
var screenshotPath;


//Folder structure and filename
screenshotPath = path.join(self.savePath + self.screenshotsFolder, spec.screenshot);

mkdirp(path.dirname(screenshotPath), function (err) {
if (err) {
throw new Error('Could not create directory for ' + screenshotPath);
}
writeScreenshot(png, screenshotPath);
});
if(self.inlineImages) {
spec.screenshot = 'data:image/png;base64,' + png;
} else {
var screenshotPath;


//Folder structure and filename
screenshotPath = path.join(self.savePath + self.screenshotsFolder, spec.screenshot);

mkdirp(path.dirname(screenshotPath), function (err) {
if (err) {
throw new Error('Could not create directory for ' + screenshotPath);
}
writeScreenshot(png, screenshotPath);
});
}
deferred.resolve(true);
});
});
}
}


};
Expand All @@ -188,24 +197,26 @@ function Jasmine2HTMLReporter(options) {
currentSuite = suite._parent;
};
self.jasmineDone = function() {
if (currentSuite) {
// focused spec (fit) -- suiteDone was never called
self.suiteDone(fakeFocusedSuite);
}

var output = '';
for (var i = 0; i < suites.length; i++) {
output += self.getOrWriteNestedOutput(suites[i]);
}
// if we have anything to write here, write out the consolidated file
if (output) {
wrapOutputAndWriteFile(self.filePrefix, output);
}
//log("Specs skipped but not reported (entire suite skipped or targeted to specific specs)", totalSpecsDefined - totalSpecsExecuted + totalSpecsDisabled);
waitForPromise(function() {
if (currentSuite) {
// focused spec (fit) -- suiteDone was never called
self.suiteDone(fakeFocusedSuite);
}

var output = '';
for (var i = 0; i < suites.length; i++) {
output += self.getOrWriteNestedOutput(suites[i]);
}
// if we have anything to write here, write out the consolidated file
if (output) {
wrapOutputAndWriteFile(self.filePrefix, output);
}
//log("Specs skipped but not reported (entire suite skipped or targeted to specific specs)", totalSpecsDefined - totalSpecsExecuted + totalSpecsDisabled);

self.finished = true;
// this is so phantomjs-testrunner.js can tell if we're done executing
exportObject.endTime = new Date();
self.finished = true;
// this is so phantomjs-testrunner.js can tell if we're done executing
exportObject.endTime = new Date();
});
};

self.getOrWriteNestedOutput = function(suite) {
Expand Down Expand Up @@ -314,6 +325,18 @@ function Jasmine2HTMLReporter(options) {
}
return html;
}

function waitForPromise(callback) {
// register callback on the queue to be called after completion of current event loop
// this will allow the screenshot promise to resolve
setImmediate(function() {
if(!deferred || deferred.promise.isFulfilled()) {
callback();
} else {
waitForPromise(callback);
}
});
}

self.writeFile = function(filename, text) {
var errors = [];
Expand Down Expand Up @@ -360,7 +383,7 @@ function Jasmine2HTMLReporter(options) {
var suffix = '\n</section></body></html>';
function wrapOutputAndWriteFile(filename, text) {
if (filename.substr(-5) !== '.html') { filename += '.html'; }
self.writeFile(filename, (prefix + text + suffix));
self.writeFile(filename, (prefix + text + suffix));
}

return this;
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"hat": "0.0.3",
"lodash": "^4.0.0",
"mkdirp": "^0.5.0",
"q": "^1.4.1",
"string.prototype.startswith": "^0.2.0"
},
"devDependencies": {
Expand Down