Skip to content

Commit db2375b

Browse files
committed
Tests: Improve documentation and coverage for wp_add_id3_tag_data() tests
1 parent 61492fd commit db2375b

File tree

2 files changed

+299
-14
lines changed

2 files changed

+299
-14
lines changed

src/wp-admin/includes/media.php

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3534,20 +3534,7 @@ function wp_add_id3_tag_data( &$metadata, $data ) {
35343534
if ( ! empty( $data[ $version ]['comments'] ) ) {
35353535
foreach ( $data[ $version ]['comments'] as $key => $list ) {
35363536
if ( 'length' !== $key && ! empty( $list ) ) {
3537-
$value = reset( $list );
3538-
// Ensure we have a string value before passing to wp_kses_post
3539-
if ( is_array( $value ) ) {
3540-
foreach ( $value as &$v ) {
3541-
if ( is_array( $v ) ) {
3542-
$v = json_encode( $v );
3543-
}
3544-
}
3545-
$value = implode( ' ', $value );
3546-
} elseif ( ! is_string( $value ) ) {
3547-
$value = (string) $value;
3548-
}
3549-
3550-
$metadata[ $key ] = wp_kses_post( $value );
3537+
$metadata[ $key ] = is_array( $list ) ? wp_kses_post_deep( reset( $list ) ) : wp_kses_post( $list );
35513538
// Fix bug in byte stream analysis.
35523539
if ( 'terms_of_use' === $key && str_starts_with( $metadata[ $key ], 'yright notice.' ) ) {
35533540
$metadata[ $key ] = 'Cop' . $metadata[ $key ];
Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
<?php
2+
/**
3+
* Tests for the `wp_add_id3_tag_data()` function.
4+
*
5+
* @group media
6+
* @covers ::wp_add_id3_tag_data
7+
*/
8+
class Tests_Media_WpAddId3TagData extends WP_UnitTestCase {
9+
10+
/**
11+
* Performs cleanup after each test.
12+
*/
13+
public function tear_down() {
14+
$this->remove_added_uploads();
15+
parent::tear_down();
16+
}
17+
18+
/**
19+
* Test wp_add_id3_tag_data() with ID3v2 comments.
20+
*/
21+
public function test_wp_add_id3_tag_data_id3v2_comments() {
22+
$metadata = array();
23+
$data = array(
24+
'id3v2' => array(
25+
'comments' => array(
26+
'title' => array( 'Test Title' ),
27+
'artist' => array( 'Test Artist' ),
28+
'album' => array( 'Test Album' ),
29+
'year' => array( '2024' ),
30+
'length' => array( '3:45' ), // Should be ignored
31+
),
32+
),
33+
);
34+
35+
wp_add_id3_tag_data( $metadata, $data );
36+
37+
$this->assertEquals( 'Test Title', $metadata['title'] );
38+
$this->assertEquals( 'Test Artist', $metadata['artist'] );
39+
$this->assertEquals( 'Test Album', $metadata['album'] );
40+
$this->assertEquals( '2024', $metadata['year'] );
41+
$this->assertArrayNotHasKey( 'length', $metadata );
42+
}
43+
44+
/**
45+
* Test wp_add_id3_tag_data() with ID3v1 comments.
46+
*/
47+
public function test_wp_add_id3_tag_data_id3v1_comments() {
48+
$metadata = array();
49+
$data = array(
50+
'id3v1' => array(
51+
'comments' => array(
52+
'title' => array( 'Test Title' ),
53+
'artist' => array( 'Test Artist' ),
54+
'album' => array( 'Test Album' ),
55+
),
56+
),
57+
);
58+
59+
wp_add_id3_tag_data( $metadata, $data );
60+
61+
$this->assertEquals( 'Test Title', $metadata['title'] );
62+
$this->assertEquals( 'Test Artist', $metadata['artist'] );
63+
$this->assertEquals( 'Test Album', $metadata['album'] );
64+
}
65+
66+
/**
67+
* Test wp_add_id3_tag_data() with array values.
68+
*/
69+
public function test_wp_add_id3_tag_data_array_values() {
70+
$metadata = array();
71+
$data = array(
72+
'id3v2' => array(
73+
'comments' => array(
74+
'title' => array( 'Part 1', 'Part 2' ),
75+
'artist' => array( 'Artist 1', 'Artist 2' ),
76+
),
77+
),
78+
);
79+
80+
wp_add_id3_tag_data( $metadata, $data );
81+
82+
$this->assertEquals( 'Part 1', $metadata['title'] );
83+
$this->assertEquals( 'Artist 1', $metadata['artist'] );
84+
}
85+
86+
/**
87+
* Test wp_add_id3_tag_data() with APIC image data.
88+
*/
89+
public function test_wp_add_id3_tag_data_apic_image() {
90+
$metadata = array();
91+
$data = array(
92+
'id3v2' => array(
93+
'APIC' => array(
94+
array(
95+
'data' => 'image_data',
96+
'image_mime' => 'image/jpeg',
97+
'image_width' => 800,
98+
'image_height' => 600,
99+
),
100+
),
101+
),
102+
);
103+
104+
wp_add_id3_tag_data( $metadata, $data );
105+
106+
$this->assertArrayHasKey( 'image', $metadata );
107+
$this->assertEquals( 'image_data', $metadata['image']['data'] );
108+
$this->assertEquals( 'image/jpeg', $metadata['image']['mime'] );
109+
$this->assertEquals( 800, $metadata['image']['width'] );
110+
$this->assertEquals( 600, $metadata['image']['height'] );
111+
}
112+
113+
/**
114+
* Test wp_add_id3_tag_data() with comments picture.
115+
*/
116+
public function test_wp_add_id3_tag_data_comments_picture() {
117+
$metadata = array();
118+
$data = array(
119+
'comments' => array(
120+
'picture' => array(
121+
array(
122+
'data' => 'image_data',
123+
'image_mime' => 'image/png',
124+
),
125+
),
126+
),
127+
);
128+
129+
wp_add_id3_tag_data( $metadata, $data );
130+
131+
$this->assertArrayHasKey( 'image', $metadata );
132+
$this->assertEquals( 'image_data', $metadata['image']['data'] );
133+
$this->assertEquals( 'image/png', $metadata['image']['mime'] );
134+
}
135+
136+
/**
137+
* Test wp_add_id3_tag_data() with terms_of_use fix.
138+
*/
139+
public function test_wp_add_id3_tag_data_terms_of_use_fix() {
140+
$metadata = array();
141+
$data = array(
142+
'id3v2' => array(
143+
'comments' => array(
144+
'terms_of_use' => array( 'yright notice. All rights reserved.' ),
145+
),
146+
),
147+
);
148+
149+
wp_add_id3_tag_data( $metadata, $data );
150+
151+
$this->assertEquals( 'Copyright notice. All rights reserved.', $metadata['terms_of_use'] );
152+
}
153+
154+
/**
155+
* Test wp_add_id3_tag_data() with HTML sanitization.
156+
*/
157+
public function test_wp_add_id3_tag_data_html_sanitization() {
158+
$metadata = array();
159+
$data = array(
160+
'id3v2' => array(
161+
'comments' => array(
162+
'title' => array( '<script>alert("XSS")</script>Test Title' ),
163+
'artist' => array( '<a href="javascript:alert(1)">Test Artist</a>' ),
164+
'lyric' => array( '<div class="test"><p>Test lyric</p><script>alert("test");</script><span>More text</span></div>' ),
165+
),
166+
),
167+
);
168+
169+
wp_add_id3_tag_data( $metadata, $data );
170+
171+
// <script> tags are removed, but their content is not kept; only allowed tags and their content remain.
172+
$this->assertEquals( 'alert("XSS")Test Title', $metadata['title'] );
173+
// <a> tags are allowed, but javascript: URLs are stripped from href, so only <a> remains.
174+
$this->assertEquals( '<a href="alert(1)">Test Artist</a>', $metadata['artist'] );
175+
$this->assertEquals( '<div class="test"><p>Test lyric</p>alert("test");<span>More text</span></div>', $metadata['lyric'] );
176+
}
177+
178+
/**
179+
* Test wp_add_id3_tag_data() with empty arrays.
180+
*/
181+
public function test_wp_add_id3_tag_data_empty_arrays() {
182+
$metadata = array();
183+
$data = array(
184+
'id3v2' => array(
185+
'comments' => array(
186+
'title' => array(),
187+
'artist' => array(),
188+
),
189+
),
190+
);
191+
192+
wp_add_id3_tag_data( $metadata, $data );
193+
194+
$this->assertArrayNotHasKey( 'title', $metadata );
195+
$this->assertArrayNotHasKey( 'artist', $metadata );
196+
}
197+
198+
/**
199+
* Test wp_add_id3_tag_data() with special characters.
200+
*/
201+
public function test_wp_add_id3_tag_data_special_characters() {
202+
$metadata = array();
203+
$data = array(
204+
'id3v2' => array(
205+
'comments' => array(
206+
'title' => array( 'Special chars: é, ñ, 漢字, 😀' ),
207+
'artist' => array( 'Artist with & special chars' ),
208+
),
209+
),
210+
);
211+
212+
wp_add_id3_tag_data( $metadata, $data );
213+
214+
$this->assertEquals( 'Special chars: é, ñ, 漢字, 😀', $metadata['title'] );
215+
$this->assertEquals( 'Artist with &amp; special chars', $metadata['artist'] );
216+
}
217+
218+
/**
219+
* Test wp_add_id3_tag_data() with multiple APIC images.
220+
*/
221+
public function test_wp_add_id3_tag_data_multiple_apic() {
222+
$metadata = array();
223+
$data = array(
224+
'id3v2' => array(
225+
'APIC' => array(
226+
array(
227+
'data' => 'front_cover_data',
228+
'image_mime' => 'image/jpeg',
229+
'image_width' => 800,
230+
'image_height' => 600,
231+
),
232+
array(
233+
'data' => 'back_cover_data',
234+
'image_mime' => 'image/png',
235+
'image_width' => 400,
236+
'image_height' => 300,
237+
),
238+
),
239+
),
240+
);
241+
242+
wp_add_id3_tag_data( $metadata, $data );
243+
244+
$this->assertArrayHasKey( 'image', $metadata );
245+
$this->assertEquals( 'front_cover_data', $metadata['image']['data'] );
246+
$this->assertEquals( 'image/jpeg', $metadata['image']['mime'] );
247+
$this->assertEquals( 800, $metadata['image']['width'] );
248+
$this->assertEquals( 600, $metadata['image']['height'] );
249+
}
250+
251+
/**
252+
* Test wp_add_id3_tag_data() with very long values.
253+
*/
254+
public function test_wp_add_id3_tag_data_long_values() {
255+
$metadata = array();
256+
$long_title = str_repeat( 'a', 1000 );
257+
$data = array(
258+
'id3v2' => array(
259+
'comments' => array(
260+
'title' => array( $long_title ),
261+
'artist' => array( str_repeat( 'b', 500 ) ),
262+
),
263+
),
264+
);
265+
266+
wp_add_id3_tag_data( $metadata, $data );
267+
268+
$this->assertEquals( $long_title, $metadata['title'] );
269+
$this->assertEquals( str_repeat( 'b', 500 ), $metadata['artist'] );
270+
}
271+
272+
/**
273+
* Test wp_add_id3_tag_data() with different character encodings.
274+
*/
275+
public function test_wp_add_id3_tag_data_different_encodings() {
276+
$metadata = array();
277+
$data = array(
278+
'id3v2' => array(
279+
'comments' => array(
280+
'title' => array( 'Title with UTF-8: é, ñ, 漢字' ),
281+
'artist' => array( 'Artist with ISO-8859-1: é, ñ' ),
282+
),
283+
'encoding' => 'UTF-8',
284+
),
285+
'id3v1' => array(
286+
'comments' => array(
287+
'title' => array( 'Title with ISO-8859-1: é, ñ' ),
288+
),
289+
'encoding' => 'ISO-8859-1',
290+
),
291+
);
292+
293+
wp_add_id3_tag_data( $metadata, $data );
294+
295+
$this->assertEquals( 'Title with UTF-8: é, ñ, 漢字', $metadata['title'] );
296+
$this->assertEquals( 'Artist with ISO-8859-1: é, ñ', $metadata['artist'] );
297+
}
298+
}

0 commit comments

Comments
 (0)