creevey 0.10.0-beta.9 → 0.10.0-rc.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 (348) hide show
  1. package/AUTHORS +2 -0
  2. package/CHANGELOG.md +281 -0
  3. package/README.md +19 -41
  4. package/dist/client/addon/components/Addon.js +18 -8
  5. package/dist/client/addon/components/Addon.js.map +1 -1
  6. package/dist/client/addon/components/Panel.js +2 -2
  7. package/dist/client/addon/components/Panel.js.map +1 -1
  8. package/dist/client/addon/components/TestSelect.js +2 -2
  9. package/dist/client/addon/components/TestSelect.js.map +1 -1
  10. package/dist/client/addon/components/Tools.js +19 -9
  11. package/dist/client/addon/components/Tools.js.map +1 -1
  12. package/dist/client/addon/controller.d.ts +1 -1
  13. package/dist/client/addon/controller.js +3 -3
  14. package/dist/client/addon/controller.js.map +1 -1
  15. package/dist/client/addon/decorator.d.ts +1 -1
  16. package/dist/client/addon/makeDecorator.d.ts +9 -0
  17. package/dist/client/addon/makeDecorator.js +48 -0
  18. package/dist/client/addon/makeDecorator.js.map +1 -0
  19. package/dist/client/addon/manager.js +38 -39
  20. package/dist/client/addon/manager.js.map +1 -1
  21. package/dist/client/addon/preset.d.ts +0 -1
  22. package/dist/client/addon/preset.js +3 -2
  23. package/dist/client/addon/preset.js.map +1 -1
  24. package/dist/client/addon/preview.d.ts +1 -1
  25. package/dist/client/addon/withCreevey.d.ts +5 -3
  26. package/dist/client/addon/withCreevey.js +5 -20
  27. package/dist/client/addon/withCreevey.js.map +1 -1
  28. package/dist/client/shared/components/ImagesView/BlendView.d.ts +2 -2
  29. package/dist/client/shared/components/ImagesView/BlendView.js +18 -8
  30. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  31. package/dist/client/shared/components/ImagesView/ImagesView.js +1 -1
  32. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
  33. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
  34. package/dist/client/shared/components/ImagesView/SideBySideView.js +19 -9
  35. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  36. package/dist/client/shared/components/ImagesView/SlideView.d.ts +2 -2
  37. package/dist/client/shared/components/ImagesView/SlideView.js +19 -9
  38. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  39. package/dist/client/shared/components/ImagesView/SwapView.d.ts +2 -2
  40. package/dist/client/shared/components/ImagesView/SwapView.js +19 -9
  41. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  42. package/dist/client/shared/components/ImagesView/common.d.ts +1 -1
  43. package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
  44. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
  45. package/dist/client/shared/components/PageFooter/Paging.js +1 -1
  46. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
  47. package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +2 -2
  48. package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -1
  49. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  50. package/dist/client/shared/components/PageHeader/PageHeader.js +34 -13
  51. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  52. package/dist/client/shared/components/ResultsPage.d.ts +2 -2
  53. package/dist/client/shared/components/ResultsPage.js +22 -10
  54. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  55. package/dist/client/shared/creeveyClientApi.js +18 -1
  56. package/dist/client/shared/creeveyClientApi.js.map +1 -1
  57. package/dist/client/shared/helpers.d.ts +1 -3
  58. package/dist/client/shared/helpers.js +4 -19
  59. package/dist/client/shared/helpers.js.map +1 -1
  60. package/dist/client/web/CreeveyApp.d.ts +1 -0
  61. package/dist/client/web/CreeveyApp.js +22 -9
  62. package/dist/client/web/CreeveyApp.js.map +1 -1
  63. package/dist/client/web/CreeveyContext.d.ts +1 -0
  64. package/dist/client/web/CreeveyContext.js +18 -7
  65. package/dist/client/web/CreeveyContext.js.map +1 -1
  66. package/dist/client/web/CreeveyLoader.d.ts +1 -1
  67. package/dist/client/web/CreeveyLoader.js +3 -3
  68. package/dist/client/web/CreeveyLoader.js.map +1 -1
  69. package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -4
  70. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +36 -6
  71. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
  72. package/dist/client/web/CreeveyView/SideBar/Search.js +18 -8
  73. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  74. package/dist/client/web/CreeveyView/SideBar/SideBar.js +26 -12
  75. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  76. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +28 -17
  77. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  78. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +32 -12
  79. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  80. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
  81. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +20 -11
  82. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  83. package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -11
  84. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  85. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
  86. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +2 -2
  87. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
  88. package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +2 -2
  89. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +3 -2
  90. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  91. package/dist/client/web/CreeveyView/SideBar/Toggle.js +1 -1
  92. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
  93. package/dist/client/web/KeyboardEventsContext.js +17 -7
  94. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  95. package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
  96. package/dist/client/web/index.html +1 -1
  97. package/dist/client/web/index.js +26 -11
  98. package/dist/client/web/index.js.map +1 -1
  99. package/dist/client/web/themes.d.ts +2 -0
  100. package/dist/client/web/themes.js +22 -0
  101. package/dist/client/web/themes.js.map +1 -0
  102. package/dist/creevey.d.ts +1 -1
  103. package/dist/creevey.js +122 -41
  104. package/dist/creevey.js.map +1 -1
  105. package/dist/index.d.ts +1 -0
  106. package/dist/playwright/generator.d.ts +25 -0
  107. package/dist/playwright/generator.js +243 -0
  108. package/dist/playwright/generator.js.map +1 -0
  109. package/dist/playwright/helpers.d.ts +2 -0
  110. package/dist/playwright/helpers.js +29 -0
  111. package/dist/playwright/helpers.js.map +1 -0
  112. package/dist/playwright/reporter.d.ts +83 -0
  113. package/dist/playwright/reporter.js +334 -0
  114. package/dist/playwright/reporter.js.map +1 -0
  115. package/dist/playwright/setup.d.ts +3 -0
  116. package/dist/playwright/setup.js +72 -0
  117. package/dist/playwright/setup.js.map +1 -0
  118. package/dist/playwright.d.ts +1 -0
  119. package/dist/playwright.js +3 -1
  120. package/dist/playwright.js.map +1 -1
  121. package/dist/server/compare.d.ts +18 -0
  122. package/dist/server/compare.js +182 -0
  123. package/dist/server/compare.js.map +1 -0
  124. package/dist/server/config.d.ts +3 -3
  125. package/dist/server/config.js +75 -8
  126. package/dist/server/config.js.map +1 -1
  127. package/dist/server/connection.d.ts +3 -0
  128. package/dist/server/connection.js +28 -0
  129. package/dist/server/connection.js.map +1 -0
  130. package/dist/server/docker.d.ts +1 -1
  131. package/dist/server/docker.js +54 -32
  132. package/dist/server/docker.js.map +1 -1
  133. package/dist/server/index.d.ts +2 -2
  134. package/dist/server/index.js +161 -64
  135. package/dist/server/index.js.map +1 -1
  136. package/dist/server/master/api.d.ts +11 -6
  137. package/dist/server/master/api.js +88 -25
  138. package/dist/server/master/api.js.map +1 -1
  139. package/dist/server/master/handlers/capture-handler.d.ts +5 -0
  140. package/dist/server/master/handlers/capture-handler.js +25 -0
  141. package/dist/server/master/handlers/capture-handler.js.map +1 -0
  142. package/dist/server/master/handlers/index.d.ts +4 -0
  143. package/dist/server/master/handlers/index.js +21 -0
  144. package/dist/server/master/handlers/index.js.map +1 -0
  145. package/dist/server/master/handlers/ping-handler.d.ts +2 -0
  146. package/dist/server/master/handlers/ping-handler.js +8 -0
  147. package/dist/server/master/handlers/ping-handler.js.map +1 -0
  148. package/dist/server/master/handlers/static-handler.d.ts +1 -0
  149. package/dist/server/master/handlers/static-handler.js +20 -0
  150. package/dist/server/master/handlers/static-handler.js.map +1 -0
  151. package/dist/server/master/handlers/stories-handler.d.ts +4 -0
  152. package/dist/server/master/handlers/stories-handler.js +24 -0
  153. package/dist/server/master/handlers/stories-handler.js.map +1 -0
  154. package/dist/server/master/master.js +7 -24
  155. package/dist/server/master/master.js.map +1 -1
  156. package/dist/server/master/pool.d.ts +1 -0
  157. package/dist/server/master/pool.js +5 -3
  158. package/dist/server/master/pool.js.map +1 -1
  159. package/dist/server/master/queue.d.ts +1 -1
  160. package/dist/server/master/queue.js +14 -6
  161. package/dist/server/master/queue.js.map +1 -1
  162. package/dist/server/master/runner.d.ts +6 -6
  163. package/dist/server/master/runner.js +98 -130
  164. package/dist/server/master/runner.js.map +1 -1
  165. package/dist/server/master/server.d.ts +1 -1
  166. package/dist/server/master/server.js +193 -88
  167. package/dist/server/master/server.js.map +1 -1
  168. package/dist/server/master/start.d.ts +1 -2
  169. package/dist/server/master/start.js +13 -29
  170. package/dist/server/master/start.js.map +1 -1
  171. package/dist/server/master/testsManager.d.ts +81 -0
  172. package/dist/server/master/testsManager.js +282 -0
  173. package/dist/server/master/testsManager.js.map +1 -0
  174. package/dist/server/playwright/docker-file.d.ts +1 -1
  175. package/dist/server/playwright/docker-file.js +17 -8
  176. package/dist/server/playwright/docker-file.js.map +1 -1
  177. package/dist/server/playwright/docker.d.ts +2 -1
  178. package/dist/server/playwright/docker.js +10 -2
  179. package/dist/server/playwright/docker.js.map +1 -1
  180. package/dist/server/playwright/index-source.mjs +16 -0
  181. package/dist/server/playwright/internal.d.ts +7 -7
  182. package/dist/server/playwright/internal.js +137 -79
  183. package/dist/server/playwright/internal.js.map +1 -1
  184. package/dist/server/playwright/webdriver.d.ts +3 -3
  185. package/dist/server/playwright/webdriver.js +0 -6
  186. package/dist/server/playwright/webdriver.js.map +1 -1
  187. package/dist/server/providers/browser.js +4 -3
  188. package/dist/server/providers/browser.js.map +1 -1
  189. package/dist/server/providers/hybrid.js +2 -2
  190. package/dist/server/providers/hybrid.js.map +1 -1
  191. package/dist/server/report.d.ts +10 -0
  192. package/dist/server/report.js +45 -0
  193. package/dist/server/report.js.map +1 -0
  194. package/dist/server/reporters/creevey.d.ts +7 -0
  195. package/dist/server/reporters/creevey.js +63 -0
  196. package/dist/server/reporters/creevey.js.map +1 -0
  197. package/dist/server/reporters/index.d.ts +2 -0
  198. package/dist/server/reporters/index.js +16 -0
  199. package/dist/server/reporters/index.js.map +1 -0
  200. package/dist/server/reporters/junit.d.ts +16 -0
  201. package/dist/server/reporters/junit.js +167 -0
  202. package/dist/server/reporters/junit.js.map +1 -0
  203. package/dist/server/reporters/teamcity.d.ts +7 -0
  204. package/dist/server/reporters/teamcity.js +60 -0
  205. package/dist/server/reporters/teamcity.js.map +1 -0
  206. package/dist/server/selenium/internal.d.ts +3 -3
  207. package/dist/server/selenium/internal.js +48 -34
  208. package/dist/server/selenium/internal.js.map +1 -1
  209. package/dist/server/selenium/selenoid.js +12 -6
  210. package/dist/server/selenium/selenoid.js.map +1 -1
  211. package/dist/server/selenium/webdriver.d.ts +3 -3
  212. package/dist/server/selenium/webdriver.js +4 -8
  213. package/dist/server/selenium/webdriver.js.map +1 -1
  214. package/dist/server/shutdown.d.ts +1 -0
  215. package/dist/server/shutdown.js +23 -0
  216. package/dist/server/shutdown.js.map +1 -0
  217. package/dist/server/stories.d.ts +0 -1
  218. package/dist/server/stories.js +0 -12
  219. package/dist/server/stories.js.map +1 -1
  220. package/dist/server/telemetry.js +3 -3
  221. package/dist/server/telemetry.js.map +1 -1
  222. package/dist/server/testsFiles/parser.js +45 -5
  223. package/dist/server/testsFiles/parser.js.map +1 -1
  224. package/dist/server/utils.d.ts +23 -0
  225. package/dist/server/utils.js +113 -13
  226. package/dist/server/utils.js.map +1 -1
  227. package/dist/server/webdriver.d.ts +1 -1
  228. package/dist/server/worker/context.d.ts +3 -0
  229. package/dist/server/worker/context.js +15 -0
  230. package/dist/server/worker/context.js.map +1 -0
  231. package/dist/server/worker/match-image.d.ts +8 -12
  232. package/dist/server/worker/match-image.js +11 -178
  233. package/dist/server/worker/match-image.js.map +1 -1
  234. package/dist/server/worker/start.d.ts +2 -2
  235. package/dist/server/worker/start.js +27 -63
  236. package/dist/server/worker/start.js.map +1 -1
  237. package/dist/shared/index.d.ts +1 -1
  238. package/dist/shared/index.js +9 -7
  239. package/dist/shared/index.js.map +1 -1
  240. package/dist/types.d.ts +84 -43
  241. package/dist/types.js +65 -1
  242. package/dist/types.js.map +1 -1
  243. package/docs/cli.md +80 -0
  244. package/docs/config.md +179 -165
  245. package/docs/examples/playwright-reporer/playwright.config.ts +37 -0
  246. package/docs/migration-0.9-to-0.10.md +144 -0
  247. package/docs/playwright-reporter.md +357 -0
  248. package/docs/storybook.md +60 -0
  249. package/docs/tests.md +50 -45
  250. package/package.json +78 -83
  251. package/playwright.config.mts +46 -0
  252. package/src/client/addon/components/Addon.tsx +1 -1
  253. package/src/client/addon/components/Panel.tsx +2 -2
  254. package/src/client/addon/components/TestSelect.tsx +2 -2
  255. package/src/client/addon/components/Tools.tsx +2 -2
  256. package/src/client/addon/controller.ts +4 -4
  257. package/src/client/addon/makeDecorator.ts +69 -0
  258. package/src/client/addon/manager.ts +38 -37
  259. package/src/client/addon/preset.ts +2 -1
  260. package/src/client/addon/withCreevey.ts +10 -18
  261. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  262. package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
  263. package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
  264. package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
  265. package/src/client/shared/components/ImagesView/SwapView.tsx +2 -2
  266. package/src/client/shared/components/ImagesView/common.ts +1 -1
  267. package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
  268. package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
  269. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
  270. package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
  271. package/src/client/shared/components/ResultsPage.tsx +6 -4
  272. package/src/client/shared/creeveyClientApi.ts +19 -1
  273. package/src/client/shared/helpers.ts +4 -24
  274. package/src/client/web/CreeveyApp.tsx +5 -2
  275. package/src/client/web/CreeveyContext.tsx +2 -0
  276. package/src/client/web/CreeveyLoader.tsx +2 -2
  277. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
  278. package/src/client/web/CreeveyView/SideBar/Search.tsx +1 -1
  279. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
  280. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +21 -19
  281. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
  282. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +10 -8
  283. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +9 -7
  284. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
  285. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
  286. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
  287. package/src/client/web/index.tsx +10 -5
  288. package/src/client/web/themes.ts +24 -0
  289. package/src/creevey.ts +92 -38
  290. package/src/playwright/generator.ts +322 -0
  291. package/src/playwright/helpers.ts +31 -0
  292. package/src/playwright/reporter.ts +381 -0
  293. package/src/playwright/setup.ts +84 -0
  294. package/src/playwright.ts +1 -0
  295. package/src/server/compare.ts +260 -0
  296. package/src/server/config.ts +52 -9
  297. package/src/server/connection.ts +26 -0
  298. package/src/server/docker.ts +62 -34
  299. package/src/server/index.ts +161 -79
  300. package/src/server/master/api.ts +94 -28
  301. package/src/server/master/handlers/capture-handler.ts +20 -0
  302. package/src/server/master/handlers/index.ts +4 -0
  303. package/src/server/master/handlers/ping-handler.ts +6 -0
  304. package/src/server/master/handlers/static-handler.ts +16 -0
  305. package/src/server/master/handlers/stories-handler.ts +20 -0
  306. package/src/server/master/master.ts +10 -27
  307. package/src/server/master/pool.ts +7 -3
  308. package/src/server/master/queue.ts +21 -7
  309. package/src/server/master/runner.ts +123 -134
  310. package/src/server/master/server.ts +214 -101
  311. package/src/server/master/start.ts +19 -41
  312. package/src/server/master/testsManager.ts +316 -0
  313. package/src/server/playwright/docker-file.ts +20 -8
  314. package/src/server/playwright/docker.ts +16 -3
  315. package/src/server/playwright/index-source.mjs +16 -0
  316. package/src/server/playwright/internal.ts +169 -96
  317. package/src/server/playwright/webdriver.ts +4 -10
  318. package/src/server/providers/browser.ts +4 -3
  319. package/src/server/providers/hybrid.ts +2 -3
  320. package/src/server/report.ts +51 -0
  321. package/src/server/reporters/creevey.ts +71 -0
  322. package/src/server/reporters/index.ts +11 -0
  323. package/src/server/reporters/junit.ts +207 -0
  324. package/src/server/reporters/teamcity.ts +74 -0
  325. package/src/server/selenium/internal.ts +62 -45
  326. package/src/server/selenium/selenoid.ts +13 -6
  327. package/src/server/selenium/webdriver.ts +8 -12
  328. package/src/server/shutdown.ts +19 -0
  329. package/src/server/stories.ts +1 -12
  330. package/src/server/telemetry.ts +3 -3
  331. package/src/server/testsFiles/parser.ts +52 -4
  332. package/src/server/utils.ts +123 -14
  333. package/src/server/webdriver.ts +1 -1
  334. package/src/server/worker/context.ts +14 -0
  335. package/src/server/worker/match-image.ts +16 -248
  336. package/src/server/worker/start.ts +32 -75
  337. package/src/shared/index.ts +10 -8
  338. package/src/types.ts +91 -58
  339. package/types/global.d.ts +1 -0
  340. package/dist/client/web/assets/index-BE9CL5_G.js +0 -591
  341. package/dist/server/reporter.d.ts +0 -26
  342. package/dist/server/reporter.js +0 -108
  343. package/dist/server/reporter.js.map +0 -1
  344. package/dist/server/update.d.ts +0 -2
  345. package/dist/server/update.js +0 -53
  346. package/dist/server/update.js.map +0 -1
  347. package/src/server/reporter.ts +0 -139
  348. package/src/server/update.ts +0 -74
