@wix/patterns-fields 1.86.0 → 1.88.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 (254) hide show
  1. package/dist/cjs/components/address/input/address-input.st.css.js +3 -3
  2. package/dist/cjs/components/address/input/address-input.st.css.js.map +1 -1
  3. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js +3 -3
  4. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
  5. package/dist/cjs/components/audio/audio-field/controlled-audio.uni.driver.js +29 -0
  6. package/dist/cjs/components/audio/audio-field/controlled-audio.uni.driver.js.map +1 -0
  7. package/dist/cjs/components/audio/audio-field/form-audio-field.js +42 -12
  8. package/dist/cjs/components/audio/audio-field/form-audio-field.js.map +1 -1
  9. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js +4 -4
  10. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
  11. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
  12. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
  13. package/dist/cjs/components/color-view/cell-color-view.st.css.js +3 -3
  14. package/dist/cjs/components/color-view/cell-color-view.st.css.js.map +1 -1
  15. package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
  16. package/dist/cjs/components/color-view/color-view.st.css.js.map +1 -1
  17. package/dist/cjs/components/controlled-input.uni.driver.js +7 -1
  18. package/dist/cjs/components/controlled-input.uni.driver.js.map +1 -1
  19. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js +3 -3
  20. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  21. package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
  22. package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
  23. package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
  24. package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
  25. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
  26. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  27. package/dist/cjs/components/image/controlled-image.uni.driver.js +23 -0
  28. package/dist/cjs/components/image/controlled-image.uni.driver.js.map +1 -0
  29. package/dist/cjs/components/image/form-image-field.js +124 -0
  30. package/dist/cjs/components/image/form-image-field.js.map +1 -0
  31. package/dist/cjs/components/image/form-image-input.js +13 -50
  32. package/dist/cjs/components/image/form-image-input.js.map +1 -1
  33. package/dist/cjs/components/image/index.js +6 -0
  34. package/dist/cjs/components/image/index.js.map +1 -1
  35. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js +3 -3
  36. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
  37. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  38. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
  39. package/dist/cjs/components/media-control/paste-url-button.st.css.js +4 -4
  40. package/dist/cjs/components/media-control/paste-url-button.st.css.js.map +1 -1
  41. package/dist/cjs/components/media-control/use-media-control.js +4 -1
  42. package/dist/cjs/components/media-control/use-media-control.js.map +1 -1
  43. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js +10 -10
  44. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
  45. package/dist/cjs/components/media-image/media-image.st.css.js +4 -4
  46. package/dist/cjs/components/media-image/media-image.st.css.js.map +1 -1
  47. package/dist/cjs/components/media-image/overlays/overlay.st.css.js +3 -3
  48. package/dist/cjs/components/media-image/overlays/overlay.st.css.js.map +1 -1
  49. package/dist/cjs/components/media-loader/media-loader.st.css.js +3 -3
  50. package/dist/cjs/components/media-loader/media-loader.st.css.js.map +1 -1
  51. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  52. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
  53. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js +3 -3
  54. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  55. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
  56. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  57. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js +2 -2
  58. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
  59. package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
  60. package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
  61. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +4 -4
  62. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js.map +1 -1
  63. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +3 -3
  64. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  65. package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  66. package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js.map +1 -1
  67. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +3 -3
  68. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
  69. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +3 -3
  70. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
  71. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  72. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
  73. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +7 -7
  74. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
  75. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +5 -5
  76. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  77. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +4 -4
  78. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  79. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +18 -18
  80. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
  81. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +4 -4
  82. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
  83. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +18 -18
  84. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
  85. package/dist/cjs/components/text/text-view.st.css.js +3 -3
  86. package/dist/cjs/components/text/text-view.st.css.js.map +1 -1
  87. package/dist/cjs/components/video/controlled-video.uni.driver.js +40 -0
  88. package/dist/cjs/components/video/controlled-video.uni.driver.js.map +1 -0
  89. package/dist/cjs/components/video/form-video-field.js +358 -0
  90. package/dist/cjs/components/video/form-video-field.js.map +1 -0
  91. package/dist/cjs/components/video/form-video.js +22 -284
  92. package/dist/cjs/components/video/form-video.js.map +1 -1
  93. package/dist/cjs/components/video/index.js +4 -1
  94. package/dist/cjs/components/video/index.js.map +1 -1
  95. package/dist/cjs/styles.global.css +1 -1
  96. package/dist/esm/components/address/input/address-input.st.css.js +2 -2
  97. package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
  98. package/dist/esm/components/audio/audio-field/controlled-audio.uni.driver.js +26 -0
  99. package/dist/esm/components/audio/audio-field/controlled-audio.uni.driver.js.map +1 -0
  100. package/dist/esm/components/audio/audio-field/form-audio-field.js +6 -1
  101. package/dist/esm/components/audio/audio-field/form-audio-field.js.map +1 -1
  102. package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
  103. package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
  104. package/dist/esm/components/color-view/cell-color-view.st.css.js +2 -2
  105. package/dist/esm/components/color-view/color-view.st.css.js +2 -2
  106. package/dist/esm/components/color-view/color-view.st.css.js.map +1 -1
  107. package/dist/esm/components/controlled-input.uni.driver.js +6 -0
  108. package/dist/esm/components/controlled-input.uni.driver.js.map +1 -1
  109. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
  110. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  111. package/dist/esm/components/document/form-document-field.st.css.js +2 -2
  112. package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
  113. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
  114. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  115. package/dist/esm/components/image/controlled-image.uni.driver.js +19 -0
  116. package/dist/esm/components/image/controlled-image.uni.driver.js.map +1 -0
  117. package/dist/esm/components/image/form-image-field.js +48 -0
  118. package/dist/esm/components/image/form-image-field.js.map +1 -0
  119. package/dist/esm/components/image/form-image-input.js +11 -33
  120. package/dist/esm/components/image/form-image-input.js.map +1 -1
  121. package/dist/esm/components/image/index.js +1 -0
  122. package/dist/esm/components/image/index.js.map +1 -1
  123. package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
  124. package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
  125. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  126. package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
  127. package/dist/esm/components/media-control/use-media-control.js +4 -3
  128. package/dist/esm/components/media-control/use-media-control.js.map +1 -1
  129. package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js +2 -2
  130. package/dist/esm/components/media-image/media-image.st.css.js +3 -3
  131. package/dist/esm/components/media-image/media-image.st.css.js.map +1 -1
  132. package/dist/esm/components/media-image/overlays/overlay.st.css.js +2 -2
  133. package/dist/esm/components/media-image/overlays/overlay.st.css.js.map +1 -1
  134. package/dist/esm/components/media-loader/media-loader.st.css.js +2 -2
  135. package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  136. package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
  137. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js +2 -2
  138. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  139. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
  140. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  141. package/dist/esm/components/reference/cell-multi-reference-input.st.css.js +2 -2
  142. package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
  143. package/dist/esm/components/reference/cell-reference-input.st.css.js.map +1 -1
  144. package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +2 -2
  145. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +2 -2
  146. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  147. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js.map +1 -1
  148. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
  149. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
  150. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  151. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +2 -2
  152. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
  153. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
  154. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  155. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
  156. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +2 -2
  157. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +2 -2
  158. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +2 -2
  159. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
  160. package/dist/esm/components/text/text-view.st.css.js +2 -2
  161. package/dist/esm/components/video/controlled-video.uni.driver.js +37 -0
  162. package/dist/esm/components/video/controlled-video.uni.driver.js.map +1 -0
  163. package/dist/esm/components/video/form-video-field.js +71 -0
  164. package/dist/esm/components/video/form-video-field.js.map +1 -0
  165. package/dist/esm/components/video/form-video.js +17 -56
  166. package/dist/esm/components/video/form-video.js.map +1 -1
  167. package/dist/esm/components/video/index.js +1 -0
  168. package/dist/esm/components/video/index.js.map +1 -1
  169. package/dist/esm/styles.global.css +1 -1
  170. package/dist/types/components/audio/audio-field/controlled-audio.uni.driver.d.ts +18 -0
  171. package/dist/types/components/audio/audio-field/controlled-audio.uni.driver.d.ts.map +1 -0
  172. package/dist/types/components/audio/audio-field/form-audio-field.d.ts +12 -1
  173. package/dist/types/components/audio/audio-field/form-audio-field.d.ts.map +1 -1
  174. package/dist/types/components/color-view/color-view.st.css.d.ts.map +1 -1
  175. package/dist/types/components/controlled-input.uni.driver.d.ts +74 -0
  176. package/dist/types/components/controlled-input.uni.driver.d.ts.map +1 -1
  177. package/dist/types/components/delete-dialog/delete-dialog.st.css.d.ts.map +1 -1
  178. package/dist/types/components/highlighted-text/highlighted-text.st.css.d.ts.map +1 -1
  179. package/dist/types/components/image/controlled-image.uni.driver.d.ts +40 -0
  180. package/dist/types/components/image/controlled-image.uni.driver.d.ts.map +1 -0
  181. package/dist/types/components/image/form-image-field.d.ts +15 -0
  182. package/dist/types/components/image/form-image-field.d.ts.map +1 -0
  183. package/dist/types/components/image/form-image-input.d.ts.map +1 -1
  184. package/dist/types/components/image/index.d.ts +1 -0
  185. package/dist/types/components/image/index.d.ts.map +1 -1
  186. package/dist/types/components/image/thumbnail-replace-overlay.st.css.d.ts.map +1 -1
  187. package/dist/types/components/media-control/use-media-control.d.ts.map +1 -1
  188. package/dist/types/components/media-image/media-image.st.css.d.ts.map +1 -1
  189. package/dist/types/components/media-image/overlays/overlay.st.css.d.ts.map +1 -1
  190. package/dist/types/components/media-tag/web-media-tag/media-tag.st.css.d.ts.map +1 -1
  191. package/dist/types/components/multi-document/cell-multi-document-edit.st.css.d.ts.map +1 -1
  192. package/dist/types/components/multi-document/multi-document-input/form-multi-document.st.css.d.ts.map +1 -1
  193. package/dist/types/components/reference/cell-reference-input.st.css.d.ts.map +1 -1
  194. package/dist/types/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.d.ts.map +1 -1
  195. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.d.ts.map +1 -1
  196. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.d.ts.map +1 -1
  197. package/dist/types/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.d.ts.map +1 -1
  198. package/dist/types/components/video/controlled-video.uni.driver.d.ts +22 -0
  199. package/dist/types/components/video/controlled-video.uni.driver.d.ts.map +1 -0
  200. package/dist/types/components/video/form-video-field.d.ts +29 -0
  201. package/dist/types/components/video/form-video-field.d.ts.map +1 -0
  202. package/dist/types/components/video/form-video.d.ts.map +1 -1
  203. package/dist/types/components/video/index.d.ts +2 -0
  204. package/dist/types/components/video/index.d.ts.map +1 -1
  205. package/package.json +4 -4
  206. package/src/__tests__/exports/controlled-inputs.spec.tsx +677 -1
  207. package/src/components/address/input/address-input.st.css.ts +2 -2
  208. package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
  209. package/src/components/audio/audio-field/controlled-audio.uni.driver.ts +35 -0
  210. package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
  211. package/src/components/audio/audio-field/form-audio-field.tsx +41 -1
  212. package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
  213. package/src/components/color-view/cell-color-view.st.css.ts +2 -2
  214. package/src/components/color-view/color-view.st.css.ts +2 -2
  215. package/src/components/controlled-input.uni.driver.ts +6 -0
  216. package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
  217. package/src/components/document/form-document-field.st.css.ts +2 -2
  218. package/src/components/exclamation/exclamation.st.css.ts +2 -2
  219. package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
  220. package/src/components/image/controlled-image.uni.driver.ts +30 -0
  221. package/src/components/image/form-image-field.tsx +124 -0
  222. package/src/components/image/form-image-input.tsx +13 -46
  223. package/src/components/image/index.ts +1 -0
  224. package/src/components/image/thumbnail-replace-overlay.st.css.ts +2 -2
  225. package/src/components/media-control/cell-media-edit-shell.st.css.ts +2 -2
  226. package/src/components/media-control/paste-url-button.st.css.ts +2 -2
  227. package/src/components/media-control/use-media-control.ts +4 -3
  228. package/src/components/media-gallery/form-media-gallery-field.st.css.ts +2 -2
  229. package/src/components/media-image/media-image.st.css.ts +3 -3
  230. package/src/components/media-image/overlays/overlay.st.css.ts +2 -2
  231. package/src/components/media-loader/media-loader.st.css.ts +2 -2
  232. package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
  233. package/src/components/multi-document/cell-multi-document-edit.st.css.ts +2 -2
  234. package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
  235. package/src/components/reference/cell-multi-reference-input.st.css.ts +2 -2
  236. package/src/components/reference/cell-reference-input.st.css.ts +2 -2
  237. package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +2 -2
  238. package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +2 -2
  239. package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
  240. package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
  241. package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
  242. package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
  243. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +2 -2
  244. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
  245. package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
  246. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +2 -2
  247. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +2 -2
  248. package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +2 -2
  249. package/src/components/text/text-view.st.css.ts +2 -2
  250. package/src/components/video/controlled-video.uni.driver.ts +48 -0
  251. package/src/components/video/form-video-field.tsx +268 -0
  252. package/src/components/video/form-video.tsx +21 -179
  253. package/src/components/video/index.ts +6 -0
  254. package/src/styles.global.css +1 -1
