@sap_oss/wdio-qmate-service 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.yml +33 -0
  3. package/.reuse/dep5 +29 -0
  4. package/LICENSE +201 -0
  5. package/LICENSES/Apache-2.0.txt +73 -0
  6. package/README.md +20 -0
  7. package/docs/contact.md +10 -0
  8. package/docs/doc.md +5188 -0
  9. package/docs/gettingStarted/selectors.md +168 -0
  10. package/docs/gettingStarted/setup.md +8 -0
  11. package/docs/index.md +14 -0
  12. package/docs/style/custom.css +24 -0
  13. package/lib/index.d.ts +1 -0
  14. package/lib/index.js +171 -0
  15. package/lib/index.js.map +1 -0
  16. package/lib/reuse/authenticator/authConfig.d.ts +54 -0
  17. package/lib/reuse/authenticator/authConfig.js +55 -0
  18. package/lib/reuse/authenticator/authConfig.js.map +1 -0
  19. package/lib/reuse/authenticator/authHandler.d.ts +6 -0
  20. package/lib/reuse/authenticator/authHandler.js +37 -0
  21. package/lib/reuse/authenticator/authHandler.js.map +1 -0
  22. package/lib/reuse/authenticator/basicUrlAuthenticator.d.ts +2 -0
  23. package/lib/reuse/authenticator/basicUrlAuthenticator.js +36 -0
  24. package/lib/reuse/authenticator/basicUrlAuthenticator.js.map +1 -0
  25. package/lib/reuse/authenticator/customAuthenticator.d.ts +2 -0
  26. package/lib/reuse/authenticator/customAuthenticator.js +60 -0
  27. package/lib/reuse/authenticator/customAuthenticator.js.map +1 -0
  28. package/lib/reuse/authenticator/formAuthenticator.d.ts +2 -0
  29. package/lib/reuse/authenticator/formAuthenticator.js +57 -0
  30. package/lib/reuse/authenticator/formAuthenticator.js.map +1 -0
  31. package/lib/reuse/authenticator/plainAuthenticator.d.ts +2 -0
  32. package/lib/reuse/authenticator/plainAuthenticator.js +20 -0
  33. package/lib/reuse/authenticator/plainAuthenticator.js.map +1 -0
  34. package/lib/reuse/data/authenticators.json +16 -0
  35. package/lib/reuse/helper/clientsideUI5scripts.d.ts +1 -0
  36. package/lib/reuse/helper/clientsideUI5scripts.js +388 -0
  37. package/lib/reuse/helper/clientsideUI5scripts.js.map +1 -0
  38. package/lib/reuse/helper/jsDocGen.d.ts +1 -0
  39. package/lib/reuse/helper/jsDocGen.js +45 -0
  40. package/lib/reuse/helper/jsDocGen.js.map +1 -0
  41. package/lib/reuse/index.d.ts +5 -0
  42. package/lib/reuse/index.js +89 -0
  43. package/lib/reuse/index.js.map +1 -0
  44. package/lib/reuse/modules/common/Common.d.ts +12 -0
  45. package/lib/reuse/modules/common/Common.js +21 -0
  46. package/lib/reuse/modules/common/Common.js.map +1 -0
  47. package/lib/reuse/modules/common/assertion.d.ts +65 -0
  48. package/lib/reuse/modules/common/assertion.js +91 -0
  49. package/lib/reuse/modules/common/assertion.js.map +1 -0
  50. package/lib/reuse/modules/common/constants/date.constants.d.ts +8 -0
  51. package/lib/reuse/modules/common/constants/date.constants.js +13 -0
  52. package/lib/reuse/modules/common/constants/date.constants.js.map +1 -0
  53. package/lib/reuse/modules/common/constants/userInteraction.constants.d.ts +9 -0
  54. package/lib/reuse/modules/common/constants/userInteraction.constants.js +14 -0
  55. package/lib/reuse/modules/common/constants/userInteraction.constants.js.map +1 -0
  56. package/lib/reuse/modules/common/date.d.ts +84 -0
  57. package/lib/reuse/modules/common/date.js +164 -0
  58. package/lib/reuse/modules/common/date.js.map +1 -0
  59. package/lib/reuse/modules/common/navigation.d.ts +26 -0
  60. package/lib/reuse/modules/common/navigation.js +56 -0
  61. package/lib/reuse/modules/common/navigation.js.map +1 -0
  62. package/lib/reuse/modules/common/types/date.types.d.ts +2 -0
  63. package/lib/reuse/modules/common/types/date.types.js +3 -0
  64. package/lib/reuse/modules/common/types/date.types.js.map +1 -0
  65. package/lib/reuse/modules/common/userInteraction.d.ts +104 -0
  66. package/lib/reuse/modules/common/userInteraction.js +199 -0
  67. package/lib/reuse/modules/common/userInteraction.js.map +1 -0
  68. package/lib/reuse/modules/nonUi5/NonUi5.d.ts +12 -0
  69. package/lib/reuse/modules/nonUi5/NonUi5.js +21 -0
  70. package/lib/reuse/modules/nonUi5/NonUi5.js.map +1 -0
  71. package/lib/reuse/modules/nonUi5/assertion.d.ts +62 -0
  72. package/lib/reuse/modules/nonUi5/assertion.js +127 -0
  73. package/lib/reuse/modules/nonUi5/assertion.js.map +1 -0
  74. package/lib/reuse/modules/nonUi5/constants/userInteraction.constants.d.ts +6 -0
  75. package/lib/reuse/modules/nonUi5/constants/userInteraction.constants.js +11 -0
  76. package/lib/reuse/modules/nonUi5/constants/userInteraction.constants.js.map +1 -0
  77. package/lib/reuse/modules/nonUi5/element.d.ts +286 -0
  78. package/lib/reuse/modules/nonUi5/element.js +639 -0
  79. package/lib/reuse/modules/nonUi5/element.js.map +1 -0
  80. package/lib/reuse/modules/nonUi5/navigation.d.ts +17 -0
  81. package/lib/reuse/modules/nonUi5/navigation.js +44 -0
  82. package/lib/reuse/modules/nonUi5/navigation.js.map +1 -0
  83. package/lib/reuse/modules/nonUi5/userInteraction.d.ts +170 -0
  84. package/lib/reuse/modules/nonUi5/userInteraction.js +415 -0
  85. package/lib/reuse/modules/nonUi5/userInteraction.js.map +1 -0
  86. package/lib/reuse/modules/service/Service.d.ts +8 -0
  87. package/lib/reuse/modules/service/Service.js +17 -0
  88. package/lib/reuse/modules/service/Service.js.map +1 -0
  89. package/lib/reuse/modules/service/odata.d.ts +177 -0
  90. package/lib/reuse/modules/service/odata.js +347 -0
  91. package/lib/reuse/modules/service/odata.js.map +1 -0
  92. package/lib/reuse/modules/service/rest.d.ts +66 -0
  93. package/lib/reuse/modules/service/rest.js +168 -0
  94. package/lib/reuse/modules/service/rest.js.map +1 -0
  95. package/lib/reuse/modules/service/soap.d.ts +0 -0
  96. package/lib/reuse/modules/service/soap.js +2 -0
  97. package/lib/reuse/modules/service/soap.js.map +1 -0
  98. package/lib/reuse/modules/ui5/Ui5.d.ts +34 -0
  99. package/lib/reuse/modules/ui5/Ui5.js +41 -0
  100. package/lib/reuse/modules/ui5/Ui5.js.map +1 -0
  101. package/lib/reuse/modules/ui5/assertion.d.ts +183 -0
  102. package/lib/reuse/modules/ui5/assertion.js +493 -0
  103. package/lib/reuse/modules/ui5/assertion.js.map +1 -0
  104. package/lib/reuse/modules/ui5/confirmationDialog.d.ts +86 -0
  105. package/lib/reuse/modules/ui5/confirmationDialog.js +145 -0
  106. package/lib/reuse/modules/ui5/confirmationDialog.js.map +1 -0
  107. package/lib/reuse/modules/ui5/constants/mockserver.constants.d.ts +4 -0
  108. package/lib/reuse/modules/ui5/constants/mockserver.constants.js +9 -0
  109. package/lib/reuse/modules/ui5/constants/mockserver.constants.js.map +1 -0
  110. package/lib/reuse/modules/ui5/control.d.ts +84 -0
  111. package/lib/reuse/modules/ui5/control.js +132 -0
  112. package/lib/reuse/modules/ui5/control.js.map +1 -0
  113. package/lib/reuse/modules/ui5/date.d.ts +48 -0
  114. package/lib/reuse/modules/ui5/date.js +153 -0
  115. package/lib/reuse/modules/ui5/date.js.map +1 -0
  116. package/lib/reuse/modules/ui5/element.d.ts +160 -0
  117. package/lib/reuse/modules/ui5/element.js +349 -0
  118. package/lib/reuse/modules/ui5/element.js.map +1 -0
  119. package/lib/reuse/modules/ui5/errorDialog.d.ts +39 -0
  120. package/lib/reuse/modules/ui5/errorDialog.js +65 -0
  121. package/lib/reuse/modules/ui5/errorDialog.js.map +1 -0
  122. package/lib/reuse/modules/ui5/footerBar.d.ts +153 -0
  123. package/lib/reuse/modules/ui5/footerBar.js +240 -0
  124. package/lib/reuse/modules/ui5/footerBar.js.map +1 -0
  125. package/lib/reuse/modules/ui5/mockserver.d.ts +154 -0
  126. package/lib/reuse/modules/ui5/mockserver.js +665 -0
  127. package/lib/reuse/modules/ui5/mockserver.js.map +1 -0
  128. package/lib/reuse/modules/ui5/navigation.d.ts +103 -0
  129. package/lib/reuse/modules/ui5/navigation.js +275 -0
  130. package/lib/reuse/modules/ui5/navigation.js.map +1 -0
  131. package/lib/reuse/modules/ui5/navigationBar.d.ts +48 -0
  132. package/lib/reuse/modules/ui5/navigationBar.js +141 -0
  133. package/lib/reuse/modules/ui5/navigationBar.js.map +1 -0
  134. package/lib/reuse/modules/ui5/qunit.d.ts +17 -0
  135. package/lib/reuse/modules/ui5/qunit.js +52 -0
  136. package/lib/reuse/modules/ui5/qunit.js.map +1 -0
  137. package/lib/reuse/modules/ui5/session.d.ts +117 -0
  138. package/lib/reuse/modules/ui5/session.js +374 -0
  139. package/lib/reuse/modules/ui5/session.js.map +1 -0
  140. package/lib/reuse/modules/ui5/table.d.ts +61 -0
  141. package/lib/reuse/modules/ui5/table.js +188 -0
  142. package/lib/reuse/modules/ui5/table.js.map +1 -0
  143. package/lib/reuse/modules/ui5/types/mockserver.types.d.ts +2 -0
  144. package/lib/reuse/modules/ui5/types/mockserver.types.js +3 -0
  145. package/lib/reuse/modules/ui5/types/mockserver.types.js.map +1 -0
  146. package/lib/reuse/modules/ui5/userInteraction.d.ts +304 -0
  147. package/lib/reuse/modules/ui5/userInteraction.js +690 -0
  148. package/lib/reuse/modules/ui5/userInteraction.js.map +1 -0
  149. package/lib/reuse/modules/util/Util.d.ts +22 -0
  150. package/lib/reuse/modules/util/Util.js +27 -0
  151. package/lib/reuse/modules/util/Util.js.map +1 -0
  152. package/lib/reuse/modules/util/browser.d.ts +167 -0
  153. package/lib/reuse/modules/util/browser.js +367 -0
  154. package/lib/reuse/modules/util/browser.js.map +1 -0
  155. package/lib/reuse/modules/util/console.d.ts +56 -0
  156. package/lib/reuse/modules/util/console.js +152 -0
  157. package/lib/reuse/modules/util/console.js.map +1 -0
  158. package/lib/reuse/modules/util/constants/formatter.constants.d.ts +11 -0
  159. package/lib/reuse/modules/util/constants/formatter.constants.js +16 -0
  160. package/lib/reuse/modules/util/constants/formatter.constants.js.map +1 -0
  161. package/lib/reuse/modules/util/data.d.ts +36 -0
  162. package/lib/reuse/modules/util/data.js +87 -0
  163. package/lib/reuse/modules/util/data.js.map +1 -0
  164. package/lib/reuse/modules/util/file.d.ts +55 -0
  165. package/lib/reuse/modules/util/file.js +159 -0
  166. package/lib/reuse/modules/util/file.js.map +1 -0
  167. package/lib/reuse/modules/util/formatter.d.ts +90 -0
  168. package/lib/reuse/modules/util/formatter.js +210 -0
  169. package/lib/reuse/modules/util/formatter.js.map +1 -0
  170. package/lib/reuse/modules/util/function.d.ts +48 -0
  171. package/lib/reuse/modules/util/function.js +161 -0
  172. package/lib/reuse/modules/util/function.js.map +1 -0
  173. package/lib/reuse/modules/util/system.d.ts +17 -0
  174. package/lib/reuse/modules/util/system.js +58 -0
  175. package/lib/reuse/modules/util/system.js.map +1 -0
  176. package/lib/reuse/modules/util/types/formatter.types.d.ts +2 -0
  177. package/lib/reuse/modules/util/types/formatter.types.js +3 -0
  178. package/lib/reuse/modules/util/types/formatter.types.js.map +1 -0
  179. package/lib/scripts/clientsideUI5scripts.d.ts +1 -0
  180. package/lib/scripts/clientsideUI5scripts.js +315 -0
  181. package/lib/scripts/clientsideUI5scripts.js.map +1 -0
  182. package/lib/scripts/dataExchange/dataExchange.d.ts +1 -0
  183. package/lib/scripts/dataExchange/dataExchange.js +224 -0
  184. package/lib/scripts/dataExchange/dataExchange.js.map +1 -0
  185. package/lib/scripts/dataExchange/dataExchangeUtil.d.ts +63 -0
  186. package/lib/scripts/dataExchange/dataExchangeUtil.js +211 -0
  187. package/lib/scripts/dataExchange/dataExchangeUtil.js.map +1 -0
  188. package/lib/scripts/hooks/after.d.ts +8 -0
  189. package/lib/scripts/hooks/after.js +30 -0
  190. package/lib/scripts/hooks/after.js.map +1 -0
  191. package/lib/scripts/hooks/before.d.ts +8 -0
  192. package/lib/scripts/hooks/before.js +38 -0
  193. package/lib/scripts/hooks/before.js.map +1 -0
  194. package/lib/scripts/hooks/beforeSession.d.ts +8 -0
  195. package/lib/scripts/hooks/beforeSession.js +37 -0
  196. package/lib/scripts/hooks/beforeSession.js.map +1 -0
  197. package/lib/scripts/hooks/onComplete.d.ts +9 -0
  198. package/lib/scripts/hooks/onComplete.js +31 -0
  199. package/lib/scripts/hooks/onComplete.js.map +1 -0
  200. package/lib/scripts/hooks/onPrepare.d.ts +6 -0
  201. package/lib/scripts/hooks/onPrepare.js +36 -0
  202. package/lib/scripts/hooks/onPrepare.js.map +1 -0
  203. package/lib/scripts/hooks/utils/addLocatorCommands.d.ts +2 -0
  204. package/lib/scripts/hooks/utils/addLocatorCommands.js +193 -0
  205. package/lib/scripts/hooks/utils/addLocatorCommands.js.map +1 -0
  206. package/lib/scripts/hooks/utils/browserLog.d.ts +2 -0
  207. package/lib/scripts/hooks/utils/browserLog.js +39 -0
  208. package/lib/scripts/hooks/utils/browserLog.js.map +1 -0
  209. package/lib/scripts/hooks/utils/dataExchangeCommands.d.ts +9 -0
  210. package/lib/scripts/hooks/utils/dataExchangeCommands.js +46 -0
  211. package/lib/scripts/hooks/utils/dataExchangeCommands.js.map +1 -0
  212. package/lib/scripts/hooks/utils/decryption.d.ts +13 -0
  213. package/lib/scripts/hooks/utils/decryption.js +90 -0
  214. package/lib/scripts/hooks/utils/decryption.js.map +1 -0
  215. package/lib/scripts/hooks/utils/lib.d.ts +4 -0
  216. package/lib/scripts/hooks/utils/lib.js +330 -0
  217. package/lib/scripts/hooks/utils/lib.js.map +1 -0
  218. package/lib/scripts/hooks/utils/locatorCommands.d.ts +10 -0
  219. package/lib/scripts/hooks/utils/locatorCommands.js +216 -0
  220. package/lib/scripts/hooks/utils/locatorCommands.js.map +1 -0
  221. package/lib/scripts/locators/qmateLocator.d.ts +1 -0
  222. package/lib/scripts/locators/qmateLocator.js +1384 -0
  223. package/lib/scripts/locators/qmateLocator.js.map +1 -0
  224. package/lib/scripts/locators/uiveri5Locator.d.ts +1 -0
  225. package/lib/scripts/locators/uiveri5Locator.js +21 -0
  226. package/lib/scripts/locators/uiveri5Locator.js.map +1 -0
  227. package/mkdocs.yml +53 -0
  228. package/package.json +152 -0
  229. package/test/.eslintrc.yml +6 -0
  230. package/test/authenticator/package.json +13 -0
  231. package/test/authenticator/staticLogin/configCustom.js +22 -0
  232. package/test/authenticator/staticLogin/configCustomViaConfig.js +20 -0
  233. package/test/authenticator/staticLogin/configFiori.js +19 -0
  234. package/test/authenticator/staticLogin/configPlain.js +17 -0
  235. package/test/authenticator/staticLogin/configSapCloud.js +18 -0
  236. package/test/authenticator/staticLogin/html/custom.html +10 -0
  237. package/test/authenticator/staticLogin/html/fiori.html +10 -0
  238. package/test/authenticator/staticLogin/html/home.html +7 -0
  239. package/test/authenticator/staticLogin/html/sapCloud.html +10 -0
  240. package/test/authenticator/staticLogin/specs/custom.spec.js +6 -0
  241. package/test/authenticator/staticLogin/specs/customViaConfig.spec.js +10 -0
  242. package/test/authenticator/staticLogin/specs/fiori.spec.js +6 -0
  243. package/test/authenticator/staticLogin/specs/plain.spec.js +64 -0
  244. package/test/authenticator/staticLogin/specs/sapCloud.spec.js +6 -0
  245. package/test/authenticator/staticLogin/staticServerConfig.js +20 -0
  246. package/test/authenticator/systemLogin/configCustom.js +26 -0
  247. package/test/authenticator/systemLogin/configFiori.js +24 -0
  248. package/test/authenticator/systemLogin/configPlain.js +22 -0
  249. package/test/authenticator/systemLogin/configSapCloud.js +24 -0
  250. package/test/authenticator/systemLogin/specs/custom.spec.js +13 -0
  251. package/test/authenticator/systemLogin/specs/fiori.spec.js +12 -0
  252. package/test/authenticator/systemLogin/specs/plain.spec.js +21 -0
  253. package/test/authenticator/systemLogin/specs/sapCloud.spec.js +13 -0
  254. package/test/core/README.md +17 -0
  255. package/test/core/dataExchange/config.export.js +56 -0
  256. package/test/core/dataExchange/config.import.js +47 -0
  257. package/test/core/dataExchange/config.js +52 -0
  258. package/test/core/dataExchange/config.parallel.group.js +61 -0
  259. package/test/core/dataExchange/config.parallel.js +58 -0
  260. package/test/core/dataExchange/data/another/folder/data/anotherFolder/dummy1.txt +0 -0
  261. package/test/core/dataExchange/data/another/folder/data/anotherFolder/purchase-orders/Limit-Purchase-Order.json +29 -0
  262. package/test/core/dataExchange/data/another/folder/data/anotherFolder/purchase-orders/ServicePurchaseOrder.2Items.json +67 -0
  263. package/test/core/dataExchange/data/another/folder/data/anotherFolder/purchaseRequisition_HI.json +31 -0
  264. package/test/core/dataExchange/data/another/folder/data/anotherFolder/subfolder/LimitPurchaseOrder.json +29 -0
  265. package/test/core/dataExchange/data/another/folder/data/anotherFolder/subfolder/PurchaseOrderItems.json +58 -0
  266. package/test/core/dataExchange/data/another/folder/data/anotherFolder/subfolder/PurchaseOrderWithScheduline.json +27 -0
  267. package/test/core/dataExchange/data/another/folder/data/anotherFolder/subfolder/ServiceAndMaterialPurchaseOrder.json +65 -0
  268. package/test/core/dataExchange/data/another/folder/data/anotherFolder/subfolder/ServicePurchaseOrder.json +39 -0
  269. package/test/core/dataExchange/data/another/folder/data/anotherFolder/subfolder/ServicePurchaseOrder2Items.json +67 -0
  270. package/test/core/dataExchange/data/my/folder/data/qs9/data.json +5 -0
  271. package/test/core/dataExchange/data/my/folder/data/qs9/dummy1.txt +0 -0
  272. package/test/core/dataExchange/data/my/folder/data/qs9/dummy2.txt +0 -0
  273. package/test/core/dataExchange/data/my/folder/data/qs9/empty.json +0 -0
  274. package/test/core/dataExchange/data/my/folder/data/qs9/purchaseRequisition.json +31 -0
  275. package/test/core/dataExchange/data/my/folder/data/qs9/supplierInvoice.json +17 -0
  276. package/test/core/dataExchange/data/my/folder/data/qs9/webUser.json +6 -0
  277. package/test/core/dataExchange/data/ui/moreDataFolder/anotherUser.json +6 -0
  278. package/test/core/dataExchange/data/ui/user.json +6 -0
  279. package/test/core/dataExchange/data/ui/webUser.json +6 -0
  280. package/test/core/dataExchange/specs/export.fast.spec.js +48 -0
  281. package/test/core/dataExchange/specs/export.slow.spec.js +50 -0
  282. package/test/core/dataExchange/specs/export.spec.js +103 -0
  283. package/test/core/dataExchange/specs/import.spec.js +144 -0
  284. package/test/core/dataExchange/specs/importExport.spec.js +196 -0
  285. package/test/core/dataExchange/utils.js +160 -0
  286. package/test/core/functional/README.md +30 -0
  287. package/test/core/functional/chaining/chaining.test.js +137 -0
  288. package/test/core/functional/chaining/test.conf.js +31 -0
  289. package/test/core/functional/locators/ancestorProperties.test.js +99 -0
  290. package/test/core/functional/locators/childProperties.test.js +40 -0
  291. package/test/core/functional/locators/descendantProperties.test.js +107 -0
  292. package/test/core/functional/locators/domProperties.test.js +60 -0
  293. package/test/core/functional/locators/elementProperties.test.js +114 -0
  294. package/test/core/functional/locators/mixedProperties.test.js +170 -0
  295. package/test/core/functional/locators/parentProperties.test.js +47 -0
  296. package/test/core/functional/locators/siblingProperties.test.js +120 -0
  297. package/test/core/functional/locators/test.locator.conf.js +38 -0
  298. package/test/core/functional/locators/utils.js +6 -0
  299. package/test/core/functional/nativeBrowser/runInBrowser.test.js +111 -0
  300. package/test/core/functional/nativeBrowser/test.conf.js +31 -0
  301. package/test/core/functional/nonUi5/basic.test.js +10 -0
  302. package/test/core/functional/nonUi5/getWithDomElement.test.js +51 -0
  303. package/test/core/functional/nonUi5/getWithDomElements.test.js +141 -0
  304. package/test/core/functional/nonUi5/test.conf.js +32 -0
  305. package/test/core/functional/ui5Properties/getAggregations.test.js +102 -0
  306. package/test/core/functional/ui5Properties/getAssociations.test.js +24 -0
  307. package/test/core/functional/ui5Properties/getBindingInfos.test.js +71 -0
  308. package/test/core/functional/ui5Properties/getProperties.test.js +226 -0
  309. package/test/core/functional/ui5Properties/test.conf.js +16 -0
  310. package/test/core/functional/uiveri5/sample.test.js +61 -0
  311. package/test/core/functional/uiveri5/test.conf.js +31 -0
  312. package/test/core/package-lock.json +0 -0
  313. package/test/core/package.json +12 -0
  314. package/test/core/testIntegration/config.js +17 -0
  315. package/test/core/testIntegration/configMultiCombo.js +17 -0
  316. package/test/core/testIntegration/configTable.js +18 -0
  317. package/test/core/testIntegration/filters1.spec.js +1849 -0
  318. package/test/core/testIntegration/multicombobox.spec.js +134 -0
  319. package/test/core/testIntegration/table.spec.js +80 -0
  320. package/test/helper/configurations/base.conf.js +43 -0
  321. package/test/helper/configurations/chrome.conf.js +47 -0
  322. package/test/helper/configurations/chrome.headless.conf.js +45 -0
  323. package/test/helper/configurations/sauce.labs.conf.js +37 -0
  324. package/test/helper/configurations/sauce.labs.tunnel.conf.js +39 -0
  325. package/test/helper/sleeper.js +19 -0
  326. package/test/helper/utils.js +15 -0
  327. package/test/helper/website/buttons.html +85 -0
  328. package/test/helper/website/checkBox.html +83 -0
  329. package/test/helper/website/dragAndDropFailing.html +83 -0
  330. package/test/helper/website/dragAndDropWdioExample.html +41 -0
  331. package/test/helper/website/dropdown.html +78 -0
  332. package/test/helper/website/forms.html +82 -0
  333. package/test/helper/website/hiddenAndVisible.html +60 -0
  334. package/test/helper/website/main.css +36 -0
  335. package/test/helper/website/scrollPage.html +261 -0
  336. package/test/helper/website/style.css +52 -0
  337. package/test/helper/website/tables.html +140 -0
  338. package/test/helper/website/waitForElements.html +73 -0
  339. package/test/reuse/common/assertion/expectDefined.spec.js +11 -0
  340. package/test/reuse/common/assertion/expectEqual.spec.js +52 -0
  341. package/test/reuse/common/assertion/expectFalse.spec.js +9 -0
  342. package/test/reuse/common/assertion/expectTrue.spec.js +9 -0
  343. package/test/reuse/common/assertion/expectUndefined.spec.js +11 -0
  344. package/test/reuse/common/assertion/expectUnequal.spec.js +25 -0
  345. package/test/reuse/common/assertion/expectUrlToBe.spec.js +27 -0
  346. package/test/reuse/common/assertion/test.assertion.conf.js +59 -0
  347. package/test/reuse/common/date/calculate.spec.js +163 -0
  348. package/test/reuse/common/date/getNextMonth.spec.js +105 -0
  349. package/test/reuse/common/date/getNextYear.spec.js +72 -0
  350. package/test/reuse/common/date/getPreviousMonth.spec.js +71 -0
  351. package/test/reuse/common/date/getPreviousYear.spec.js +72 -0
  352. package/test/reuse/common/date/getSpecific.spec.js +63 -0
  353. package/test/reuse/common/date/getToday.spec.js +78 -0
  354. package/test/reuse/common/date/getTomorrow.spec.js +72 -0
  355. package/test/reuse/common/date/test.date.conf.js +19 -0
  356. package/test/reuse/common/date/utils.js +6 -0
  357. package/test/reuse/common/navigation/navigateToUrl.spec.js +28 -0
  358. package/test/reuse/common/navigation/navigateToUrlAndRetry.spec.js +27 -0
  359. package/test/reuse/common/navigation/test.navigation.conf.js +25 -0
  360. package/test/reuse/common/userInteraction/clearAndFillActive.spec.js +100 -0
  361. package/test/reuse/common/userInteraction/clearAndFillActiveAndRetry.spec.js +106 -0
  362. package/test/reuse/common/userInteraction/fillActive.spec.js +230 -0
  363. package/test/reuse/common/userInteraction/fillActiveAndRetry.spec.js +172 -0
  364. package/test/reuse/common/userInteraction/pressKey.spec.js +105 -0
  365. package/test/reuse/common/userInteraction/test.userInteraction.conf.js +53 -0
  366. package/test/reuse/nonUi5/assertion/expectAttributeToBe.spec.js +45 -0
  367. package/test/reuse/nonUi5/assertion/expectAttributeToContain.spec.js +43 -0
  368. package/test/reuse/nonUi5/assertion/expectToBeNotVisible.spec.js +37 -0
  369. package/test/reuse/nonUi5/assertion/expectToBeVisible.spec.js +63 -0
  370. package/test/reuse/nonUi5/assertion/expectValueToBe.spec.js +25 -0
  371. package/test/reuse/nonUi5/assertion/test.assertion.conf.js +60 -0
  372. package/test/reuse/nonUi5/assertion/test.assertion.sauceLabs.conf.js +64 -0
  373. package/test/reuse/nonUi5/element/getAllDisplayed.spec.js +39 -0
  374. package/test/reuse/nonUi5/element/getAttributeValue.spec.js +58 -0
  375. package/test/reuse/nonUi5/element/getByChild.spec.js +70 -0
  376. package/test/reuse/nonUi5/element/getByClass.spec.js +64 -0
  377. package/test/reuse/nonUi5/element/getByCss.spec.js +65 -0
  378. package/test/reuse/nonUi5/element/getByCssContainingText.spec.js +83 -0
  379. package/test/reuse/nonUi5/element/getById.spec.js +35 -0
  380. package/test/reuse/nonUi5/element/getByName.spec.js +30 -0
  381. package/test/reuse/nonUi5/element/getByParent.spec.js +71 -0
  382. package/test/reuse/nonUi5/element/getByXPath.spec.js +30 -0
  383. package/test/reuse/nonUi5/element/getValue.spec.js +51 -0
  384. package/test/reuse/nonUi5/element/highlight.spec.js +18 -0
  385. package/test/reuse/nonUi5/element/isPresent.spec.js +39 -0
  386. package/test/reuse/nonUi5/element/isPresentByCss.spec.js +73 -0
  387. package/test/reuse/nonUi5/element/isPresentByXPath.spec.js +31 -0
  388. package/test/reuse/nonUi5/element/setInnerHTML.spec.js +23 -0
  389. package/test/reuse/nonUi5/element/test.element.conf.js +55 -0
  390. package/test/reuse/nonUi5/element/test.element.sauceLabs.conf.js +58 -0
  391. package/test/reuse/nonUi5/element/waitForAll.spec.js +24 -0
  392. package/test/reuse/nonUi5/element/waitToBeClickable.spec.js +24 -0
  393. package/test/reuse/nonUi5/element/waitToBePresent.spec.js +32 -0
  394. package/test/reuse/nonUi5/element/waitToBeVisible.spec.js +36 -0
  395. package/test/reuse/nonUi5/navigation/navigateToApplication.spec.js +13 -0
  396. package/test/reuse/nonUi5/navigation/test.navigation.conf.js +14 -0
  397. package/test/reuse/nonUi5/userInteraction/checkAttributeAndValue.spec.js +135 -0
  398. package/test/reuse/nonUi5/userInteraction/clear.spec.js +43 -0
  399. package/test/reuse/nonUi5/userInteraction/clearAndFill.spec.js +51 -0
  400. package/test/reuse/nonUi5/userInteraction/clearAndFillAndRetry.spec.js +58 -0
  401. package/test/reuse/nonUi5/userInteraction/clearAndRetry.spec.js +43 -0
  402. package/test/reuse/nonUi5/userInteraction/click.spec.js +60 -0
  403. package/test/reuse/nonUi5/userInteraction/clickAndRetry.spec.js +60 -0
  404. package/test/reuse/nonUi5/userInteraction/clickElementInSvg.spec.js +24 -0
  405. package/test/reuse/nonUi5/userInteraction/doubleClick.spec.js +22 -0
  406. package/test/reuse/nonUi5/userInteraction/dragAndDrop.spec.js +40 -0
  407. package/test/reuse/nonUi5/userInteraction/fill.spec.js +37 -0
  408. package/test/reuse/nonUi5/userInteraction/fillAndRetry.spec.js +39 -0
  409. package/test/reuse/nonUi5/userInteraction/mouseOverElement.spec.js +36 -0
  410. package/test/reuse/nonUi5/userInteraction/moveCursorAndClick.spec.js +24 -0
  411. package/test/reuse/nonUi5/userInteraction/rightClick.spec.js +13 -0
  412. package/test/reuse/nonUi5/userInteraction/scrollToElement.spec.js +35 -0
  413. package/test/reuse/nonUi5/userInteraction/test.userInteraction.conf.js +72 -0
  414. package/test/reuse/nonUi5/userInteraction/test.userInteraction.sauceLabs.conf.js +78 -0
  415. package/test/reuse/service/rest/db.json +8 -0
  416. package/test/reuse/service/rest/delete.spec.js +20 -0
  417. package/test/reuse/service/rest/get.spec.js +19 -0
  418. package/test/reuse/service/rest/init.spec.js +35 -0
  419. package/test/reuse/service/rest/patch.spec.js +29 -0
  420. package/test/reuse/service/rest/post.spec.js +37 -0
  421. package/test/reuse/service/rest/test.rest.conf.js +18 -0
  422. package/test/reuse/ui5/assertion/expectAttributeToBe.spec.js +106 -0
  423. package/test/reuse/ui5/assertion/expectAttributeToContain.spec.js +78 -0
  424. package/test/reuse/ui5/assertion/expectBindingContextPathToBe.spec.js +103 -0
  425. package/test/reuse/ui5/assertion/expectBindingPathToBe.spec.js +164 -0
  426. package/test/reuse/ui5/assertion/expectMessageToastTextToBe.spec.js +43 -0
  427. package/test/reuse/ui5/assertion/expectTextToBe.spec.js +39 -0
  428. package/test/reuse/ui5/assertion/expectToBeEnabled.spec.js +90 -0
  429. package/test/reuse/ui5/assertion/expectToBeNotEnabled.spec.js +62 -0
  430. package/test/reuse/ui5/assertion/expectToBeNotVisible.spec.js +52 -0
  431. package/test/reuse/ui5/assertion/expectToBeVisible.spec.js +69 -0
  432. package/test/reuse/ui5/assertion/expectToBeVisibleInViewport.spec.js +49 -0
  433. package/test/reuse/ui5/assertion/expectValidationError.spec.js +54 -0
  434. package/test/reuse/ui5/assertion/expectValidationSuccess.spec.js +53 -0
  435. package/test/reuse/ui5/assertion/expectValueToBe.spec.js +57 -0
  436. package/test/reuse/ui5/assertion/expectValueToBeDefined.spec.js +35 -0
  437. package/test/reuse/ui5/assertion/test.assertion.conf.js +28 -0
  438. package/test/reuse/ui5/assertion/test.assertion.sauceLab.conf.js +37 -0
  439. package/test/reuse/ui5/confirmationDialog/clickCancel.spec.js +88 -0
  440. package/test/reuse/ui5/confirmationDialog/clickCreate.spec.js +3 -0
  441. package/test/reuse/ui5/confirmationDialog/clickDelete.spec.js +89 -0
  442. package/test/reuse/ui5/confirmationDialog/clickNo.spec.js +96 -0
  443. package/test/reuse/ui5/confirmationDialog/clickOk.spec.js +66 -0
  444. package/test/reuse/ui5/confirmationDialog/clickRevokeApproval.spec.js +3 -0
  445. package/test/reuse/ui5/confirmationDialog/clickYes.spec.js +70 -0
  446. package/test/reuse/ui5/confirmationDialog/test.confirmationDialog.conf.js +20 -0
  447. package/test/reuse/ui5/confirmationDialog/test.confirmationDialog.sauceLab.conf.js +29 -0
  448. package/test/reuse/ui5/control/execute.spec.js +29 -0
  449. package/test/reuse/ui5/control/getAggregationProperty.spec.js +29 -0
  450. package/test/reuse/ui5/control/getAssociationProperty.spec.js +1 -0
  451. package/test/reuse/ui5/control/getBindingContextPathProperty.spec.js +30 -0
  452. package/test/reuse/ui5/control/getProperty.spec.js +30 -0
  453. package/test/reuse/ui5/control/getPropertyBinding.spec.js +30 -0
  454. package/test/reuse/ui5/control/test.control.conf.js +19 -0
  455. package/test/reuse/ui5/control/test.control.sauceLab.conf.js +30 -0
  456. package/test/reuse/ui5/date/fillRange.spec.js +53 -0
  457. package/test/reuse/ui5/date/pick.spec.js +136 -0
  458. package/test/reuse/ui5/date/pickRange.spec.js +143 -0
  459. package/test/reuse/ui5/date/test.date.conf.js +14 -0
  460. package/test/reuse/ui5/date/test.date.sauceLab.conf.js +26 -0
  461. package/test/reuse/ui5/element/getAllDisplayed.spec.js +71 -0
  462. package/test/reuse/ui5/element/getBindingValue.spec.js +78 -0
  463. package/test/reuse/ui5/element/getByChild.spec.js +124 -0
  464. package/test/reuse/ui5/element/getByParent.spec.js +134 -0
  465. package/test/reuse/ui5/element/getByText.spec.js +67 -0
  466. package/test/reuse/ui5/element/getDisplayed.spec.js +82 -0
  467. package/test/reuse/ui5/element/getId.spec.js +72 -0
  468. package/test/reuse/ui5/element/getPropertyValue.spec.js +91 -0
  469. package/test/reuse/ui5/element/highlight.spec.js +46 -0
  470. package/test/reuse/ui5/element/isVisible.spec.js +68 -0
  471. package/test/reuse/ui5/element/test.element.conf.js +22 -0
  472. package/test/reuse/ui5/element/test.element.sauceLab.conf.js +33 -0
  473. package/test/reuse/ui5/errorDialog/clickClose.spec.js +31 -0
  474. package/test/reuse/ui5/errorDialog/expectToBeVisible.spec.js +30 -0
  475. package/test/reuse/ui5/errorDialog/test.errorDialog.conf.js +13 -0
  476. package/test/reuse/ui5/errorDialog/test.errorDialog.sauceLab.conf.js +26 -0
  477. package/test/reuse/ui5/formatter/addRemoveLeadingZeros.spec.js +18 -0
  478. package/test/reuse/ui5/formatter/extractNumberFromString.spec.js +34 -0
  479. package/test/reuse/ui5/formatter/formatDate.spec.js +103 -0
  480. package/test/reuse/ui5/formatter/test.formatter.conf.js +14 -0
  481. package/test/reuse/ui5/formatter/test.formatter.sauceLab.conf.js +24 -0
  482. package/test/reuse/ui5/mockserver_qunit/Component.js +23 -0
  483. package/test/reuse/ui5/mockserver_qunit/LICENSE.txt +957 -0
  484. package/test/reuse/ui5/mockserver_qunit/NOTICE.txt +1 -0
  485. package/test/reuse/ui5/mockserver_qunit/controller/App.controller.js +37 -0
  486. package/test/reuse/ui5/mockserver_qunit/controller/BaseController.js +30 -0
  487. package/test/reuse/ui5/mockserver_qunit/controller/Home.controller.js +27 -0
  488. package/test/reuse/ui5/mockserver_qunit/controller/NotFound.controller.js +34 -0
  489. package/test/reuse/ui5/mockserver_qunit/controller/employee/Employee.controller.js +64 -0
  490. package/test/reuse/ui5/mockserver_qunit/controller/employee/EmployeeList.controller.js +22 -0
  491. package/test/reuse/ui5/mockserver_qunit/controller/employee/Resume.controller.js +83 -0
  492. package/test/reuse/ui5/mockserver_qunit/controller/employee/overview/EmployeeOverview.controller.js +11 -0
  493. package/test/reuse/ui5/mockserver_qunit/controller/employee/overview/EmployeeOverviewContent.controller.js +192 -0
  494. package/test/reuse/ui5/mockserver_qunit/i18n/i18n.properties +42 -0
  495. package/test/reuse/ui5/mockserver_qunit/index.html +21 -0
  496. package/test/reuse/ui5/mockserver_qunit/initMockServer.js +16 -0
  497. package/test/reuse/ui5/mockserver_qunit/localService/metadata.xml +61 -0
  498. package/test/reuse/ui5/mockserver_qunit/localService/mockdata/Employees.json +155 -0
  499. package/test/reuse/ui5/mockserver_qunit/localService/mockdata/Resumes.json +65 -0
  500. package/test/reuse/ui5/mockserver_qunit/localService/mockserver.js +146 -0
  501. package/test/reuse/ui5/mockserver_qunit/localService/mockserverLoadAllData.js +75 -0
  502. package/test/reuse/ui5/mockserver_qunit/manifest.json +169 -0
  503. package/test/reuse/ui5/mockserver_qunit/test/flpSandboxMockServer.html +63 -0
  504. package/test/reuse/ui5/mockserver_qunit/test/flpSandboxMockServerAllData.html +68 -0
  505. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/config.js +92 -0
  506. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/qunitExecution/specs/runQUnitTests.spec.js +14 -0
  507. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testDisplayNotFound/data/setup.json +11 -0
  508. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testDisplayNotFound/specs/testDisplayNotFound.spec.js +71 -0
  509. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testShowEmployeeList/data/mock/Employees.json +204 -0
  510. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testShowEmployeeList/data/mock/Resumes.json +114 -0
  511. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testShowEmployeeList/data/setup.json +11 -0
  512. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testShowEmployeeList/data/testShowEmployeeList.json +1 -0
  513. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/testShowEmployeeList/specs/testShowEmployeeList.spec.js +118 -0
  514. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/utils/constants.js +25 -0
  515. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/utils/mockDataMapper.js +23 -0
  516. package/test/reuse/ui5/mockserver_qunit/test/qmate/ui/utils/mockHelper.js +222 -0
  517. package/test/reuse/ui5/mockserver_qunit/test/unit/allTests.js +6 -0
  518. package/test/reuse/ui5/mockserver_qunit/test/unit/unitTests.qunit.html +38 -0
  519. package/test/reuse/ui5/mockserver_qunit/test/unit/utils/Conversions.js +13 -0
  520. package/test/reuse/ui5/mockserver_qunit/view/App.view.xml +9 -0
  521. package/test/reuse/ui5/mockserver_qunit/view/Home.view.xml +12 -0
  522. package/test/reuse/ui5/mockserver_qunit/view/NotFound.view.xml +11 -0
  523. package/test/reuse/ui5/mockserver_qunit/view/employee/Employee.view.xml +52 -0
  524. package/test/reuse/ui5/mockserver_qunit/view/employee/EmployeeList.view.xml +24 -0
  525. package/test/reuse/ui5/mockserver_qunit/view/employee/Resume.view.xml +35 -0
  526. package/test/reuse/ui5/mockserver_qunit/view/employee/ResumeHobbies.view.xml +3 -0
  527. package/test/reuse/ui5/mockserver_qunit/view/employee/ResumeNotes.view.xml +3 -0
  528. package/test/reuse/ui5/mockserver_qunit/view/employee/ResumeProjects.view.xml +3 -0
  529. package/test/reuse/ui5/mockserver_qunit/view/employee/overview/EmployeeOverview.view.xml +13 -0
  530. package/test/reuse/ui5/mockserver_qunit/view/employee/overview/EmployeeOverviewContent.view.xml +43 -0
  531. package/test/reuse/ui5/mockserver_qunit/view/employee/overview/EmployeeOverviewTop.view.xml +3 -0
  532. package/test/reuse/ui5/navigation/closePopups.spec.js +16 -0
  533. package/test/reuse/ui5/navigation/expectUnsupportedNavigationPopup.spec.js +81 -0
  534. package/test/reuse/ui5/navigation/navigateToApplication.spec.js +148 -0
  535. package/test/reuse/ui5/navigation/navigateToApplicationAndRetry.spec.js +153 -0
  536. package/test/reuse/ui5/navigation/navigateToApplicationWithQueryParams.spec.js +63 -0
  537. package/test/reuse/ui5/navigation/navigateToApplicationWithQueryParamsAndRetry.spec.js +64 -0
  538. package/test/reuse/ui5/navigation/navigateToSystemAndApplication.spec.js +45 -0
  539. package/test/reuse/ui5/navigation/navigateToSystemAndApplicationAndRetry.spec.js +43 -0
  540. package/test/reuse/ui5/navigation/test.navigation.conf.js +17 -0
  541. package/test/reuse/ui5/navigation/test.navigation.sauceLab.conf.js +33 -0
  542. package/test/reuse/ui5/navigation/test.navigation.static.conf.js +34 -0
  543. package/test/reuse/ui5/navigation/test.navigation.static.sauceLab.conf.js +41 -0
  544. package/test/reuse/ui5/navigation/website/main.css +36 -0
  545. package/test/reuse/ui5/navigation/website/main.html +50 -0
  546. package/test/reuse/ui5/navigationBar/clickBack.spec.js +38 -0
  547. package/test/reuse/ui5/navigationBar/clickUserIcon.spec.js +36 -0
  548. package/test/reuse/ui5/navigationBar/expectPageTitle.spec.js +22 -0
  549. package/test/reuse/ui5/navigationBar/expectShellHeader.spec.js +22 -0
  550. package/test/reuse/ui5/navigationBar/test.navigationBar.conf.js +17 -0
  551. package/test/reuse/ui5/navigationBar/test.navigationBar.sauceLab.conf.js +28 -0
  552. package/test/reuse/ui5/session/login.spec.js +78 -0
  553. package/test/reuse/ui5/session/loginFiori.spec.js +52 -0
  554. package/test/reuse/ui5/session/loginSapCloud.spec.js +51 -0
  555. package/test/reuse/ui5/session/logout.spec.js +48 -0
  556. package/test/reuse/ui5/session/switchUser.spec.js +48 -0
  557. package/test/reuse/ui5/session/test.session.conf.js +20 -0
  558. package/test/reuse/ui5/session/test.session.sauceLab.conf.js +29 -0
  559. package/test/reuse/ui5/table/clickSettingsButton.spec.js +58 -0
  560. package/test/reuse/ui5/table/sortColumnAscending.spec.js +84 -0
  561. package/test/reuse/ui5/table/sortColumnDescending.spec.js +84 -0
  562. package/test/reuse/ui5/table/test.table.conf.js +14 -0
  563. package/test/reuse/ui5/table/test.table.sauceLab.conf.js +25 -0
  564. package/test/reuse/ui5/table/test.table.sauceLab.tunnel.conf.js +25 -0
  565. package/test/reuse/ui5/userInteraction/clear.spec.js +75 -0
  566. package/test/reuse/ui5/userInteraction/clearAndFill.spec.js +157 -0
  567. package/test/reuse/ui5/userInteraction/clearAndFillAndRetry.spec.js +132 -0
  568. package/test/reuse/ui5/userInteraction/clearAndFillSmartFieldInput.spec.js +73 -0
  569. package/test/reuse/ui5/userInteraction/clearAndRetry.spec.js +57 -0
  570. package/test/reuse/ui5/userInteraction/click.spec.js +73 -0
  571. package/test/reuse/ui5/userInteraction/clickAndRetry.spec.js +52 -0
  572. package/test/reuse/ui5/userInteraction/clickSelectArrow.spec.js +87 -0
  573. package/test/reuse/ui5/userInteraction/clickSelectArrowAndRetry.spec.js +147 -0
  574. package/test/reuse/ui5/userInteraction/clickTab.spec.js +59 -0
  575. package/test/reuse/ui5/userInteraction/doubleClick.spec.js +73 -0
  576. package/test/reuse/ui5/userInteraction/dragAndDrop.spec.js +34 -0
  577. package/test/reuse/ui5/userInteraction/fill.spec.js +114 -0
  578. package/test/reuse/ui5/userInteraction/fillAndRetry.spec.js +120 -0
  579. package/test/reuse/ui5/userInteraction/mouseOverElement.spec.js +55 -0
  580. package/test/reuse/ui5/userInteraction/openF4Help.spec.js +56 -0
  581. package/test/reuse/ui5/userInteraction/rightClick.spec.js +72 -0
  582. package/test/reuse/ui5/userInteraction/scrollToElement.spec.js +89 -0
  583. package/test/reuse/ui5/userInteraction/searchFor.spec.js +155 -0
  584. package/test/reuse/ui5/userInteraction/selectBox.spec.js +128 -0
  585. package/test/reuse/ui5/userInteraction/selectCombobox.spec.js +115 -0
  586. package/test/reuse/ui5/userInteraction/selectMultiComboBox.spec.js +155 -0
  587. package/test/reuse/ui5/userInteraction/test.userInteraction.conf.js +35 -0
  588. package/test/reuse/ui5/userInteraction/test.userInteraction.sauceLab.conf.js +46 -0
  589. package/test/reuse/util/browser/back.spec.js +32 -0
  590. package/test/reuse/util/browser/clearBrowser.spec.js +35 -0
  591. package/test/reuse/util/browser/executeScript.spec.js +49 -0
  592. package/test/reuse/util/browser/getBaseUrl.spec.js +13 -0
  593. package/test/reuse/util/browser/getBrowserName.spec.js +18 -0
  594. package/test/reuse/util/browser/getCurrentUrl.spec.js +34 -0
  595. package/test/reuse/util/browser/getCurrentWindow.spec.js +42 -0
  596. package/test/reuse/util/browser/getUI5Version.spec.js +31 -0
  597. package/test/reuse/util/browser/logCurrentUrl.spec.js +23 -0
  598. package/test/reuse/util/browser/refresh.spec.js +52 -0
  599. package/test/reuse/util/browser/setBaseUrl.spec.js +13 -0
  600. package/test/reuse/util/browser/switchToDefaultContent.spec.js +34 -0
  601. package/test/reuse/util/browser/switchToIframe.spec.js +29 -0
  602. package/test/reuse/util/browser/switchToNewWindow.spec.js +142 -0
  603. package/test/reuse/util/browser/switchToWindow.spec.js +57 -0
  604. package/test/reuse/util/browser/test.browser.conf.js +27 -0
  605. package/test/reuse/util/data/data/test.json +3 -0
  606. package/test/reuse/util/data/data/test.secure.json +11 -0
  607. package/test/reuse/util/data/decrypt.spec.js +15 -0
  608. package/test/reuse/util/data/getData.spec.js +15 -0
  609. package/test/reuse/util/data/getSecureData.spec.js +57 -0
  610. package/test/reuse/util/data/test.data.conf.js +22 -0
  611. package/test/reuse/util/file/file.spec.js +90 -0
  612. package/test/reuse/util/file/pdfParser.spec.js +55 -0
  613. package/test/reuse/util/file/test.file.conf.js +15 -0
  614. package/test/reuse/util/file/testFiles/sample.pdf +198 -0
  615. package/test/reuse/util/file/testFiles/test.txt +5 -0
  616. package/test/reuse/util/file/testFiles/test2.txt +2 -0
  617. package/test/reuse/util/formatter/addRemoveLeadingZeros.spec.js +38 -0
  618. package/test/reuse/util/formatter/extractNumberFromString.spec.js +67 -0
  619. package/test/reuse/util/formatter/formatDate.spec.js +150 -0
  620. package/test/reuse/util/formatter/sliceStringAfter.spec.js +62 -0
  621. package/test/reuse/util/formatter/sliceStringAt.spec.js +62 -0
  622. package/test/reuse/util/formatter/stringifyJSON.spec.js +24 -0
  623. package/test/reuse/util/formatter/test.formatter.conf.js +20 -0
  624. package/test/reuse/util/formatter/trimString.spec.js +37 -0
  625. package/tsconfig.json +26 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Regression testing of data import, checks if data loaded into browser.params.import
