resultsDatastore.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. var fs = require('fs');
  2. var rimraf = require('rimraf');
  3. var path = require('path');
  4. var Q = require('q');
  5. var debug = require('debug')('ylt:resultsDatastore');
  6. function ResultsDatastore() {
  7. 'use strict';
  8. var resultFileName = 'results.json';
  9. var resultScreenshotName = 'screenshot.jpg';
  10. var resultsFolderName = 'results';
  11. var resultsDir = path.join(__dirname, '..', '..', '..', resultsFolderName);
  12. this.saveResult = function(testResults) {
  13. return createResultFolder(testResults.runId)
  14. .then(function() {
  15. return saveScreenshotIfExists(testResults);
  16. })
  17. .then(function() {
  18. debug('Saving results to disk...');
  19. var resultFilePath = path.join(resultsDir, testResults.runId, resultFileName);
  20. debug('Destination file is %s', resultFilePath);
  21. return Q.nfcall(fs.writeFile, resultFilePath, JSON.stringify(testResults, null, 2));
  22. });
  23. };
  24. this.getResult = function(runId) {
  25. var resultFilePath = path.join(resultsDir, runId, resultFileName);
  26. debug('Reading results (runID = %s) from disk...', runId);
  27. return Q.nfcall(fs.readFile, resultFilePath, {encoding: 'utf8'}).then(function(data) {
  28. return JSON.parse(data);
  29. });
  30. };
  31. this.deleteResult = function(runId) {
  32. var folder = path.join(resultsDir, runId);
  33. debug('Deleting results (runID = %s) from disk...', runId);
  34. return Q.nfcall(rimraf, folder);
  35. };
  36. // The folder /results/folderName/
  37. function createResultFolder(folderName) {
  38. var folder = path.join(resultsDir, folderName);
  39. debug('Creating the folder %s', folderName);
  40. return createGlobalFolder().then(function() {
  41. return Q.nfcall(fs.mkdir, folder);
  42. });
  43. }
  44. // The folder /results/
  45. function createGlobalFolder() {
  46. var deferred = Q.defer();
  47. // Create the results folder if it doesn't exist
  48. fs.exists(resultsDir, function(exists) {
  49. if (exists) {
  50. deferred.resolve();
  51. } else {
  52. debug('Creating the global results folder', resultsDir);
  53. fs.mkdir(resultsDir, function(err) {
  54. if (err) {
  55. deferred.reject(err);
  56. } else {
  57. deferred.resolve();
  58. }
  59. });
  60. }
  61. });
  62. return deferred.promise;
  63. }
  64. // If there is a screenshot, save it as screenshot.jpg in the same folder as the results
  65. function saveScreenshotIfExists(testResults) {
  66. var deferred = Q.defer();
  67. if (testResults.screenshotBuffer) {
  68. var screenshotFilePath = path.join(resultsDir, testResults.runId, resultScreenshotName);
  69. fs.writeFile(screenshotFilePath, testResults.screenshotBuffer);
  70. delete testResults.screenshotBuffer;
  71. } else {
  72. deferred.resolve();
  73. }
  74. return deferred;
  75. }
  76. this.getScreenshot = function(runId) {
  77. var screenshotFilePath = path.join(resultsDir, runId, resultScreenshotName);
  78. debug('Getting screenshot (runID = %s) from disk...', runId);
  79. return Q.nfcall(fs.readFile, screenshotFilePath);
  80. };
  81. }
  82. module.exports = ResultsDatastore;