@@ -1,30 +1,64 @@
1
1
  import '../../testkit/test-polyfills';
2
2
 
3
3
  import React from 'react';
4
- import { render } from '@testing-library/react';
4
+ import { act, render } from '@testing-library/react';
5
+ import { WixPatternsContainerProvider } from '@wix/bex-core/react';
6
+ import type { WixPatternsContainer } from '@wix/bex-core';
5
7
  import { uniTestkitFactoryCreator } from '@wix/wix-ui-test-utils/testing-library';
6
8
 
7
9
  import {
8
10
  ControlledBooleanRadioGroupInput,
9
11
  FormCheckboxInput,
10
12
  } from '../../components/boolean';
13
+ import { ControlledAudioInput } from '../../components/audio';
11
14
  import { ControlledColorInput } from '../../components/color-view';
12
15
  import { ControlledInputUniDriver } from '../../components/controlled-input.uni.driver';
13
16
  import { DateInput } from '../../components/date-input';
14
17
  import { DateTimeInput } from '../../components/datetime-input';
15
18
  import { ControlledEmailInput } from '../../components/email';
19
+ import { ControlledImageInput, FormImageField } from '../../components/image';
16
20
  import { FormNumberInput } from '../../components/number-input';
17
21
  import { FormShortTextInput } from '../../components/text';