3
+ * match the actual data in the files.
4
+ */
5
+
6
+ // using chai assertion framework in this spec (instead of the default which is "jest"),
7
+ // since jest is not available inside the outer "describe" block
8
+ const { assert } = require("chai");
9
+
10
+ const utils = require("../utils.js");
11
+
12
+ describe("Import Data", function () {
13
+
14
+ // load the actual files for comparison against data imported by import, export module in
15
+ // importExportData.js
16
+ // Refer to config.import.js
17
+ // params : {
18
+ // import: { // Verzeichnis Pfad
19
+ // myFolder1: "./data/my/folder/data/qs9",
20
+ // myFolder2: "data/another/folder/data/anotherFolder",
21
+ // myMissingFolder: "./data/my/folder/missing",
22
+ // // Eine Datei Pfad (Best Practice should be the same as the script) .....
23
+ // yourPrefixSpecName: "./data/my/folder/data/qs9/data.json",
24
+ // missingFile: "./data/my/folder/missingFile.json",
25
+ // invalidJsonFile: "./data/my/folder/invalid.json",
26
+ // uiUser: "./data/my/folder/data/qs9/webUser.json",
27
+ // emptyObject: "./data/my/folder/data/qs9/empty.json"
28
+ // },
29
+ // }
30
+ const myFolder1 = "./data/my/folder/data/qs9";
31
+ const myFolder2 = "data/another/folder/data/anotherFolder";
32
+ const yourPrefixSpecName = "./data/my/folder/data/qs9/data.json";
33
+ const uiUser = "./data/my/folder/data/qs9/webUser.json";
34
+
35
+ // regression test to check that data has been imported in
36
+ // beforeSession hook
37
+ // check if data is available in "describe" and not in "it" block
38
+ assert(browser.params.import.myFolder1, "myFolder1 not imported");
39
+ assert(browser.params.import.myFolder2, "myFolder2 not imported");
40
+
41
+ it("step 1: check presence of import config params", async function () {
42
+
43
+ // folders and valid json files should be loaded
44
+ // missing or inaccessible folders, non-json files, and invalid json files
45
+ // should not be loaded
46
+ await common.assertion.expectDefined(browser.params.import.myFolder1);
47
+ await common.assertion.expectDefined(browser.params.import.myFolder2);
48
+ await common.assertion.expectUndefined(browser.params.import.myMissingFolder);
49
+ await common.assertion.expectDefined(browser.params.import.yourPrefixSpecName);
50
+ await common.assertion.expectUndefined(browser.params.import.missingFile);
51
+ await common.assertion.expectUndefined(browser.params.import.invalidJsonFile);
52
+ await common.assertion.expectDefined(browser.params.import.uiUser);
53
+ await common.assertion.expectEqual(browser.params.import.emptyObject === null, true);
54
+
55
+ });
56
+
57
+ it("step 2: check if files in 'myFolder1' folder are read", async function () {
58
+ // check if json files and subfolders in myFolder1 (i.e. "./data/my/folder/data/qs9")
59
+ // are read and added to browser.params.import.myFolder1
60
+ await utils.checkImportFolder(myFolder1, "myFolder1");
61
+
62
+ });
63
+
64
+ it("step 3: check if files in 'myFolder2' folder are read", async function () {
65
+ // check if json files and subfolders in myFolder2 (i.e. "data/another/folder/data/anotherFolder")
66
+ // are read and added to browser.params.import.myFolder2
67
+ await utils.checkImportFolder(myFolder2, "myFolder2");
68
+
69
+ });
70
+ it("step 4: check imported data from 'myFolder1'", async function () {
71
+ // check if json data in file purchaseRequisition.json in myFolder1 (i.e. "./data/my/folder/data/qs9")
72
+ // has been read and added to browser.params.import.myFolder1.purchaseRequisition
73
+ await utils.checkImportedData(myFolder1, ["myFolder1"], "purchaseRequisition");
74
+
75
+ });
76
+ it("step 5: check imported data from 'myFolder2'", async function () {
77
+ // check if json data in file purchaseRequisition_HI.json in myFolder2 (i.e. "data/another/folder/data/anotherFolder")
78
+ // has been read and added to browser.params.import.myFolder2.purchaseRequisition_HI
79
+ await utils.checkImportedData(myFolder2, ["myFolder2"], "purchaseRequisition_HI");
80
+
81
+ });
82
+ it("step 6: check imported data for file 'yourPrefixSpecName'", async function () {
83
+ // check if json data in file pointed to by "yourPrefixSpecName" (i.e. "./data/my/folder/data/qs9/data.json")
84
+ // has been read and added to browser.params.import.yourPrefixSpecName
85
+ await utils.checkImportedDataFromFile(yourPrefixSpecName, "yourPrefixSpecName");
86
+
87
+ });
88
+ it("step 7: check imported data for file 'uiUser'", async function () {
89
+ // check if json data in file pointed to by "uiUser" (i.e. "./data/my/folder/data/qs9/webUser.json")
90
+ // has been read and added to browser.params.import.uiUser
91
+ await utils.checkImportedDataFromFile(uiUser, "uiUser");
92
+
93
+ });
94
+ it("step 8: check invalid json is not loaded", async function () {
95
+ await common.assertion.expectUndefined(browser.params.import["invalidJsonFile"]);
96
+
97
+ });
98
+ it("step 9: check missing file is not loaded", async function () {
99
+ await common.assertion.expectUndefined(browser.params.import["missingFile"]);
100
+
101
+ });
102
+ it("step 10: check missing folder is not loaded", async function () {
103
+ await common.assertion.expectUndefined(browser.params.import["missingFolder"]);
104
+
105
+ });
106
+ it("step 11: check files in subfolder are loaded", async function () {
107
+ // check if data in LimitPurchaseOrder.json in subfolder "data/another/folder/data/anotherFolder/subfolder" has
108
+ // been read and is available in browser.params.import.myFolder2.subfolder.LimitPurchaseOrder
109
+ await utils.checkImportedData(myFolder2, ["myFolder2", "subfolder"], "LimitPurchaseOrder");
110
+
111
+ // check if data in PurchaseOrderWithScheduline.json in subfolder "data/another/folder/data/anotherFolder/subfolder" has
112
+ // been read and is available in browser.params.import.myFolder2.subfolder.PurchaseOrderWithScheduline
113
+ await utils.checkImportedData(myFolder2, ["myFolder2", "subfolder"], "PurchaseOrderWithScheduline");
114
+
115
+ });
116
+
117
+ it("step 12: check if JSON file with array is loaded", async function () {
118
+ // check if data in PurchaseOrderItems.json in subfolder "data/another/folder/data/anotherFolder/subfolder" has
119
+ // been read and is available in browser.params.import.myFolder2.subfolder.PurchaseOrderItems
120
+ await utils.checkImportedData(myFolder2, ["myFolder2", "subfolder"], "PurchaseOrderItems");
121
+
122
+ // check if this is an array
123
+ const poItems = browser.params.import.myFolder2.subfolder.PurchaseOrderItems;
124
+ await common.assertion.expectEqual(Array.isArray(poItems), true);
125
+ });
126
+
127
+ it("step 13: check if subfolders with special characters in their names are loaded", async function () {
128
+
129
+ await common.assertion.expectDefined(browser.params.import.myFolder2["purchase-orders"]);
130
+
131
+ });
132
+ it("step 14: check files with special characters in their names are loaded", async function () {
133
+ // check if data in Limit-Purchase-Order.json in subfolder "data/another/folder/data/anotherFolder/purchase-orders" has
134
+ // been read and is available in browser.params.import.myFolder2["purchase-orders"]["Limit-Purchase-Order"]
135
+ await utils.checkImportedData(myFolder2, ["myFolder2", "purchase-orders"], "Limit-Purchase-Order");
136
+
137
+ // check if data in ServicePurchaseOrder.2Items.json in subfolder "data/another/folder/data/anotherFolder/purchase-orders" has
138
+ // been read and is available in browser.params.import.myFolder2["purchase-orders"]["ServicePurchaseOrder.2Items"]
139
+
140
+ await utils.checkImportedData(myFolder2, ["myFolder2", "purchase-orders"], "ServicePurchaseOrder.2Items");
141
+
142
+ });
143
+
144
+ });
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Regression testing
3
+ * Use imported data to fill forms, and export test data
4
+ */
5
+ const formUtils = {
6
+ textSelector: {
7
+ "elementProperties": {
8
+ "viewName": "sap.m.sample.InputTypes.V",
9
+ "metadata": "sap.m.Input",
10
+ "type": "Text"
11
+ }
12
+ },
13
+ emailSelector: {
14
+ "elementProperties": {
15
+ "viewName": "sap.m.sample.InputTypes.V",
16
+ "metadata": "sap.m.Input",
17
+ "type": "Email"
18
+ }
19
+ },
20
+ telephoneSelector: {
21
+ "elementProperties": {
22
+ "viewName": "sap.m.sample.InputTypes.V",
23
+ "metadata": "sap.m.Input",
24
+ "type": "Tel"
25
+ }
26
+ },
27
+ numberSelector: {
28
+ "elementProperties": {
29
+ "viewName": "sap.m.sample.InputTypes.V",
30
+ "metadata": "sap.m.Input",
31
+ "type": "Number"
32
+ }
33
+ },
34
+ urlSelector: {
35
+ "elementProperties": {
36
+ "viewName": "sap.m.sample.InputTypes.V",
37
+ "metadata": "sap.m.Input",
38
+ "type": "Url"
39
+ }
40
+ },
41
+ fillForm: async function (description, userData) {
42
+ await ui5.element.waitForAll(this.textSelector);
43
+ await ui5.userInteraction.fill(this.textSelector, description);
44
+ await ui5.userInteraction.fill(this.emailSelector, userData.email);
45
+ await ui5.userInteraction.fill(this.telephoneSelector, userData.telephone);
46
+ await ui5.userInteraction.fill(this.numberSelector, userData.amount);
47
+ await ui5.userInteraction.fill(this.urlSelector, userData.website);
48
+ },
49
+ clearForm: async function () {
50
+ await ui5.userInteraction.clear(this.textSelector);
51
+ await ui5.userInteraction.clear(this.emailSelector);
52
+ await ui5.userInteraction.clear(this.telephoneSelector);
53
+ await ui5.userInteraction.clear(this.numberSelector);
54
+ await ui5.userInteraction.clear(this.urlSelector);
55
+ }
56
+ };
57
+
58
+
59
+ describe("Import and Export using UI", function () {
60
+
61
+
62
+ // config params
63
+ // import: { //import data
64
+ // myUserPrefix: "./data/ui/user.json",
65
+ // userDataFolder: "./data/ui",
66
+ // uiUser: "./data/ui/webUser.json",
67
+ // },
68
+ // export: { //Export
69
+ // exportData: "./data/ui/export/exportedUser.json",
70
+ // webUser : "./data/ui/export/exportedWebUser.json"
71
+ // },
72
+ it("step 1: use data loaded into myUserPrefix", async function () {
73
+
74
+ // uses data from file pointed to by myUserPrefix
75
+ // myUserPrefix: "./data/ui/user.json",
76
+ await ui5.navigation.navigateToApplication("", false);
77
+ const acceptCookiesButton = {
78
+ "elementProperties": {
79
+ "viewName": "sap.ui.documentation.sdk.view.App",
80
+ "metadata": "sap.m.Button",
81
+ "text": [{
82
+ "path": "i18n>COOKIE_SETTINGS_DIALOG_FUNCTIONAL_COOKIES_ACCEPT_ALL"
83
+ }]
84
+ }
85
+ };
86
+ try {
87
+ await ui5.userInteraction.click(acceptCookiesButton);
88
+ } catch (e) {
89
+ // ignore, no cookie dialog
90
+ }
91
+ await nonUi5.element.switchToIframe("iframe[id='sampleFrame']");
92
+
93
+ const userData = browser.params.import.myUserPrefix;
94
+ await common.assertion.expectDefined(userData);
95
+
96
+ await common.assertion.expectDefined(userData.email);
97
+ await common.assertion.expectDefined(userData.telephone);
98
+ await common.assertion.expectDefined(userData.amount);
99
+ await common.assertion.expectDefined(userData.website);
100
+
101
+ await formUtils.fillForm("Data from myUserPrefix", userData);
102
+
103
+ await formUtils.clearForm();
104
+
105
+ });
106
+
107
+ it("step 2: use data loaded from file in subfolder moreDataFolder - anotherUser.json", async function () {
108
+
109
+ // file anotherUser.json is in subfolder "moreDataFolder" within directory pointed to by userDataFolder
110
+ // userDataFolder: "./data/ui",
111
+ const userDataFolder = browser.params.import.userDataFolder;
112
+ await common.assertion.expectDefined(userDataFolder);
113
+ const moreDataFolder = browser.params.import.userDataFolder.moreDataFolder;
114
+ await common.assertion.expectDefined(moreDataFolder);
115
+ const anotherUser = browser.params.import.userDataFolder.moreDataFolder.anotherUser;
116
+ await common.assertion.expectDefined(anotherUser);
117
+
118
+ await common.assertion.expectDefined(anotherUser.email);
119
+ await common.assertion.expectDefined(anotherUser.telephone);
120
+ await common.assertion.expectDefined(anotherUser.amount);
121
+ await common.assertion.expectDefined(anotherUser.website);
122
+
123
+ await formUtils.fillForm("Data from anotherUser.json in moreDataFolder", anotherUser);
124
+
125
+ await formUtils.clearForm();
126
+
127
+ });
128
+ it("step 3: use data loaded into uiUser", async function () {
129
+
130
+ // uses data from file pointed to by reference
131
+ // uiUser: "./data/ui/webUser.json"
132
+ const userData = browser.params.import.uiUser;
133
+ await common.assertion.expectDefined(userData);
134
+
135
+ await common.assertion.expectDefined(userData.email);
136
+ await common.assertion.expectDefined(userData.telephone);
137
+ await common.assertion.expectDefined(userData.amount);
138
+ await common.assertion.expectDefined(userData.website);
139
+
140
+ await formUtils.fillForm("Data from uiUser", userData);
141
+
142
+ await formUtils.clearForm();
143
+
144
+ });
145
+
146
+ it("step 4: export data into file pointed to by exportData param", async function () {
147
+
148
+ const dateAdded = (new Date()).toISOString();
149
+ const userData = {
150
+ "exportedOn": dateAdded,
151
+ "description": "Should be in file export/exportedUser.json",
152
+ "email": "joe.exported@example.com",
153
+ "telephone": "11-2233445566",
154
+ "amount": 458,
155
+ "website": "http://www.exportedUser.test"
156
+
157
+ };
158
+
159
+ // assign the data to export param so that it gets written to file pointed to by "exportData"
160
+ // exportData: "./data/ui/export/exportedUser.json",
161
+ browser.params.export.exportData = userData;
162
+
163
+ await common.assertion.expectDefined(browser.params.export.exportData.description);
164
+ await common.assertion.expectDefined(browser.params.export.exportData.email);
165
+ await common.assertion.expectDefined(browser.params.export.exportData.telephone);
166
+ await common.assertion.expectDefined(browser.params.export.exportData.amount);
167
+ await common.assertion.expectDefined(browser.params.export.exportData.website);
168
+
169
+ });
170
+
171
+ it("step 5: export data into file pointed to by webUser param", async function () {
172
+
173
+
174
+ const dateAdded = (new Date()).toISOString();
175
+ const userData = {
176
+ "exportedOn": dateAdded,
177
+ "description": "Should be in file export/exportedWebUser.json",
178
+ "email": "joe.webuser@example.com",
179
+ "telephone": "333-000-111-222",
180
+ "amount": 4.79,
181
+ "website": "http://www.webuser.test"
182
+
183
+ };
184
+ // assign the data to export param so that it gets written to file pointed to by "refUser"
185
+ // webUser : "./data/ui/export/exportedWebUser.json"
186
+ browser.params.export.webUser = userData;
187
+
188
+ await common.assertion.expectDefined(browser.params.export.webUser.description);
189
+ await common.assertion.expectDefined(browser.params.export.webUser.email);
190
+ await common.assertion.expectDefined(browser.params.export.webUser.telephone);
191
+ await common.assertion.expectDefined(browser.params.export.webUser.amount);
192
+ await common.assertion.expectDefined(browser.params.export.webUser.website);
193
+
194
+ });
195
+
196
+ });
@@ -0,0 +1,160 @@
1
+ /* eslint-disable no-console */
2
+ const fs = require("fs-extra");
3
+ const path = require("path");
4
+ const dataExchangeUtil = require("../../../lib/scripts/dataExchange/dataExchangeUtil");
5
+
6
+ /**
7
+ * Utility functions for regression testing of import and export of data.
8
+ * These read data from folders and files, and check against imported data.
9
+ * Or make data from file available for export.
10
+ *
11
+ */
12
+ const utilsMethods = {
13
+
14
+ /**
15
+ * @function checkImportFolder - check if json files and subfolders in specified folderPath
16
+ * have been imported under the specified key.
17
+ * @param {string} folderPath - the folder to read
18
+ * @param {string} paramName - the key to check against
19
+ * @example const myFolder1 = "./data/my/folder/data/qs9";
20
+ * await utils.checkImportFolder(myFolder1, "myFolder1");
21
+ *
22
+ */
23
+ checkImportFolder: async function (folderPath, paramName) {
24
+ folderPath = dataExchangeUtil.getFileAbsPath(folderPath);
25
+ let files = [];
26
+ try {
27
+ files = await fs.readdir(folderPath, { withFileTypes: true });
28
+ } catch (err) {
29
+ console.error(err);
30
+ await common.assertion.expectEqual(true, false);
31
+ }
32
+ // filter out json files
33
+ const jsonFiles = files.filter((file) => !file.isDirectory() && file.name.match(/\.json$/) !== null);
34
+ const jsonFilePrefixes = jsonFiles.map(file => file.name.replace(/^(.*)\.json$/, "$1"));
35
+ const nonJsonFiles = files.filter((file) => !file.isDirectory() && file.name.match(/\.json$/) === null);
36
+ const nonJsonFilePrefixes = nonJsonFiles.map(file => file.name.replace(/^(.*)\.*$/, "$1"));
37
+
38
+ // get the subfolders
39
+ let subfolders = files.filter((file) => file.isDirectory());
40
+ subfolders = subfolders.map(file => file.name);
41
+
42
+ // check if the json files have been loaded into browser.params.import
43
+ const browserParamKeys = Object.keys(browser.params.import[paramName]);
44
+
45
+ for (let i = 0; i < jsonFilePrefixes.length; i++) {
46
+ const prefix = jsonFilePrefixes[i];
47
+ await common.assertion.expectUnequal(browserParamKeys.indexOf(prefix), -1);
48
+ }
49
+
50
+ // check if non json files are absent in browser.params.import
51
+ for (let i = 0; i < nonJsonFilePrefixes.length; i++) {
52
+ const prefix = nonJsonFilePrefixes[i];
53
+ await common.assertion.expectEqual(browserParamKeys.indexOf(prefix), -1);
54
+ }
55
+
56
+ //check if subfolders are present
57
+ for (let i = 0; i < subfolders.length; i++) {
58
+ const folder = subfolders[i];
59
+ await common.assertion.expectUnequal(browserParamKeys.indexOf(folder), -1);
60
+ }
61
+ },
62
+
63
+ /**
64
+ * @function checkImportedData - check if data from json file specified by jsonFilePrefix under
65
+ * folderPath has been added using the params key. In the example below data from
66
+ * "./data/my/folder/data/qs9/subfolder/LimitPurchaseOrder.json" is checked if present in
67
+ * browser.params.import.myFolder1.subfolder.LimitPurchaseOrder
68
+ * @param {string} folderPath - the folder path
69
+ * @param {string[]} params - array of keys
70
+ * @param {string} jsonFilePrefix - the prefix of json file.
71
+ * @example const myFolder1 = "./data/my/folder/data/qs9";
72
+ * await utils.checkImportedData(myFolder1, ["myFolder1","subfolder"], "LimitPurchaseOrder");
73
+ */
74
+ checkImportedData: async function (folderPath, params, jsonFilePrefix) {
75
+ folderPath = dataExchangeUtil.getFileAbsPath(folderPath);
76
+
77
+ //include subfolders
78
+ params.forEach((param, idx) => {
79
+ if (idx > 0) folderPath = path.resolve(folderPath, param);
80
+ });
81
+ const fileWithPath = path.resolve(folderPath, jsonFilePrefix + ".json");
82
+ let data;
83
+ try {
84
+ data = await dataExchangeUtil.readJson(fileWithPath);
85
+ } catch (err) {
86
+ console.error(err);
87
+ await common.assertion.expectEqual(true, false);
88
+ }
89
+
90
+ let importedData = browser.params.import;
91
+ params.forEach(param => {
92
+ importedData = importedData[param] || {};
93
+ });
94
+ //check if the json files have been loaded into browser.params.import
95
+ importedData = importedData[jsonFilePrefix];
96
+ //can't find a method in ui5.assertion to check if two JSON objects match
97
+ // await common.assertion.expectEqual(importedData, data);
98
+ await expect(importedData).toEqual(data);
99
+
100
+ },
101
+ /**
102
+ * @function checkImportedDataFromFile - check if data from specified file is available under
103
+ * the specified key
104
+ * @param {string} fileWithPath - file with path
105
+ * @param {string} paramName - the key to use
106
+ * @example const yourPrefixSpecName = "./data/my/folder/data/qs9/data.json";
107
+ * await await utils.checkImportedDataFromFile(yourPrefixSpecName, "yourPrefixSpecName");
108
+ */
109
+ checkImportedDataFromFile: async function (fileWithPath, paramName) {
110
+ fileWithPath = dataExchangeUtil.getFileAbsPath(fileWithPath);
111
+
112
+ let data;
113
+ try {
114
+ data = await dataExchangeUtil.readJson(fileWithPath);
115
+ } catch (err) {
116
+ console.error(err);
117
+ await common.assertion.expectEqual(true, false);
118
+ }
119
+
120
+ //check if the json files have been loaded into browser.params.import
121
+ const importedData = browser.params.import[paramName];
122
+ // await common.assertion.expectEqual(importedData, data);
123
+ await expect(importedData).toEqual(data);
124
+
125
+ },
126
+
127
+ /**
128
+ * @function exportData - copy data in json file specified by jsonFilePrefix, in specifed folderPath
129
+ * to browser.params.export under key specified by exportParamName
130
+ * @param {string} folderPath - the folder path
131
+ * @param {string} jsonFilePrefix - the json file prefix
132
+ * @param {string} exportParamName - the key to use. In the example below, browser.params.export.exportMoreData
133
+ * will have data from "./data/my/folder/data/anotherFolder/subfolder/ServicePurchaseOrder.json", which
134
+ * at the end of the test run will be written to "./data/my/folder/path/in/moreDataFile.json"
135
+ * @example const exportMoreData = "./data/my/folder/path/in/moreDataFile.json";
136
+ * const subfolder = "./data/my/folder/data/anotherFolder/subfolder";
137
+ * await utils.exportData(subfolder, "ServicePurchaseOrder", "exportMoreData");
138
+ */
139
+ exportData: async function (folderPath, jsonFilePrefix, exportParamName) {
140
+ folderPath = dataExchangeUtil.getFileAbsPath(folderPath);
141
+
142
+ const fileWithPath = path.resolve(folderPath, jsonFilePrefix + ".json");
143
+ let data;
144
+ try {
145
+ data = await dataExchangeUtil.readJson(fileWithPath);
146
+ } catch (err) {
147
+ console.error(err);
148
+ await common.assertion.expectEqual(true, false);
149
+ }
150
+
151
+ // assign data to browser.params.export, so that it gets written to export file
152
+ // at end of test.
153
+ // make sure any other data previously in browser.params.export
154
+ // against the specified key are not lost,
155
+ // unless you really don't want them
156
+ browser.params.export[exportParamName] = { ...browser.params.export[exportParamName], ...data };
157
+
158
+ }
159
+ };
160
+ module.exports = utilsMethods;
@@ -0,0 +1,30 @@
1
+ # Functional tests
2
+
3
+ ### Main goals of *tests/qmate/functional* test folder is to cover [Qmate WDIO API](../../documentation/topics/locators.md) with tests:
4
+
5
+ - Test locators and how we can access locators via `browser.uiControl()` and `browser.uiControls()`.
6
+ - Test all methods (custom commands) from [scripts/hooks/utils/addLocatorCommands.js](../../scripts/hooks/utils/locatorCommands.js) (`getUi5Aggregation()`, `getProperties()` etc.)
7
+ - Test corner cases (provide wrong 'elementProperties', try to enter a value to a label, try to click non-clickable element etc.) to check error handling inside custom commands
8
+
9
+ #### /locators:
10
+
11
+ - Test only selectors (locators) - `uiControl()` method
12
+ - Try all combinations of `elementProperties`, `ancestorProperties`, `descendantProperties` etc.
13
+
14
+ #### /ui5Properties:
15
+
16
+ - Test custom commands: `getUi5Aggregation()`, `getUi5Properties()` etc. on both element and browser levels
17
+
18
+ #### /chaining:
19
+
20
+ - Test chaining (work on both browser and element levels):
21
+ ```js
22
+ const list = await browser.uiControl(ui5ControlProperties);
23
+ const firstIitem = await list.uiControl(ui5ControlProperties2, 0);
24
+ ```
25
+
26
+ #### /nonUi5:
27
+ - access UI elements via DOM properties (id, class, li etc.)
28
+
29
+ #### /nativeBrowser:
30
+ - test method `controlActionInBrowser`
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ describe("webdriver.io page", function () {
3
+
4
+ this.beforeAll(async () => {
5
+ await browser.url("#/categories");
6
+ });
7
+
8
+ it("step 0:click on item Accessories - Use array controls", async function () {
9
+ const ui5ControlProperties = {
10
+ "elementProperties": { "metadata": "sap.m.List", "items": [{ "path": "/ProductCategories" }] },
11
+ "parentProperties": { "metadata": "sap.m.Page", "title": [{ "path": "i18n>homeTitle" }] }
12
+ };
13
+ const ui5ControlProperties2 = {
14
+ "elementProperties": {
15
+ "metadata": "sap.m.StandardListItem",
16
+ "title": [{ "path": "CategoryName" }],
17
+ "bindingContextPath": "/ProductCategories*"
18
+ }
19
+ };
20
+
21
+ const list = await browser.uiControl(ui5ControlProperties);
22
+ const allItems = await list.uiControls(ui5ControlProperties2);
23
+
24
+ expect(allItems).toBeInstanceOf(Array);
25
+ await expect(allItems[0]).toBeDisplayed();
26
+ await allItems[0].click();
27
+ });
28
+
29
+ it("step 1:navigate back to main page", async function () {
30
+ const ui5ControlProperties = {
31
+ "elementProperties": {
32
+ "viewName": "sap.ui.demo.cart.view.Category",
33
+ "metadata": "sap.ui.core.Icon",
34
+ "id": "*page-navButton-iconBtn"
35
+ }
36
+ };
37
+ const backToListBtn = await browser.uiControl(ui5ControlProperties);
38
+ await expect(backToListBtn).toBeClickable();
39
+ await backToListBtn.click();
40
+ });
41
+
42
+ it("step 2:click on item Accessories - Use control and index", async function () {
43
+ const ui5ControlProperties = {
44
+ "elementProperties": { "metadata": "sap.m.List", "items": [{ "path": "/ProductCategories" }] },
45
+ "parentProperties": { "metadata": "sap.m.Page", "title": [{ "path": "i18n>homeTitle" }] }
46
+ };
47
+ const ui5ControlProperties2 = {
48
+ "elementProperties": {
49
+ "metadata": "sap.m.StandardListItem",
50
+ "title": [{ "path": "CategoryName" }],
51
+ "bindingContextPath": "/ProductCategories*"
52
+ }
53
+ };
54
+ const list = await browser.uiControl(ui5ControlProperties);
55
+ const item1 = await list.uiControl(ui5ControlProperties2, 0);
56
+ const item2 = await list.uiControl(ui5ControlProperties2, 1);
57
+ // expect(ui5ControlProperties2).toBeInstanceOf(Object); use check for item1?
58
+ await expect(await item1.getAttribute("id")).not.toBeNull();
59
+ await expect(await item2.getAttribute("id")).not.toBeNull();
60
+ await item2.click();
61
+ });
62
+
63
+ it("step 3:click on item Accessories - Use control and index", async function () {
64
+ const ui5ControlProperties = {
65
+ "elementProperties": {
66
+ "viewName": "sap.ui.demo.cart.view.Category",
67
+ "metadata": "sap.m.Page",
68
+ "id": "*page"
69
+ }
70
+ };
71
+ const ui5ControlProperties2 = {
72
+ "elementProperties": {
73
+ "viewName": "sap.ui.demo.cart.view.Category",
74
+ "metadata": "sap.m.ObjectListItem",
75
+ "bindingContextPath": "/Products*'HT-1114')"
76
+ }
77
+ };
78
+ const ui5ControlProperties3 = {
79
+ "elementProperties": {
80
+ "viewName": "sap.ui.demo.cart.view.Category",
81
+ "metadata": "sap.m.Button",
82
+ "id": "*page-navButton"
83
+ }
84
+ };
85
+ const productList = await browser.uiControl(ui5ControlProperties);
86
+ const item = await productList.uiControl(ui5ControlProperties2);
87
+ const backButton = await productList.uiControl(ui5ControlProperties3);
88
+ await expect(await item.getAttribute("id")).not.toBeNull();
89
+ await item.click();
90
+ await expect(backButton).toBeDisplayedInViewport();
91
+ await expect(await backButton.getAttribute("id")).not.toBeNull();
92
+ await backButton.click();
93
+
94
+ });
95
+
96
+ it("step 4:fill search field in Categories - Use control and index", async function () {
97
+ const ui5ControlProperties = {
98
+ "elementProperties": {
99
+ "viewName": "sap.ui.demo.cart.view.Home",
100
+ "metadata": "sap.m.Toolbar",
101
+ "id": "*searchBar33343"
102
+ }
103
+ };
104
+ const ui5ControlProperties2 = {
105
+ "elementProperties": {
106
+ "viewName": "sap.ui.demo.cart.view.Home",
107
+ "metadata": "sap.m.SearchField",
108
+ "id": "*searchField"
109
+ }
110
+ };
111
+ const list = await browser.uiControl(ui5ControlProperties);
112
+ const item1 = await list.uiControl(ui5ControlProperties2, 0);
113
+ await expect(await item1.getAttribute("id")).not.toBeNull();
114
+ // item1.setValue("ABCDEF"); async code without await
115
+ // await common.userInteraction.pressEnter(); // we cannot use reuse
116
+ });
117
+
118
+ it("step 5:fill wrong element and catch error - Use control and index", async function () {
119
+ const ui5ControlProperties = {
120
+ "elementProperties": {
121
+ "viewName": "sap.ui.demo.cart.view.Home",
122
+ "metadata": "sap.m.Toolbar",
123
+ "id": "*searchBar33343"
124
+ }
125
+ };
126
+ const ui5ControlWrongProperties = {
127
+ "elementProperties": {
128
+ "viewName": "sap.ui.demo.cart.view.Home",
129
+ "metadata": ".m.SearchField",
130
+ "id": "*"
131
+ }
132
+ };
133
+ const list = await browser.uiControl(ui5ControlProperties);
134
+ await expect(list.uiControl(ui5ControlWrongProperties, 0))
135
+ .rejects.toThrowError(/uiControlExecuteLocator\(\): No visible elements found/);
136
+ });
137
+ });