media-video-widget.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <?php
  2. /**
  3. * Unit tests covering WP_Widget_Media_Video functionality.
  4. *
  5. * @package WordPress
  6. * @subpackage widgets
  7. */
  8. /**
  9. * Test wp-includes/widgets/class-wp-widget-video.php
  10. *
  11. * @group widgets
  12. */
  13. class Test_WP_Widget_Media_Video extends WP_UnitTestCase {
  14. /**
  15. * Clean up global scope.
  16. *
  17. * @global WP_Scripts $wp_scripts
  18. * @global WP_Styles $wp_styles
  19. */
  20. function clean_up_global_scope() {
  21. global $wp_scripts, $wp_styles;
  22. parent::clean_up_global_scope();
  23. $wp_scripts = null;
  24. $wp_styles = null;
  25. }
  26. /**
  27. * Test get_instance_schema method.
  28. *
  29. * @covers WP_Widget_Media_Video::get_instance_schema
  30. */
  31. function test_get_instance_schema() {
  32. $widget = new WP_Widget_Media_Video();
  33. $schema = $widget->get_instance_schema();
  34. $this->assertSameSets(
  35. array_merge(
  36. array(
  37. 'attachment_id',
  38. 'preload',
  39. 'loop',
  40. 'title',
  41. 'url',
  42. 'content',
  43. ),
  44. wp_get_video_extensions()
  45. ),
  46. array_keys( $schema )
  47. );
  48. }
  49. /**
  50. * Test schema filtering.
  51. *
  52. * @covers WP_Widget_Media_Video::get_instance_schema
  53. *
  54. * @ticket 45029
  55. */
  56. function test_get_instance_schema_filtering() {
  57. $widget = new WP_Widget_Media_Video();
  58. $schema = $widget->get_instance_schema();
  59. add_filter( 'widget_media_video_instance_schema', array( $this, 'filter_instance_schema' ), 10, 2 );
  60. $schema = $widget->get_instance_schema();
  61. $this->assertTrue( $schema['loop']['default'] );
  62. }
  63. /**
  64. * Filters instance schema.
  65. *
  66. * @since 5.2.0
  67. *
  68. * @param array $schema Schema.
  69. * @param WP_Widget_Media_Video $widget Widget.
  70. * @return array
  71. */
  72. public function filter_instance_schema( $schema, $widget ) {
  73. // Override the default loop value (false).
  74. $schema['loop']['default'] = true;
  75. return $schema;
  76. }
  77. /**
  78. * Test constructor.
  79. *
  80. * @covers WP_Widget_Media_Video::__construct
  81. */
  82. function test_constructor() {
  83. $widget = new WP_Widget_Media_Video();
  84. $this->assertArrayHasKey( 'mime_type', $widget->widget_options );
  85. $this->assertArrayHasKey( 'customize_selective_refresh', $widget->widget_options );
  86. $this->assertArrayHasKey( 'description', $widget->widget_options );
  87. $this->assertTrue( $widget->widget_options['customize_selective_refresh'] );
  88. $this->assertSame( 'video', $widget->widget_options['mime_type'] );
  89. $this->assertSameSets(
  90. array(
  91. 'add_to_widget',
  92. 'replace_media',
  93. 'unsupported_file_type',
  94. 'edit_media',
  95. 'media_library_state_multi',
  96. 'media_library_state_single',
  97. 'missing_attachment',
  98. 'no_media_selected',
  99. 'add_media',
  100. ),
  101. array_keys( $widget->l10n )
  102. );
  103. }
  104. /**
  105. * Test get_instance_schema method.
  106. *
  107. * @covers WP_Widget_Media_Video::update
  108. */
  109. function test_update() {
  110. $widget = new WP_Widget_Media_Video();
  111. $instance = array();
  112. // Should return valid attachment ID.
  113. $expected = array(
  114. 'attachment_id' => 1,
  115. );
  116. $result = $widget->update( $expected, $instance );
  117. $this->assertSame( $result, $expected );
  118. // Should filter invalid attachment ID.
  119. $result = $widget->update(
  120. array(
  121. 'attachment_id' => 'media',
  122. ),
  123. $instance
  124. );
  125. $this->assertSame( $result, $instance );
  126. // Should return valid attachment url.
  127. $expected = array(
  128. 'url' => 'https://chickenandribs.org',
  129. );
  130. $result = $widget->update( $expected, $instance );
  131. $this->assertSame( $result, $expected );
  132. // Should filter invalid attachment url.
  133. $result = $widget->update(
  134. array(
  135. 'url' => 'not_a_url',
  136. ),
  137. $instance
  138. );
  139. $this->assertNotSame( $result, $instance );
  140. $this->assertStringStartsWith( 'http://', $result['url'] );
  141. // Should return loop setting.
  142. $expected = array(
  143. 'loop' => true,
  144. );
  145. $result = $widget->update( $expected, $instance );
  146. $this->assertSame( $result, $expected );
  147. // Should filter invalid loop setting.
  148. $result = $widget->update(
  149. array(
  150. 'loop' => 'not-boolean',
  151. ),
  152. $instance
  153. );
  154. $this->assertSame( $result, $instance );
  155. // Should return valid attachment title.
  156. $expected = array(
  157. 'title' => 'A video of goats',
  158. );
  159. $result = $widget->update( $expected, $instance );
  160. $this->assertSame( $result, $expected );
  161. // Should filter invalid attachment title.
  162. $result = $widget->update(
  163. array(
  164. 'title' => '<h1>Cute Baby Goats</h1>',
  165. ),
  166. $instance
  167. );
  168. $this->assertNotSame( $result, $instance );
  169. // Should return valid preload setting.
  170. $expected = array(
  171. 'preload' => 'none',
  172. );
  173. $result = $widget->update( $expected, $instance );
  174. $this->assertSame( $result, $expected );
  175. // Should filter invalid preload setting.
  176. $result = $widget->update(
  177. array(
  178. 'preload' => 'nope',
  179. ),
  180. $instance
  181. );
  182. $this->assertSame( $result, $instance );
  183. // Should filter invalid key.
  184. $result = $widget->update(
  185. array(
  186. 'h4x' => 'value',
  187. ),
  188. $instance
  189. );
  190. $this->assertSame( $result, $instance );
  191. }
  192. /**
  193. * Test render_media method.
  194. *
  195. * @covers WP_Widget_Media_Video::render_media
  196. * @covers WP_Widget_Media_Video::inject_video_max_width_style
  197. */
  198. function test_render_media() {
  199. $test_movie_file = __FILE__ . '../../data/uploads/small-video.m4v';
  200. $widget = new WP_Widget_Media_Video();
  201. $attachment_id = self::factory()->attachment->create_object(
  202. array(
  203. 'file' => $test_movie_file,
  204. 'post_parent' => 0,
  205. 'post_mime_type' => 'video/mp4',
  206. 'post_title' => 'Test Video',
  207. )
  208. );
  209. wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $test_movie_file ) );
  210. // Should be empty when there is no attachment_id.
  211. ob_start();
  212. $widget->render_media( array() );
  213. $output = ob_get_clean();
  214. $this->assertEmpty( $output );
  215. // Should be empty when there is an invalid attachment_id.
  216. ob_start();
  217. $widget->render_media(
  218. array(
  219. 'attachment_id' => 777,
  220. )
  221. );
  222. $output = ob_get_clean();
  223. $this->assertEmpty( $output );
  224. // Tests with video from library.
  225. ob_start();
  226. $widget->render_media(
  227. array(
  228. 'attachment_id' => $attachment_id,
  229. )
  230. );
  231. $output = ob_get_clean();
  232. // Check default outputs.
  233. $this->assertContains( 'preload="metadata"', $output );
  234. $this->assertContains( 'class="wp-video"', $output );
  235. $this->assertContains( 'width:100%', $output );
  236. $this->assertNotContains( 'height=', $output );
  237. $this->assertNotContains( 'width="', $output );
  238. $this->assertContains( 'small-video.m4v', $output );// Auto parses dimensions.
  239. ob_start();
  240. $widget->render_media(
  241. array(
  242. 'attachment_id' => $attachment_id,
  243. 'title' => 'Open Source Cartoon',
  244. 'preload' => 'metadata',
  245. 'loop' => true,
  246. )
  247. );
  248. $output = ob_get_clean();
  249. // Custom attributes.
  250. $this->assertContains( 'preload="metadata"', $output );
  251. $this->assertContains( 'loop="1"', $output );
  252. // Externally hosted video.
  253. ob_start();
  254. $content = '<track srclang="en" label="English" kind="subtitles" src="http://example.com/wp-content/uploads/2017/04/subtitles-en.vtt">';
  255. $widget->render_media(
  256. array(
  257. 'attachment_id' => null,
  258. 'loop' => false,
  259. 'url' => 'https://www.youtube.com/watch?v=72xdCU__XCk',
  260. 'content' => $content,
  261. )
  262. );
  263. $output = ob_get_clean();
  264. // Custom attributes.
  265. $this->assertContains( 'preload="metadata"', $output );
  266. $this->assertContains( 'src="https://www.youtube.com/watch?v=72xdCU__XCk', $output );
  267. $this->assertContains( $content, $output );
  268. }
  269. /**
  270. * Test enqueue_preview_scripts method.
  271. *
  272. * @global WP_Scripts $wp_scripts
  273. * @global WP_Styles $wp_styles
  274. * @covers WP_Widget_Media_Video::enqueue_preview_scripts
  275. */
  276. function test_enqueue_preview_scripts() {
  277. global $wp_scripts, $wp_styles;
  278. $widget = new WP_Widget_Media_Video();
  279. $wp_scripts = null;
  280. $wp_styles = null;
  281. $widget->enqueue_preview_scripts();
  282. $this->assertTrue( wp_script_is( 'wp-mediaelement' ) );
  283. $this->assertTrue( wp_style_is( 'wp-mediaelement' ) );
  284. $this->assertTrue( wp_script_is( 'mediaelement-vimeo' ) );
  285. $wp_scripts = null;
  286. $wp_styles = null;
  287. add_filter( 'wp_video_shortcode_library', '__return_empty_string' );
  288. $widget->enqueue_preview_scripts();
  289. $this->assertFalse( wp_script_is( 'wp-mediaelement' ) );
  290. $this->assertFalse( wp_style_is( 'wp-mediaelement' ) );
  291. $this->assertFalse( wp_script_is( 'mediaelement-vimeo' ) );
  292. }
  293. /**
  294. * Test enqueue_admin_scripts method.
  295. *
  296. * @covers WP_Widget_Media_Video::enqueue_admin_scripts
  297. */
  298. function test_enqueue_admin_scripts() {
  299. set_current_screen( 'widgets.php' );
  300. $widget = new WP_Widget_Media_Video();
  301. $widget->enqueue_admin_scripts();
  302. $this->assertTrue( wp_script_is( 'media-video-widget' ) );
  303. }
  304. /**
  305. * Test render_control_template_scripts method.
  306. *
  307. * @covers WP_Widget_Media_Video::render_control_template_scripts
  308. */
  309. function test_render_control_template_scripts() {
  310. $widget = new WP_Widget_Media_Video();
  311. ob_start();
  312. $widget->render_control_template_scripts();
  313. $output = ob_get_clean();
  314. $this->assertContains( '<script type="text/html" id="tmpl-wp-media-widget-video-preview">', $output );
  315. }
  316. }