resultsDatastore.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. var screenshotFilePath = path.join(resultsDir, testResults.runId, resultScreenshotName);
  14. var screenshotAPIPath = '/';
  15. return createResultFolder(testResults.runId)
  16. .then(function() {
  17. return saveScreenshotIfExists(testResults, screenshotFilePath);
  18. })
  19. .then(function() {
  20. debug('Saving results to disk...');
  21. var resultFilePath = path.join(resultsDir, testResults.runId, resultFileName);
  22. debug('Destination file is %s', resultFilePath);
  23. return Q.nfcall(fs.writeFile, resultFilePath, JSON.stringify(testResults, null, 2));
  24. });
  25. };
  26. this.getResult = function(runId) {
  27. var resultFilePath = path.join(resultsDir, runId, resultFileName);
  28. debug('Reading results (runID = %s) from disk...', runId);
  29. return Q.nfcall(fs.readFile, resultFilePath, {encoding: 'utf8'}).then(function(data) {
  30. return JSON.parse(data);
  31. });
  32. };
  33. this.deleteResult = function(runId) {
  34. var folder = path.join(resultsDir, runId);
  35. debug('Deleting results (runID = %s) from disk...', runId);
  36. return Q.nfcall(rimraf, folder);
  37. };
  38. // The folder /results/folderName/
  39. function createResultFolder(runId) {
  40. var folder = path.join(resultsDir, runId);
  41. debug('Creating the folder %s', runId);
  42. return createGlobalFolder().then(function() {
  43. return Q.nfcall(fs.mkdir, folder);
  44. });
  45. }
  46. // The folder /results/
  47. function createGlobalFolder() {
  48. var deferred = Q.defer();
  49. // Create the results folder if it doesn't exist
  50. fs.exists(resultsDir, function(exists) {
  51. if (exists) {
  52. deferred.resolve();
  53. } else {
  54. debug('Creating the global results folder', resultsDir);
  55. fs.mkdir(resultsDir, function(err) {
  56. if (err) {
  57. deferred.reject(err);
  58. } else {
  59. deferred.resolve();
  60. }
  61. });
  62. }
  63. });
  64. return deferred.promise;
  65. }
  66. this.getResultFolder = function(runId) {
  67. return path.join(resultsDir, runId);
  68. };
  69. // If there is a screenshot, save it as screenshot.jpg in the same folder as the results
  70. function saveScreenshotIfExists(testResults, path) {
  71. var deferred = Q.defer();
  72. if (testResults.screenshotBuffer) {
  73. fs.writeFile(path, testResults.screenshotBuffer, function(err) {
  74. if (err) {
  75. debug('Could not save final screenshot');
  76. debug(err);
  77. // But it is OK, we don't need to fail the run
  78. deferred.resolve();
  79. } else {
  80. debug('Final screenshot saved: ' + path);
  81. deferred.resolve();
  82. }
  83. });
  84. delete testResults.screenshotBuffer;
  85. } else {
  86. debug('Screenshot not found');
  87. deferred.resolve();
  88. }
  89. return deferred.promise;
  90. }
  91. this.getScreenshot = function(runId) {
  92. var screenshotFilePath = path.join(resultsDir, runId, resultScreenshotName);
  93. debug('Getting screenshot (runID = %s) from disk...', runId);
  94. return Q.nfcall(fs.readFile, screenshotFilePath);
  95. };
  96. }
  97. module.exports = ResultsDatastore;