@@ -1,5 +1,3 @@
1
- import path from 'path';
2
- import { copyFile, mkdir } from 'fs/promises';
3
1
  import { EventEmitter } from 'events';
4
2
  import {
5
3
  Config,
@@ -10,30 +8,59 @@ import {
10
8
  CreeveyUpdate,
11
9
  TestStatus,
12
10
  ServerTest,
13
- TestMeta,
11
+ TEST_EVENTS,
12
+ FakeSuite,
13
+ FakeTest,
14
14
  } from '../../types.js';
15
15
  import Pool from './pool.js';
16
16
  import { WorkerQueue } from './queue.js';
17
+ import { getTestPath } from '../utils.js';
18
+ import { getReporter } from '../reporters/index.js';
19
+ import type { TestsManager } from './testsManager.js';
20
+
21
+ // NOTE: This is workaround to fix parallel tests running with mocha-junit-reporter
22
+ let isJUnit = false;
23
+
24
+ class FakeRunner extends EventEmitter {
25
+ public stats = {
26
+ duration: 0,
27
+ failures: 0,
28
+ pending: 0,
29
+ };
30
+ }
17
31
 
18
32
  export default class Runner extends EventEmitter {
19
33
  private failFast: boolean;
20
- private screenDir: string;
21
- private reportDir: string;
22
34
  private browsers: string[];
23
35
  private scheduler: WorkerQueue;
24
36
  private pools: Record<string, Pool> = {};
25
- tests: Partial<Record<string, ServerTest>> = {};
37
+ private fakeRunner: FakeRunner;
38
+ private config: Config;
39
+ public testsManager: TestsManager;
40
+
26
41
  public get isRunning(): boolean {
27
42
  return Object.values(this.pools).some((pool) => pool.isRunning);
28
43
  }
29
- constructor(config: Config, gridUrl?: string) {
44
+
45
+ constructor(config: Config, testsManager: TestsManager, gridUrl?: string) {
30
46
  super();
31
47
 
48
+ this.config = config;
32
49
  this.failFast = config.failFast;
33
- this.screenDir = config.screenDir;
34
- this.reportDir = config.reportDir;
50
+ this.testsManager = testsManager;
35
51
  this.scheduler = new WorkerQueue(config.useWorkerQueue);
36
52
  this.browsers = Object.keys(config.browsers);
53
+
54
+ const runner = new FakeRunner();
55
+ const Reporter = getReporter(config.reporter);
56
+
57
+ if (Reporter.name == 'MochaJUnitReporter') {
58
+ isJUnit = true;
59
+ }
60
+
61
+ new Reporter(runner, { reportDir: config.reportDir, reporterOptions: config.reporterOptions });
62
+ this.fakeRunner = runner;
63
+
37
64
  this.browsers
38
65
  .map((browser) => (this.pools[browser] = new Pool(this.scheduler, config, browser, gridUrl)))
39
66
  .map((pool) => pool.on('test', this.handlePoolMessage));
@@ -41,46 +68,83 @@ export default class Runner extends EventEmitter {
41
68
 
42
69
  private handlePoolMessage = (message: { id: string; status: TestStatus; result?: TestResult }): void => {
43
70
  const { id, status, result } = message;
44
- const test = this.tests[id];
71
+ const test = this.testsManager.getTest(id);
45
72
 
46
73
  if (!test) return;
47
- const { browser, testName, storyPath, storyId } = test;
48
- // TODO Handle 'retrying' status
49
- test.status = status == 'retrying' ? 'failed' : status;
74
+ const { browser, testName } = test;
75
+
76
+ const fakeSuite: FakeSuite = {
77
+ title: test.storyPath.slice(0, -1).join('/'),
78
+ fullTitle: () => fakeSuite.title,
79
+ titlePath: () => [fakeSuite.title],
80
+ tests: [],
81
+ };
82
+
83
+ const fakeTest: FakeTest = {
84
+ parent: fakeSuite,
85
+ title: [test.story.name, testName, browser].filter(isDefined).join('/'),
86
+ fullTitle: () => getTestPath(test).join('/'),
87
+ titlePath: () => getTestPath(test),
88
+ currentRetry: () => result?.retries,
89
+ retires: () => this.config.maxRetries,
90
+ slow: () => 1000,
91
+ err: result?.error,
92
+ creevey: {
93
+ sessionId: result?.sessionId ?? id,
94
+ browserName: result?.browserName ?? browser,
95
+ workerId: result?.workerId ?? process.pid,
96
+ willRetry: (result?.retries ?? 0) < this.config.maxRetries,
97
+ images: result?.images ?? {},
98
+ },
99
+ };
100
+
101
+ fakeSuite.tests.push(fakeTest);
102
+
103
+ const update = this.testsManager.updateTestStatus(id, status, result);
104
+ if (!update) return;
105
+
50
106
  if (!result) {
51
- // NOTE: Running status
52
- this.sendUpdate({ tests: { [id]: { id, browser, testName, storyPath, status: test.status, storyId } } });
107
+ this.fakeRunner.emit(TEST_EVENTS.TEST_BEGIN, fakeTest);
108
+ this.sendUpdate(update);
53
109
  return;
54
110
  }
55
- if (!test.results) {
56
- test.results = [];
111
+
112
+ const { duration, attachments } = result;
113
+
114
+ fakeTest.duration = duration;
115
+ fakeTest.attachments = attachments;
116
+ fakeTest.state = result.status === 'failed' ? 'failed' : 'passed';
117
+ if (duration !== undefined) {
118
+ fakeTest.speed = duration > fakeTest.slow() ? 'slow' : duration / 2 > fakeTest.slow() ? 'medium' : 'fast';
57
119
  }
58
- test.results.push(result);
59
120
 
60
- if (status == 'failed') {
61
- test.approved = null;
121
+ if (isJUnit) {
122
+ this.fakeRunner.emit(TEST_EVENTS.SUITE_BEGIN, fakeSuite);
62
123
  }
63
124
 
64
- this.sendUpdate({
65
- tests: {
66
- [id]: {
67
- id,
68
- browser,
69
- testName,
70
- storyPath,
71
- status: test.status,
72
- approved: test.approved,
73
- results: [result],
74
- storyId,
75
- },
76
- },
77
- });
125
+ if (result.status === 'failed') {
126
+ fakeTest.err = result.error;
127
+ this.fakeRunner.emit(TEST_EVENTS.TEST_FAIL, fakeTest, result.error);
128
+ this.fakeRunner.stats.failures++;
129
+ } else {
130
+ this.fakeRunner.emit(TEST_EVENTS.TEST_PASS, fakeTest);
131
+ this.fakeRunner.stats.duration += duration ?? 0;
132
+ }
133
+
134
+ if (isJUnit) {
135
+ this.fakeRunner.emit(TEST_EVENTS.SUITE_END, fakeSuite);
136
+ }
137
+
138
+ this.fakeRunner.emit(TEST_EVENTS.TEST_END, fakeTest);
139
+
140
+ this.sendUpdate(update);
78
141
 
79
142
  if (this.failFast && status == 'failed') this.stop();
80
143
  };
81
144
 
82
145
  private handlePoolStop = (): void => {
83
146
  if (!this.isRunning) {
147
+ this.fakeRunner.emit(TEST_EVENTS.RUN_END);
84
148
  this.sendUpdate({ isRunning: false });
85
149
  this.emit('stop');
86
150
  }
@@ -91,31 +155,8 @@ export default class Runner extends EventEmitter {
91
155
  }
92
156
 
93
157
  public updateTests(testsDiff: Partial<Record<string, ServerTest>>): void {
94
- const tests: CreeveyStatus['tests'] = {};
95
- const removedTests: TestMeta[] = [];
96
- Object.entries(testsDiff).forEach(([id, newTest]) => {
97
- const oldTest = this.tests[id];
98
- if (newTest) {
99
- if (oldTest) {
100
- this.tests[id] = {
101
- ...newTest,
102
- retries: oldTest.retries,
103
- results: oldTest.results,
104
- approved: oldTest.approved,
105
- };
106
- } else this.tests[id] = newTest;
107
-
108
- const { story: _, fn: __, ...restTest } = newTest;
109
- tests[id] = { ...restTest, status: 'unknown' };
110
- } else if (oldTest) {
111
- const { id, browser, testName, storyPath, storyId } = oldTest;
112
- removedTests.push({ id, browser, testName, storyPath, storyId });
113
- // TODO Use Map instead
114
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
115
- delete this.tests[id];
116
- }
117
- });
118
- this.sendUpdate({ tests, removedTests });
158
+ const update = this.testsManager.updateTests(testsDiff);
159
+ if (update) this.sendUpdate(update);
119
160
  }
120
161
 
121
162
  public start(ids: string[]): void {
@@ -123,33 +164,39 @@ export default class Runner extends EventEmitter {
123
164
  if (this.isRunning) return;
124
165
 
125
166
  const testsToStart = ids
126
- .map((id) => this.tests[id])
167
+ .map((id) => this.testsManager.getTest(id))
127
168
  .filter(isDefined)
128
169
  .filter((test) => !test.skip);
129
170
 
130
171
  if (testsToStart.length == 0) return;
131
172
 
173
+ const pendingTests: CreeveyUpdate['tests'] = testsToStart.reduce(
174
+ (update: CreeveyUpdate['tests'], { id, storyId, browser, testName, storyPath }) => ({
175
+ ...update,
176
+ [id]: { id, browser, testName, storyPath, status: 'pending', storyId },
177
+ }),
178
+ {},
179
+ );
180
+
132
181
  this.sendUpdate({
133
182
  isRunning: true,
134
- tests: testsToStart.reduce(
135
- (update: CreeveyUpdate['tests'], { id, storyId, browser, testName, storyPath }) => ({
136
- ...update,
137
- [id]: { id, browser, testName, storyPath, status: 'pending', storyId },
138
- }),
139
- {},
140
- ),
183
+ tests: pendingTests,
141
184
  });
142
185
 
143
186
  const testsByBrowser: Partial<TestsByBrowser> = testsToStart.reduce((tests: Partial<TestsByBrowser>, test) => {
144
187
  const { id, browser, testName, storyPath } = test;
145
188
  const restPath = [...storyPath, testName].filter(isDefined);
146
- test.status = 'pending';
189
+
190
+ // Update status to pending in TestsManager
191
+ this.testsManager.updateTestStatus(id, 'pending');
192
+
147
193
  return {
148
194
  ...tests,
149
195
  [browser]: [...(tests[browser] ?? []), { id, path: restPath }],
150
196
  };
151
197
  }, {});
152
198
 
199
+ this.fakeRunner.emit(TEST_EVENTS.RUN_BEGIN);
153
200
  this.browsers.forEach((browser) => {
154
201
  const pool = this.pools[browser];
155
202
  const tests = testsByBrowser[browser];
@@ -168,82 +215,24 @@ export default class Runner extends EventEmitter {
168
215
  }
169
216
 
170
217
  public get status(): CreeveyStatus {
171
- const tests: CreeveyStatus['tests'] = {};
172
- Object.values(this.tests)
173
- .filter(isDefined)
174
-
175
- .forEach(({ story: _, fn: __, ...test }) => (tests[test.id] = test));
176
218
  return {
177
219
  isRunning: this.isRunning,
178
- tests,
220
+ tests: this.testsManager.getTestsData(),
179
221
  browsers: this.browsers,
222
+ isUpdateMode: false,
180
223
  };
181
224
  }
182
225
 
183
- private async copyImage(test: ServerTest, image: string, actual: string): Promise<void> {
184
- const { browser, testName, storyPath } = test;
185
- const restPath = [...storyPath, testName].filter(isDefined);
186
- const testPath = path.join(...restPath, image == browser ? '' : browser);
187
- const srcImagePath = path.join(this.reportDir, testPath, actual);
188
- const dstImagePath = path.join(this.screenDir, testPath, `${image}.png`);
189
- await mkdir(path.join(this.screenDir, testPath), { recursive: true });
190
- await copyFile(srcImagePath, dstImagePath);
191
- }
192
-
193
226
  public async approveAll(): Promise<void> {
194
- const updatedTests: NonNullable<CreeveyUpdate['tests']> = {};
195
- for (const test of Object.values(this.tests)) {
196
- if (!test?.results) continue;
197
- const retry = test.results.length - 1;
198
- const { images, status } = test.results.at(retry) ?? {};
199
- if (!images || status != 'failed') continue;
200
- for (const [name, image] of Object.entries(images)) {
201
- if (!image) continue;
202
- await this.copyImage(test, name, image.actual);
203
-
204
- if (!test.approved) {
205
- test.approved = {};
206
- }
207
- test.approved[name] = retry;
208
- test.status = 'approved';
209
-
210
- updatedTests[test.id] = {
211
- id: test.id,
212
- browser: test.browser,
213
- storyPath: test.storyPath,
214
- storyId: test.storyId,
215
- status: test.status,
216
- approved: { [name]: retry },
217
- };
218
- }
219
- }
220
- this.sendUpdate({ tests: updatedTests });
227
+ const update = await this.testsManager.approveAll();
228
+ this.sendUpdate(update);
221
229
  }
222
230
 
223
- public async approve({ id, retry, image }: ApprovePayload): Promise<void> {
224
- const test = this.tests[id];
225
- if (!test?.results) return;
226
- const result = test.results[retry];
227
- if (!result.images) return;
228
- const images = result.images[image];
229
- if (!images) return;
230
- if (!test.approved) {
231
- test.approved = {};
232
- }
233
- const { browser, testName, storyPath, storyId } = test;
234
-
235
- await this.copyImage(test, image, images.actual);
236
-
237
- test.approved[image] = retry;
238
-
239
- if (Object.keys(result.images).every((name) => typeof test.approved?.[name] == 'number')) {
240
- test.status = 'approved';
241
- }
242
-
243
- this.sendUpdate({
244
- tests: { [id]: { id, browser, testName, storyPath, status: test.status, approved: { [image]: retry }, storyId } },
245
- });
231
+ public async approve(payload: ApprovePayload): Promise<void> {
232
+ const update = await this.testsManager.approve(payload);
233
+ if (update) this.sendUpdate(update);
246
234
  }
235
+
247
236
  private sendUpdate(data: CreeveyUpdate): void {
248
237
  this.emit('update', data);
249
238
  }