module.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. var path = require('path');
  2. var Utils = require('../util/utils.js');
  3. function Module(modulePath, opts, addtOpts) {
  4. try {
  5. this['@module'] = require(modulePath);
  6. } catch (err) {
  7. throw err;
  8. }
  9. if (!this['@module']) {
  10. throw new Error('Invalid test suite provided.');
  11. }
  12. var currentTestcase = addtOpts && addtOpts.testcase;
  13. this['@testSuiteName'] = null;
  14. this['@attributes'] = {
  15. '@endSessionOnFail' : true,
  16. '@disabled' : false,
  17. '@desiredCapabilities' : {},
  18. '@tags' : []
  19. };
  20. this.groupName = '';
  21. this.setTestSuiteName();
  22. this.keys = this.getKeys(currentTestcase);
  23. if (currentTestcase && this.keys.length === 0) {
  24. throw new Error('Error: "' + currentTestcase + '" is not a valid testcase in the current test suite.');
  25. }
  26. this.allKeys = this.keys.slice();
  27. this.filePath = modulePath;
  28. this.modulePathParts = this.filePath.split(path.sep);
  29. this.moduleName = this.modulePathParts.pop();
  30. this.options = opts;
  31. }
  32. Module.prototype.get = function(key) {
  33. if (!key) {
  34. return this['@module'];
  35. }
  36. return this['@module'][key];
  37. };
  38. Module.prototype.set = function(key, value) {
  39. if (!key || !value) {
  40. return this;
  41. }
  42. this['@module'][key] = value;
  43. return this;
  44. };
  45. Module.prototype.getName = function() {
  46. return this.moduleName;
  47. };
  48. Module.prototype.call = function(fnName /* arg1, arg2 ...*/) {
  49. var args = Array.prototype.slice.call(arguments, 1);
  50. return this['@module'][fnName].apply(this['@module'], args);
  51. };
  52. Module.prototype.callAsync = function(fnName, api, done, expectedArgs) {
  53. expectedArgs = expectedArgs || 2;
  54. var fnAsync = Utils.makeFnAsync(expectedArgs, this['@module'][fnName], this['@module']);
  55. fnAsync.name = fnName;
  56. var args = [done];
  57. if (expectedArgs == 2) {
  58. args.unshift(api);
  59. }
  60. return fnAsync.apply(this['@module'], args);
  61. };
  62. Module.prototype.setReportKey = function(fullPaths, srcFolders) {
  63. var diffInFolder = '', folder, parentFolder = '';
  64. var filePath = this.modulePathParts.join(path.sep);
  65. if (srcFolders) {
  66. for (var i = 0; i < srcFolders.length; i++) {
  67. folder = path.resolve(srcFolders[i]);
  68. if (fullPaths.length > 1) {
  69. parentFolder = folder.split(path.sep).pop();
  70. }
  71. if (filePath.indexOf(folder) === 0) {
  72. diffInFolder = filePath.substring(folder.length + 1);
  73. break;
  74. }
  75. }
  76. }
  77. if (diffInFolder.substr(-1) == path.sep) {
  78. diffInFolder = diffInFolder.substring(0, diffInFolder.length-1);
  79. }
  80. this.groupName = diffInFolder.split(path.sep).pop(); // in case we're in a sub-folder
  81. this.moduleKey = path.join(parentFolder, diffInFolder, this.moduleName);
  82. return this;
  83. };
  84. Module.prototype.getKeys = function(currentTestcase) {
  85. return Object.keys(this['@module']).filter(function(element) {
  86. if (!this['@module'][element]) {
  87. return false;
  88. }
  89. var isFunction = typeof this['@module'][element] == 'function';
  90. if (currentTestcase) {
  91. return isFunction && (element === currentTestcase);
  92. }
  93. return isFunction;
  94. }, this);
  95. };
  96. Module.prototype.removeKey = function(key) {
  97. var self = this;
  98. if (Array.isArray(key)) {
  99. key.forEach(function(item) {
  100. self.removeKey(item);
  101. });
  102. return;
  103. }
  104. var index = this.keys.indexOf(key);
  105. if (index > -1) {
  106. this.keys.splice(index, 1);
  107. }
  108. };
  109. Module.prototype.setTestSuiteName = function() {
  110. var module = this['@module'];
  111. var keys = Object.keys(module);
  112. var suiteName;
  113. var hasSubSuite = keys.some(function(item) {
  114. var isAttribute = this.isAttribute(item);
  115. if (isAttribute) {
  116. var attrName = Module.geAttributeName(item);
  117. this['@attributes'][attrName] = module[item];
  118. } else if (typeof module[item] == 'object' && module[item]) {
  119. suiteName = item;
  120. return true;
  121. }
  122. return false;
  123. }, this);
  124. if (hasSubSuite && suiteName) {
  125. var sections = [];
  126. if (this['@testSuiteName']) {
  127. sections.push(this['@testSuiteName']);
  128. }
  129. sections.push(suiteName);
  130. this['@testSuiteName'] = sections.join(' :: ');
  131. this['@module'] = module[suiteName];
  132. return this.setTestSuiteName();
  133. }
  134. return this;
  135. };
  136. Module.geAttributeName = function(item) {
  137. return (item.charAt(0) == '@' ? '' : '@') + item;
  138. };
  139. Module.prototype.isAttribute = function(item) {
  140. var attrName = Module.geAttributeName(item);
  141. return (attrName in this['@attributes']) && (typeof module[item] != 'function');
  142. };
  143. Module.prototype.getTestSuiteName = function() {
  144. return this['@testSuiteName'];
  145. };
  146. Module.prototype.getNextKey = function() {
  147. if (this.keys.length) {
  148. return this.keys.shift();
  149. }
  150. return null;
  151. };
  152. Module.prototype.resetKeys = function() {
  153. this.keys = this.allKeys.slice();
  154. };
  155. Module.prototype.endSessionOnFail = function() {
  156. return this['@attributes']['@endSessionOnFail'];
  157. };
  158. Module.prototype.isDisabled = function() {
  159. return this['@attributes']['@disabled'];
  160. };
  161. Module.prototype.desiredCapabilities = function(capability) {
  162. if (capability && (capability in this['@attributes']['@desiredCapabilities'])) {
  163. return this['@attributes']['@desiredCapabilities'][capability];
  164. }
  165. return this['@attributes']['@desiredCapabilities'];
  166. };
  167. module.exports = Module;