18
22
  import { FormUrlInput } from '../../components/url';
23
+ import { ControlledVideoInput, FormVideoField } from '../../components/video';
19
24
  import { PatternsFieldsTestProvider } from '../../testkit/patterns-fields-test-provider';
20
25
 
21
26
  const controlledInputTestkitFactory = uniTestkitFactoryCreator(
22
27
  ControlledInputUniDriver,
23
28
  );
24
29
 
30
+ const AUDIO_URI = 'wix:audio://v1/abc123.mp3/my-song.mp3';
31
+
32
+ const IMAGE_URI =
33
+ 'wix:image://v1/dafa67_9aa1f03ed7274a7795d2f2e18a245ac7~mv2.jpg/cute%20cat.jpg#originWidth=1024&originHeight=1024';
34
+
35
+ const VIDEO_URI =
36
+ 'wix:video://v1/abc123.mp4/video-file#posterUri=poster.jpg&posterWidth=1920&posterHeight=1080';
37
+
25
38
  const getInput = (container: HTMLElement, dataHook: string) =>
26
39
  controlledInputTestkitFactory({ wrapper: container, dataHook });
27
40
 
41
+ // Media inputs read openMediaManager off the patterns container, so a test that
42
+ // opens the picker has to supply one.
43
+ const withMediaManager =
44
+ (openMediaManager: jest.Mock): React.FC =>
45
+ ({ children }) =>
46
+ (
47
+ <PatternsFieldsTestProvider>
48
+ <WixPatternsContainerProvider
49
+ value={
50
+ {
51
+ translate: (key: string) => key,
52
+ environment: { language: 'en' },
53
+ openMediaManager,
54
+ } as unknown as WixPatternsContainer
55
+ }
56
+ >
57
+ {children}
58
+ </WixPatternsContainerProvider>
59
+ </PatternsFieldsTestProvider>
60
+ );
61
+
28
62
  describe('controlled inputs', () => {
29
63
  it('follows checkbox prop changes and reports user edits', async () => {
30
64
  const onChange = jest.fn();
@@ -404,4 +438,646 @@ describe('controlled inputs', () => {
404
438
  expect(onChange).toHaveBeenCalledTimes(1);
405
439
  expect(onChange).toHaveBeenCalledWith('#778899');
406
440
  });
441
+ it('follows audio prop changes and reports user edits', async () => {
442
+ const onChange = jest.fn();
443
+ const { container, rerender } = render(
444
+ <ControlledAudioInput
445
+ data={undefined}
446
+ onChange={onChange}
447
+ dataHook="audio"
448
+ />,
449
+ { wrapper: PatternsFieldsTestProvider },
450
+ );
451
+ const input = getInput(container, 'audio').audio;
452
+
453
+ expect(await input.getAddButtonText()).toBe('CMS.audio.button.add');
454
+ expect(await input.audioPlayerExists()).toBe(false);
455
+
456
+ rerender(
457
+ <ControlledAudioInput
458
+ data={AUDIO_URI}
459
+ onChange={onChange}
460
+ dataHook="audio"
461
+ />,
462
+ );
463
+
464
+ // The empty and filled states are different elements, so the testkit has
465
+ // to be re-created after the swap — the old one holds the detached node.
466
+ const filled = getInput(container, 'audio').audio;
467
+
468
+ expect(await filled.getAudioName()).toBe('my-song.mp3');
469
+ expect(await filled.audioPlayerExists()).toBe(true);
470
+ });
471
+
472
+ it('reports deleting the audio as onChange(undefined)', async () => {
473
+ const onChange = jest.fn();
474
+ const { container } = render(
475
+ <ControlledAudioInput
476
+ data={AUDIO_URI}
477
+ onChange={onChange}
478
+ dataHook="audio-delete"
479
+ />,
480
+ { wrapper: PatternsFieldsTestProvider },
481
+ );
482
+ const input = getInput(container, 'audio-delete').audio;
483
+
484
+ await input.clickMore();
485
+ await input.clickDelete();
486
+
487
+ expect(onChange).toHaveBeenCalledTimes(1);
488
+ expect(onChange).toHaveBeenCalledWith(undefined);
489
+ });
490
+
491
+ it('disables the audio replace and delete actions when readOnly', async () => {
492
+ const { container } = render(
493
+ <ControlledAudioInput
494
+ data={AUDIO_URI}
495
+ onChange={jest.fn()}
496
+ readOnly
497
+ dataHook="audio-readonly"
498
+ />,
499
+ { wrapper: PatternsFieldsTestProvider },
500
+ );
501
+ const input = getInput(container, 'audio-readonly').audio;
502
+
503
+ await input.clickMore();
504
+
505
+ expect(await input.isReplaceDisabled()).toBe(true);
506
+ expect(await input.isDeleteDisabled()).toBe(true);
507
+ });
508
+
509
+ it('does not focus the audio add button when autoFocus is not set', async () => {
510
+ const { container } = render(
511
+ <ControlledAudioInput
512
+ data={undefined}
513
+ onChange={jest.fn()}
514
+ dataHook="audio-no-focus"
515
+ />,
516
+ { wrapper: PatternsFieldsTestProvider },
517
+ );
518
+ const input = getInput(container, 'audio-no-focus').audio;
519
+
520
+ expect(await input.isAddButtonFocused()).toBe(false);
521
+ });
522
+
523
+ it('reports onBlur and keeps the value when the audio picker is dismissed', async () => {
524
+ const onChange = jest.fn();
525
+ const onBlur = jest.fn();
526
+ const openMediaManager = jest.fn().mockResolvedValue({ items: [] });
527
+ const { container } = render(
528
+ <ControlledAudioInput
529
+ data={undefined}
530
+ onChange={onChange}
531
+ onBlur={onBlur}
532
+ dataHook="audio-blur"
533
+ />,
534
+ { wrapper: withMediaManager(openMediaManager) },
535
+ );
536
+ const input = getInput(container, 'audio-blur').audio;
537
+
538
+ await input.clickAddButton();
539
+ await act(async () => {});
540
+
541
+ expect(openMediaManager).toHaveBeenCalledTimes(1);
542
+ expect(onBlur).toHaveBeenCalledTimes(1);
543
+ expect(onChange).not.toHaveBeenCalled();
544
+ });
545
+
546
+ it('forwards autoFocus to the audio add button', async () => {
547
+ const { container } = render(
548
+ <ControlledAudioInput
549
+ data={undefined}
550
+ onChange={jest.fn()}
551
+ autoFocus
552
+ dataHook="audio-focus"
553
+ />,
554
+ { wrapper: PatternsFieldsTestProvider },
555
+ );
556
+ const input = getInput(container, 'audio-focus').audio;
557
+
558
+ expect(await input.isAddButtonFocused()).toBe(true);
559
+ });
560
+
561
+ it('follows image prop changes and reports user edits', async () => {
562
+ const onChange = jest.fn();
563
+ const { container, rerender } = render(
564
+ <ControlledImageInput
565
+ data={undefined}
566
+ onChange={onChange}
567
+ dataHook="image"
568
+ />,
569
+ { wrapper: PatternsFieldsTestProvider },
570
+ );
571
+ const input = getInput(container, 'image').image;
572
+
573
+ expect(await input.isAddItemVisible()).toBe(true);
574
+
575
+ rerender(
576
+ <ControlledImageInput
577
+ data={IMAGE_URI}
578
+ onChange={onChange}
579
+ dataHook="image"
580
+ />,
581
+ );
582
+
583
+ expect(await input.isAddItemVisible()).toBe(false);
584
+ expect(await input.getImageUrl()).toContain(
585
+ 'dafa67_9aa1f03ed7274a7795d2f2e18a245ac7',
586
+ );
587
+ });
588
+
589
+ it('reports removing the image as onChange(undefined)', async () => {
590
+ const onChange = jest.fn();
591
+ const { container } = render(
592
+ <ControlledImageInput
593
+ data={IMAGE_URI}
594
+ onChange={onChange}
595
+ dataHook="image-remove"
596
+ />,
597
+ { wrapper: PatternsFieldsTestProvider },
598
+ );
599
+ const input = getInput(container, 'image-remove').image;
600
+ await input.simulateImageLoad();
601
+
602
+ await input.clickRemove();
603
+
604
+ expect(onChange).toHaveBeenCalledTimes(1);
605
+ expect(onChange).toHaveBeenCalledWith(undefined);
606
+ });
607
+
608
+ it('drops the image edit affordances when readOnly', async () => {
609
+ const { container } = render(
610
+ <ControlledImageInput
611
+ data={IMAGE_URI}
612
+ onChange={jest.fn()}
613
+ readOnly
614
+ dataHook="image-readonly"
615
+ />,
616
+ { wrapper: PatternsFieldsTestProvider },
617
+ );
618
+ const input = getInput(container, 'image-readonly').image;
619
+ await input.simulateImageLoad();
620
+
621
+ expect(await input.removeButtonExists()).toBe(false);
622
+ expect(await input.updateButtonExists()).toBe(false);
623
+ });
624
+
625
+ it('reports the picked image URI as onChange', async () => {
626
+ const onChange = jest.fn();
627
+ const openMediaManager = jest.fn().mockResolvedValue({
628
+ items: [{ media: { image: { image: IMAGE_URI } } }],
629
+ });
630
+ const { container } = render(
631
+ <ControlledImageInput
632
+ data={undefined}
633
+ onChange={onChange}
634
+ dataHook="image-pick"
635
+ />,
636
+ { wrapper: withMediaManager(openMediaManager) },
637
+ );
638
+ const input = getInput(container, 'image-pick').image;
639
+
640
+ await input.clickAddButton();
641
+ // The preset runs on fake timers, so the media-manager promise has to be
642
+ // drained through act rather than a timer.
643
+ await act(async () => {});
644
+
645
+ expect(openMediaManager).toHaveBeenCalledWith({
646
+ multiSelect: false,
647
+ category: 'IMAGE',
648
+ });
649
+ expect(onChange).toHaveBeenCalledWith(IMAGE_URI);
650
+ });
651
+
652
+ it('does not focus the image add button when autoFocus is not set', async () => {
653
+ const { container } = render(
654
+ <ControlledImageInput
655
+ data={undefined}
656
+ onChange={jest.fn()}
657
+ dataHook="image-no-focus"
658
+ />,
659
+ { wrapper: PatternsFieldsTestProvider },
660
+ );
661
+
662
+ const input = getInput(container, 'image-no-focus').image;
663
+
664
+ expect(await input.isAddButtonFocused()).toBe(false);
665
+ });
666
+
667
+ it('focuses the image once it has loaded, not while the loader is up', async () => {
668
+ const { container } = render(
669
+ <ControlledImageInput
670
+ data={IMAGE_URI}
671
+ onChange={jest.fn()}
672
+ autoFocus
673
+ dataHook="image-late-focus"
674
+ />,
675
+ { wrapper: PatternsFieldsTestProvider },
676
+ );
677
+ const input = getInput(container, 'image-late-focus').image;
678
+
679
+ expect(await input.containsFocus()).toBe(false);
680
+
681
+ await act(async () => {
682
+ await input.simulateImageLoad();
683
+ });
684
+
685
+ expect(await input.containsFocus()).toBe(true);
686
+ });
687
+
688
+ it('keeps the image and reports onBlur when the picker is dismissed', async () => {
689
+ const onChange = jest.fn();
690
+ const onBlur = jest.fn();
691
+ const openMediaManager = jest.fn().mockResolvedValue({ items: [] });
692
+ const { container } = render(
693
+ <ControlledImageInput
694
+ data={undefined}
695
+ onChange={onChange}
696
+ onBlur={onBlur}
697
+ dataHook="image-cancel"
698
+ />,
699
+ { wrapper: withMediaManager(openMediaManager) },
700
+ );
701
+ const input = getInput(container, 'image-cancel').image;
702
+
703
+ await input.clickAddButton();
704
+ await act(async () => {});
705
+
706
+ expect(openMediaManager).toHaveBeenCalledTimes(1);
707
+ expect(onBlur).toHaveBeenCalledTimes(1);
708
+ expect(onChange).not.toHaveBeenCalled();
709
+ });
710
+
711
+ it('opens the image picker once when the add button is clicked twice', async () => {
712
+ let resolvePick: (value: unknown) => void = () => {};
713
+ const openMediaManager = jest.fn().mockImplementation(
714
+ () =>
715
+ new Promise((resolve) => {
716
+ resolvePick = resolve;
717
+ }),
718
+ );
719
+ const { container } = render(
720
+ <ControlledImageInput
721
+ data={undefined}
722
+ onChange={jest.fn()}
723
+ dataHook="image-double"
724
+ />,
725
+ { wrapper: withMediaManager(openMediaManager) },
726
+ );
727
+ const input = getInput(container, 'image-double').image;
728
+
729
+ await input.clickAddButton();
730
+ await input.clickAddButton();
731
+
732
+ expect(openMediaManager).toHaveBeenCalledTimes(1);
733
+
734
+ await act(async () => {
735
+ resolvePick({ items: [] });
736
+ });
737
+ });
738
+
739
+ it('disables the image add button when readOnly', async () => {
740
+ const { container } = render(
741
+ <ControlledImageInput
742
+ data={undefined}
743
+ onChange={jest.fn()}
744
+ readOnly
745
+ dataHook="image-readonly-add"
746
+ />,
747
+ { wrapper: PatternsFieldsTestProvider },
748
+ );
749
+
750
+ const input = getInput(container, 'image-readonly-add').image;
751
+
752
+ expect(await input.isAddItemVisible()).toBe(true);
753
+ expect(await input.isAddButtonDisabled()).toBe(true);
754
+ });
755
+
756
+ it('hides the image remove button when no onClear is given', async () => {
757
+ const { container } = render(
758
+ <FormImageField
759
+ data={IMAGE_URI}
760
+ onChange={jest.fn()}
761
+ dataHook="image-no-clear"
762
+ />,
763
+ { wrapper: PatternsFieldsTestProvider },
764
+ );
765
+ const input = getInput(container, 'image-no-clear').image;
766
+ await input.simulateImageLoad();
767
+
768
+ expect(await input.removeButtonExists()).toBe(false);
769
+ expect(await input.updateButtonExists()).toBe(true);
770
+ });
771
+
772
+ it('reports image edits through onInput', async () => {
773
+ const onInput = jest.fn();
774
+ const openMediaManager = jest.fn().mockResolvedValue({
775
+ items: [{ media: { image: { image: IMAGE_URI } } }],
776
+ });
777
+ const { container } = render(
778
+ <FormImageField
779
+ data={undefined}
780
+ onChange={jest.fn()}
781
+ onClear={jest.fn()}
782
+ onInput={onInput}
783
+ dataHook="image-oninput"
784
+ />,
785
+ { wrapper: withMediaManager(openMediaManager) },
786
+ );
787
+ const input = getInput(container, 'image-oninput').image;
788
+
789
+ await input.clickAddButton();
790
+ await act(async () => {});
791
+
792
+ expect(onInput).toHaveBeenCalledTimes(1);
793
+ });
794
+
795
+ it('forwards autoFocus to the image add button', async () => {
796
+ const { container } = render(
797
+ <ControlledImageInput
798
+ data={undefined}
799
+ onChange={jest.fn()}
800
+ autoFocus
801
+ dataHook="image-focus"
802
+ />,
803
+ { wrapper: PatternsFieldsTestProvider },
804
+ );
805
+
806
+ const input = getInput(container, 'image-focus').image;
807
+
808
+ expect(await input.isAddButtonFocused()).toBe(true);
809
+ });
810
+
811
+ it('follows video prop changes and reports user edits', async () => {
812
+ const onChange = jest.fn();
813
+ const { container, rerender } = render(
814
+ <ControlledVideoInput
815
+ data={undefined}
816
+ onChange={onChange}
817
+ dataHook="video"
818
+ />,
819
+ { wrapper: PatternsFieldsTestProvider },
820
+ );
821
+ const input = getInput(container, 'video').video;
822
+
823
+ expect(await input.isAddItemVisible()).toBe(true);
824
+ expect(await input.hasReplaceButton()).toBe(false);
825
+
826
+ rerender(
827
+ <ControlledVideoInput
828
+ data={VIDEO_URI}
829
+ onChange={onChange}
830
+ dataHook="video"
831
+ />,
832
+ );
833
+
834
+ // The empty and filled states are different elements, so the testkit has
835
+ // to be re-created after the swap - the old one holds the detached node.
836
+ const filled = getInput(container, 'video').video;
837
+
838
+ expect(await filled.hasReplaceButton()).toBe(true);
839
+ expect(await filled.hasMoreButton()).toBe(true);
840
+ });
841
+
842
+ it('reports deleting the video as onChange(undefined)', async () => {
843
+ const onChange = jest.fn();
844
+ const { container } = render(
845
+ <ControlledVideoInput
846
+ data={VIDEO_URI}
847
+ onChange={onChange}
848
+ dataHook="video-delete"
849
+ />,
850
+ { wrapper: PatternsFieldsTestProvider },
851
+ );
852
+ const input = getInput(container, 'video-delete').video;
853
+
854
+ await input.clickMore();
855
+ await input.clickDelete();
856
+
857
+ expect(onChange).toHaveBeenCalledTimes(1);
858
+ expect(onChange).toHaveBeenCalledWith(undefined);
859
+ });
860
+
861
+ it('disables the video replace and delete actions when readOnly', async () => {
862
+ const { container } = render(
863
+ <ControlledVideoInput
864
+ data={VIDEO_URI}
865
+ onChange={jest.fn()}
866
+ readOnly
867
+ dataHook="video-readonly"
868
+ />,
869
+ { wrapper: PatternsFieldsTestProvider },
870
+ );
871
+ const input = getInput(container, 'video-readonly').video;
872
+
873
+ expect(await input.isReplaceDisabled()).toBe(true);
874
+
875
+ await input.clickMore();
876
+ expect(await input.isDeleteDisabled()).toBe(true);
877
+ });
878
+
879
+ it('reports the picked video URI as onChange', async () => {
880
+ const onChange = jest.fn();
881
+ const openMediaManager = jest.fn().mockResolvedValue({
882
+ items: [{ media: { video: VIDEO_URI } }],
883
+ });
884
+ const { container } = render(
885
+ <ControlledVideoInput
886
+ data={undefined}
887
+ onChange={onChange}
888
+ dataHook="video-pick"
889
+ />,
890
+ { wrapper: withMediaManager(openMediaManager) },
891
+ );
892
+ const input = getInput(container, 'video-pick').video;
893
+
894
+ await input.clickAddButton();
895
+ // The preset runs on fake timers, so the media-manager promise has to be
896
+ // drained through act rather than a timer.
897
+ await act(async () => {});
898
+
899
+ expect(openMediaManager).toHaveBeenCalledWith({
900
+ multiSelect: false,
901
+ category: 'VIDEO',
902
+ });
903
+ expect(onChange).toHaveBeenCalledWith(VIDEO_URI);
904
+ });
905
+
906
+ it('does not focus the video add button when autoFocus is not set', async () => {
907
+ const { container } = render(
908
+ <ControlledVideoInput
909
+ data={undefined}
910
+ onChange={jest.fn()}
911
+ dataHook="video-no-focus"
912
+ />,
913
+ { wrapper: PatternsFieldsTestProvider },
914
+ );
915
+
916
+ const input = getInput(container, 'video-no-focus').video;
917
+
918
+ expect(await input.isAddButtonFocused()).toBe(false);
919
+ });
920
+
921
+ it('reads the picked video URI from the nested media shape', async () => {
922
+ const onChange = jest.fn();
923
+ const openMediaManager = jest.fn().mockResolvedValue({
924
+ items: [{ media: { video: { video: VIDEO_URI } } }],
925
+ });
926
+ const { container } = render(
927
+ <ControlledVideoInput
928
+ data={undefined}
929
+ onChange={onChange}
930
+ dataHook="video-nested"
931
+ />,
932
+ { wrapper: withMediaManager(openMediaManager) },
933
+ );
934
+ const input = getInput(container, 'video-nested').video;
935
+
936
+ await input.clickAddButton();
937
+ await act(async () => {});
938
+
939
+ expect(onChange).toHaveBeenCalledWith(VIDEO_URI);
940
+ });
941
+
942
+ it('keeps the video and reports onBlur when the picker is dismissed', async () => {
943
+ const onChange = jest.fn();
944
+ const onBlur = jest.fn();
945
+ const openMediaManager = jest.fn().mockResolvedValue({ items: [] });
946
+ const { container } = render(
947
+ <ControlledVideoInput
948
+ data={undefined}
949
+ onChange={onChange}
950
+ onBlur={onBlur}
951
+ dataHook="video-cancel"
952
+ />,
953
+ { wrapper: withMediaManager(openMediaManager) },
954
+ );
955
+ const input = getInput(container, 'video-cancel').video;
956
+
957
+ await input.clickAddButton();
958
+ await act(async () => {});
959
+
960
+ expect(openMediaManager).toHaveBeenCalledTimes(1);
961
+ expect(onBlur).toHaveBeenCalledTimes(1);
962
+ expect(onChange).not.toHaveBeenCalled();
963
+ });
964
+
965
+ it('opens the video picker once when the add button is clicked twice', async () => {
966
+ let resolvePick: (value: unknown) => void = () => {};
967
+ const openMediaManager = jest.fn().mockImplementation(
968
+ () =>
969
+ new Promise((resolve) => {
970
+ resolvePick = resolve;
971
+ }),
972
+ );
973
+ const { container } = render(
974
+ <ControlledVideoInput
975
+ data={undefined}
976
+ onChange={jest.fn()}
977
+ dataHook="video-double"
978
+ />,
979
+ { wrapper: withMediaManager(openMediaManager) },
980
+ );
981
+ const input = getInput(container, 'video-double').video;
982
+
983
+ await input.clickAddButton();
984
+ await input.clickAddButton();
985
+
986
+ expect(openMediaManager).toHaveBeenCalledTimes(1);
987
+
988
+ await act(async () => {
989
+ resolvePick({ items: [] });
990
+ });
991
+ });
992
+
993
+ it('disables the video add button when readOnly', async () => {
994
+ const { container } = render(
995
+ <ControlledVideoInput
996
+ data={undefined}
997
+ onChange={jest.fn()}
998
+ readOnly
999
+ dataHook="video-readonly-add"
1000
+ />,
1001
+ { wrapper: PatternsFieldsTestProvider },
1002
+ );
1003
+
1004
+ const input = getInput(container, 'video-readonly-add').video;
1005
+
1006
+ expect(await input.isAddItemVisible()).toBe(true);
1007
+ expect(await input.isAddButtonDisabled()).toBe(true);
1008
+ });
1009
+
1010
+ it('disables the video delete action when no onClear is given', async () => {
1011
+ const { container } = render(
1012
+ <FormVideoField
1013
+ data={VIDEO_URI}
1014
+ onChange={jest.fn()}
1015
+ dataHook="video-no-clear"
1016
+ />,
1017
+ { wrapper: PatternsFieldsTestProvider },
1018
+ );
1019
+ const input = getInput(container, 'video-no-clear').video;
1020
+
1021
+ await input.clickMore();
1022
+
1023
+ expect(await input.isDeleteDisabled()).toBe(true);
1024
+ });
1025
+
1026
+ it('reports video edits through onInput', async () => {
1027
+ const onInput = jest.fn();
1028
+ const openMediaManager = jest.fn().mockResolvedValue({
1029
+ items: [{ media: { video: VIDEO_URI } }],
1030
+ });
1031
+ const { container } = render(
1032
+ <FormVideoField
1033
+ data={undefined}
1034
+ onChange={jest.fn()}
1035
+ onClear={jest.fn()}
1036
+ onInput={onInput}
1037
+ dataHook="video-oninput"
1038
+ />,
1039
+ { wrapper: withMediaManager(openMediaManager) },
1040
+ );
1041
+ const input = getInput(container, 'video-oninput').video;
1042
+
1043
+ await input.clickAddButton();
1044
+ await act(async () => {});
1045
+
1046
+ expect(onInput).toHaveBeenCalledTimes(1);
1047
+ });
1048
+
1049
+ it('forwards autoFocus to the video add button', async () => {
1050
+ const { container } = render(
1051
+ <ControlledVideoInput
1052
+ data={undefined}
1053
+ onChange={jest.fn()}
1054
+ autoFocus
1055
+ dataHook="video-focus"
1056
+ />,
1057
+ { wrapper: PatternsFieldsTestProvider },
1058
+ );
1059
+
1060
+ const input = getInput(container, 'video-focus').video;
1061
+
1062
+ expect(await input.isAddButtonFocused()).toBe(true);
1063
+ });
1064
+
1065
+ it('titles the video preview "Preview" when previewTitle is not given', async () => {
1066
+ const { container } = render(
1067
+ <ControlledVideoInput
1068
+ data={VIDEO_URI}
1069
+ onChange={jest.fn()}
1070
+ dataHook="video-preview-title"
1071
+ />,
1072
+ { wrapper: PatternsFieldsTestProvider },
1073
+ );
1074
+ const input = getInput(container, 'video-preview-title').video;
1075
+
1076
+ await input.clickMore();
1077
+ await input.clickPreview();
1078
+
1079
+ expect(await input.getPreviewTitle()).toBe(
1080
+ 'auto-patterns.fields.preview_video',
1081
+ );
1082
+ });
407
1083
  });