diff --git a/tests/phpunit/tests/file.php b/tests/phpunit/tests/file.php index 9a29e4e67669a..0d7ad78a150e4 100644 --- a/tests/phpunit/tests/file.php +++ b/tests/phpunit/tests/file.php @@ -15,85 +15,6 @@ public function set_up() { $this->dir = untrailingslashit( get_temp_dir() ); } - /** - * @group plugins - * @group themes - */ - public function test_get_file_data() { - $theme_headers = array( - 'Name' => 'Theme Name', - 'ThemeURI' => 'Theme URI', - 'Description' => 'Description', - 'Version' => 'Version', - 'Author' => 'Author', - 'AuthorURI' => 'Author URI', - ); - - $actual = get_file_data( DIR_TESTDATA . '/themedir1/default/style.css', $theme_headers ); - - $expected = array( - 'Name' => 'WordPress Default', - 'ThemeURI' => 'http://wordpress.org/', - 'Description' => 'The default WordPress theme based on the famous Kubrick.', - 'Version' => '1.6', - 'Author' => 'Michael Heilemann', - 'AuthorURI' => 'http://binarybonsai.com/', - ); - - $this->assertNotEmpty( $actual ); - - foreach ( $actual as $header => $value ) { - $this->assertSame( $expected[ $header ], $value, $header ); - } - } - - /** - * @ticket 19854 - * @group plugins - * @group themes - */ - public function test_get_file_data_with_cr_line_endings() { - $headers = array( - 'SomeHeader' => 'Some Header', - 'Description' => 'Description', - 'Author' => 'Author', - ); - - $actual = get_file_data( DIR_TESTDATA . '/formatting/file-header-cr-line-endings.php', $headers ); - $expected = array( - 'SomeHeader' => 'Some header value!', - 'Description' => 'This file is using CR line endings for a testcase.', - 'Author' => 'A Very Old Mac', - ); - - $this->assertNotEmpty( $actual ); - - foreach ( $actual as $header => $value ) { - $this->assertSame( $expected[ $header ], $value, $header ); - } - } - - /** - * @ticket 47186 - * @group plugins - * @group themes - */ - public function test_get_file_data_with_php_open_tag_prefix() { - $headers = array( - 'TemplateName' => 'Template Name', - ); - - $actual = get_file_data( DIR_TESTDATA . '/formatting/file-header-php-open-tag-prefix.php', $headers ); - $expected = array( - 'TemplateName' => 'Something', - ); - - $this->assertNotEmpty( $actual ); - - foreach ( $actual as $header => $value ) { - $this->assertSame( $expected[ $header ], $value, $header ); - } - } private function is_unique_writable_file( $path, $filename ) { $fullpath = $path . DIRECTORY_SEPARATOR . $filename; diff --git a/tests/phpunit/tests/functions.php b/tests/phpunit/tests/functions.php deleted file mode 100644 index b6080da780ba8..0000000000000 --- a/tests/phpunit/tests/functions.php +++ /dev/null @@ -1,2301 +0,0 @@ -_baba = 5; - $x->yZ = 'baba'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase - $x->a = array( 5, 111, 'x' ); - $this->assertSame( - array( - '_baba' => 5, - 'yZ' => 'baba', - 'a' => array( 5, 111, 'x' ), - ), - wp_parse_args( $x ) - ); - $y = new MockClass(); - $this->assertSame( array(), wp_parse_args( $y ) ); - } - - public function test_wp_parse_args_array() { - // Arrays. - $a = array(); - $this->assertSame( array(), wp_parse_args( $a ) ); - $b = array( - '_baba' => 5, - 'yZ' => 'baba', - 'a' => array( 5, 111, 'x' ), - ); - $this->assertSame( - array( - '_baba' => 5, - 'yZ' => 'baba', - 'a' => array( 5, 111, 'x' ), - ), - wp_parse_args( $b ) - ); - } - - public function test_wp_parse_args_defaults() { - $x = new MockClass(); - $x->_baba = 5; - $x->yZ = 'baba'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase - $x->a = array( 5, 111, 'x' ); - $d = array( 'pu' => 'bu' ); - $this->assertSame( - array( - 'pu' => 'bu', - '_baba' => 5, - 'yZ' => 'baba', - 'a' => array( 5, 111, 'x' ), - ), - wp_parse_args( $x, $d ) - ); - $e = array( '_baba' => 6 ); - $this->assertSame( - array( - '_baba' => 5, - 'yZ' => 'baba', - 'a' => array( 5, 111, 'x' ), - ), - wp_parse_args( $x, $e ) - ); - } - - public function test_wp_parse_args_other() { - $b = true; - wp_parse_str( $b, $s ); - $this->assertSame( $s, wp_parse_args( $b ) ); - $q = 'x=5&_baba=dudu&'; - wp_parse_str( $q, $ss ); - $this->assertSame( $ss, wp_parse_args( $q ) ); - } - - /** - * @ticket 30753 - */ - public function test_wp_parse_args_boolean_strings() { - $args = wp_parse_args( 'foo=false&bar=true' ); - $this->assertIsString( $args['foo'] ); - $this->assertIsString( $args['bar'] ); - } - - /** - * @ticket 35972 - */ - public function test_bool_from_yn() { - $this->assertTrue( bool_from_yn( 'Y' ) ); - $this->assertTrue( bool_from_yn( 'y' ) ); - $this->assertFalse( bool_from_yn( 'n' ) ); - } - - public function test_path_is_absolute() { - $absolute_paths = array( - '/', - '/foo/', - '/foo', - '/FOO/bar', - '/foo/bar/', - '/foo/../bar/', - '\\WINDOWS', - 'C:\\', - 'C:\\WINDOWS', - '\\\\sambashare\\foo', - ); - foreach ( $absolute_paths as $path ) { - $this->assertTrue( path_is_absolute( $path ), "path_is_absolute('$path') should return true" ); - } - } - - public function test_path_is_not_absolute() { - $relative_paths = array( - '', - '.', - '..', - '../foo', - '../', - '../foo.bar', - 'foo/bar', - 'foo', - 'FOO', - '..\\WINDOWS', - ); - foreach ( $relative_paths as $path ) { - $this->assertFalse( path_is_absolute( $path ), "path_is_absolute('$path') should return false" ); - } - } - - /** - * Tests path_join(). - * - * @ticket 55897 - * @dataProvider data_path_join - */ - public function test_path_join( $base, $path, $expected ) { - $this->assertSame( $expected, path_join( $base, $path ) ); - } - - /** - * Data provider for test_path_join(). - * - * @return string[][] - */ - public function data_path_join() { - return array( - // Absolute paths. - 'absolute path should return path' => array( - 'base' => 'base', - 'path' => '/path', - 'expected' => '/path', - ), - 'windows path with slashes' => array( - 'base' => 'base', - 'path' => '//path', - 'expected' => '//path', - ), - 'windows path with backslashes' => array( - 'base' => 'base', - 'path' => '\\\\path', - 'expected' => '\\\\path', - ), - // Non-absolute paths. - 'join base and path' => array( - 'base' => 'base', - 'path' => 'path', - 'expected' => 'base/path', - ), - 'strip trailing slashes in base' => array( - 'base' => 'base///', - 'path' => 'path', - 'expected' => 'base/path', - ), - 'empty path' => array( - 'base' => 'base', - 'path' => '', - 'expected' => 'base/', - ), - 'empty base' => array( - 'base' => '', - 'path' => 'path', - 'expected' => '/path', - ), - 'empty path and base' => array( - 'base' => '', - 'path' => '', - 'expected' => '/', - ), - ); - } - - /** - * @ticket 33265 - * @ticket 35996 - * - * @dataProvider data_wp_normalize_path - */ - public function test_wp_normalize_path( $path, $expected ) { - $this->assertSame( $expected, wp_normalize_path( $path ) ); - } - - public function data_wp_normalize_path() { - return array( - // Windows paths. - array( 'C:\\www\\path\\', 'C:/www/path/' ), - array( 'C:\\www\\\\path\\', 'C:/www/path/' ), - array( 'c:/www/path', 'C:/www/path' ), - array( 'c:\\www\\path\\', 'C:/www/path/' ), // Uppercase drive letter. - array( 'c:\\\\www\\path\\', 'C:/www/path/' ), - array( '\\\\Domain\\DFSRoots\\share\\path\\', '//Domain/DFSRoots/share/path/' ), - array( '\\\\Server\\share\\path', '//Server/share/path' ), - array( '\\\\Server\\share', '//Server/share' ), - - // Linux paths. - array( '/www/path/', '/www/path/' ), - array( '/www/path/////', '/www/path/' ), - array( '/www/path', '/www/path' ), - - // PHP stream wrappers. - array( 'php://input', 'php://input' ), - array( 'http://example.com//path.ext', 'http://example.com/path.ext' ), - array( 'file://c:\\www\\path\\', 'file://C:/www/path/' ), - - // Edge cases. - array( '', '' ), // Empty string should return empty string. - array( 123, '123' ), // Integer should be cast to string. - ); - } - - /** - * Tests that wp_normalize_path() works with objects that have __toString(). - * - * This is important because the function uses a static cache, and the input - * must be cast to string before being used as an array key. - * - * @ticket 64538 - */ - public function test_wp_normalize_path_with_stringable_object() { - $file_info = new SplFileInfo( '/var/www/html\\test' ); - - $this->assertSame( '/var/www/html/test', wp_normalize_path( $file_info ) ); - } - - /** - * Tests that wp_normalize_path() returns consistent results on repeated calls. - * - * The function uses a static cache, so this verifies cache behavior. - * - * @ticket 64538 - */ - public function test_wp_normalize_path_returns_consistent_results() { - $path = 'C:\\www\\path\\'; - - $first_call = wp_normalize_path( $path ); - $second_call = wp_normalize_path( $path ); - $third_call = wp_normalize_path( $path ); - - $this->assertSame( $first_call, $second_call, 'Second call should return same result as first.' ); - $this->assertSame( $second_call, $third_call, 'Third call should return same result as second.' ); - $this->assertSame( 'C:/www/path/', $first_call, 'Normalized path should match expected value.' ); - } - - /** - * Tests that wp_normalize_path() static cache stores results. - * - * @ticket 64538 - */ - public function test_wp_normalize_path_static_cache() { - $path = '/var/www/cache-test\\subdir\\'; - $expected = '/var/www/cache-test/subdir/'; - - $result = wp_normalize_path( $path ); - $this->assertSame( $expected, $result ); - - $reflection = new ReflectionFunction( 'wp_normalize_path' ); - $static_vars = $reflection->getStaticVariables(); - - $this->assertArrayHasKey( 'cache', $static_vars, 'Static cache array should exist.' ); - $this->assertArrayHasKey( $path, $static_vars['cache'], 'Cache should contain the normalized path.' ); - $this->assertSame( $expected, $static_vars['cache'][ $path ], 'Cached value should match the expected normalized path.' ); - } - - public function test_wp_unique_filename() { - - $testdir = DIR_TESTDATA . '/images/'; - - // Confidence check. - $this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcdefg.png' ), 'Test non-existing file, file name should be unchanged.' ); - - // Ensure correct images exist. - $this->assertFileExists( $testdir . 'test-image.png', 'Test image does not exist' ); - $this->assertFileDoesNotExist( $testdir . 'test-image-1.png' ); - - // Check number is appended if file already exists. - $this->assertSame( 'test-image-1.png', wp_unique_filename( $testdir, 'test-image.png' ), 'File name not unique, number not appended.' ); - - // Check file with uppercase extension. - $this->assertSame( 'test-image-1.png', wp_unique_filename( $testdir, 'test-image.PNG' ), 'File name with uppercase extension not unique, number not appended.' ); - - // Check file name with already added number. - $this->assertSame( 'test-image-2-1.gif', wp_unique_filename( $testdir, 'test-image-2.gif' ), 'File name not unique, number not appended correctly.' ); - - // Check special chars. - $this->assertSame( 'testtest-image.png', wp_unique_filename( $testdir, 'testtést-imagé.png' ), 'Filename with special chars failed' ); - - // Check special chars with potential conflicting name. - $this->assertSame( 'test-image-1.png', wp_unique_filename( $testdir, 'tést-imagé.png' ), 'Filename with special chars failed' ); - - // Check with single quotes in name (somehow). - $this->assertSame( 'abcdefgh.png', wp_unique_filename( $testdir, "abcdefg'h.png" ), 'File with quote failed' ); - - // Check with double quotes in name (somehow). - $this->assertSame( 'abcdefgh.png', wp_unique_filename( $testdir, 'abcdefg"h.png' ), 'File with quote failed' ); - - // Test crazy name (useful for regression tests). - $this->assertSame( '12af34567890@.^_qwerty-fghjkl-zx.png', wp_unique_filename( $testdir, '12%af34567890#~!@#$..%^&*()|_+qwerty fgh`jkl zx<>?:"{}[]="\'/?.png' ), 'Failed crazy file name' ); - - // Test slashes in names. - $this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcde\fg.png' ), 'Slash not removed' ); - $this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcde\\fg.png' ), 'Double slashed not removed' ); - $this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcde\\\fg.png' ), 'Triple slashed not removed' ); - } - - /** - * @ticket 42437 - */ - public function test_unique_filename_with_dimension_like_filename() { - $testdir = DIR_TESTDATA . '/images/'; - - add_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); - - // Test collision with "dimension-like" original filename. - $this->assertSame( 'one-blue-pixel-100x100-1.png', wp_unique_filename( $testdir, 'one-blue-pixel-100x100.png' ) ); - // Test collision with existing sub-size filename. - // Existing files: one-blue-pixel-100x100.png, one-blue-pixel-1-100x100.png. - $this->assertSame( 'one-blue-pixel-2.png', wp_unique_filename( $testdir, 'one-blue-pixel.png' ) ); - // Same as above with upper case extension. - $this->assertSame( 'one-blue-pixel-2.png', wp_unique_filename( $testdir, 'one-blue-pixel.PNG' ) ); - - remove_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); - } - - // Callback to patch "basedir" when used in `wp_unique_filename()`. - public function upload_dir_patch_basedir( $upload_dir ) { - $upload_dir['basedir'] = DIR_TESTDATA . '/images/'; - return $upload_dir; - } - - /** - * @ticket 53668 - */ - public function test_wp_unique_filename_with_additional_image_extension() { - $testdir = DIR_TESTDATA . '/images/'; - - add_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); - - // Set conversions for uploaded images. - add_filter( 'image_editor_output_format', array( $this, 'image_editor_output_format_handler' ) ); - - // Ensure the test images exist. - $this->assertFileExists( $testdir . 'test-image-1-100x100.jpg', 'test-image-1-100x100.jpg does not exist' ); - $this->assertFileExists( $testdir . 'test-image-2.gif', 'test-image-2.gif does not exist' ); - $this->assertFileExists( $testdir . 'test-image-3.jpg', 'test-image-3.jpg does not exist' ); - $this->assertFileExists( $testdir . 'test-image-4.png', 'test-image-4.png does not exist' ); - - // Standard test: file does not exist and there are no possible intersections with other files. - $this->assertSame( - 'abcdef.png', - wp_unique_filename( $testdir, 'abcdef.png' ), - 'The abcdef.png, abcdef.gif, and abcdef.jpg images do not exist. The file name should not be changed.' - ); - - // Actual clash recognized. - $this->assertSame( - 'canola-1.jpg', - wp_unique_filename( $testdir, 'canola.jpg' ), - 'The canola.jpg image exists. The file name should be unique.' - ); - - // Same name with different extension and the image will be converted. - $this->assertSame( - 'canola-1.png', - wp_unique_filename( $testdir, 'canola.png' ), - 'The canola.jpg image exists. Uploading canola.png that will be converted to canola.jpg should produce unique file name.' - ); - - // Same name with different uppercase extension and the image will be converted. - $this->assertSame( - 'canola-1.png', - wp_unique_filename( $testdir, 'canola.PNG' ), - 'The canola.jpg image exists. Uploading canola.PNG that will be converted to canola.jpg should produce unique file name.' - ); - - // Actual clash with several images with different extensions. - $this->assertSame( - 'test-image-5.png', - wp_unique_filename( $testdir, 'test-image.png' ), - 'The test-image.png, test-image-1-100x100.jpg, test-image-2.gif, test-image-3.jpg, and test-image-4.png images exist.' . - 'All of them may clash when creating sub-sizes or regenerating thumbnails in the future. The filename should be unique.' - ); - - // Possible clash with regenerated thumbnails in the future. - $this->assertSame( - 'codeispoetry-1.jpg', - wp_unique_filename( $testdir, 'codeispoetry.jpg' ), - 'The codeispoetry.png image exists. When regenerating thumbnails for it they will be converted to JPG.' . - 'The name of the newly uploaded codeispoetry.jpg should be made unique.' - ); - - remove_filter( 'image_editor_output_format', array( $this, 'image_editor_output_format_handler' ) ); - remove_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); - } - - /** - * Changes the output format when editing images. When uploading a PNG file - * it will be converted to JPEG, GIF to JPEG, and PICT to BMP - * (if the image editor in PHP supports it). - * - * @param array $formats - * - * @return array - */ - public function image_editor_output_format_handler( $formats ) { - $formats['image/png'] = 'image/jpeg'; - $formats['image/gif'] = 'image/jpeg'; - $formats['image/pct'] = 'image/bmp'; - - return $formats; - } - - /** - * @group add_query_arg - */ - public function test_add_query_arg() { - $old_req_uri = $_SERVER['REQUEST_URI']; - - $urls = array( - '/', - '/2012/07/30/', - 'edit.php', - admin_url( 'edit.php' ), - admin_url( 'edit.php', 'https' ), - ); - - $frag_urls = array( - '/#frag', - '/2012/07/30/#frag', - 'edit.php#frag', - admin_url( 'edit.php#frag' ), - admin_url( 'edit.php#frag', 'https' ), - ); - - foreach ( $urls as $url ) { - $_SERVER['REQUEST_URI'] = 'nothing'; - - $this->assertSame( "$url?foo=1", add_query_arg( 'foo', '1', $url ) ); - $this->assertSame( "$url?foo=1", add_query_arg( array( 'foo' => '1' ), $url ) ); - $this->assertSame( - "$url?foo=2", - add_query_arg( - array( - 'foo' => '1', - 'foo' => '2', - ), - $url - ) - ); - $this->assertSame( - "$url?foo=1&bar=2", - add_query_arg( - array( - 'foo' => '1', - 'bar' => '2', - ), - $url - ) - ); - - $_SERVER['REQUEST_URI'] = $url; - - $this->assertSame( "$url?foo=1", add_query_arg( 'foo', '1' ) ); - $this->assertSame( "$url?foo=1", add_query_arg( array( 'foo' => '1' ) ) ); - $this->assertSame( - "$url?foo=2", - add_query_arg( - array( - 'foo' => '1', - 'foo' => '2', - ) - ) - ); - $this->assertSame( - "$url?foo=1&bar=2", - add_query_arg( - array( - 'foo' => '1', - 'bar' => '2', - ) - ) - ); - } - - foreach ( $frag_urls as $frag_url ) { - $_SERVER['REQUEST_URI'] = 'nothing'; - $url = str_replace( '#frag', '', $frag_url ); - - $this->assertSame( "$url?foo=1#frag", add_query_arg( 'foo', '1', $frag_url ) ); - $this->assertSame( "$url?foo=1#frag", add_query_arg( array( 'foo' => '1' ), $frag_url ) ); - $this->assertSame( - "$url?foo=2#frag", - add_query_arg( - array( - 'foo' => '1', - 'foo' => '2', - ), - $frag_url - ) - ); - $this->assertSame( - "$url?foo=1&bar=2#frag", - add_query_arg( - array( - 'foo' => '1', - 'bar' => '2', - ), - $frag_url - ) - ); - - $_SERVER['REQUEST_URI'] = $frag_url; - - $this->assertSame( "$url?foo=1#frag", add_query_arg( 'foo', '1' ) ); - $this->assertSame( "$url?foo=1#frag", add_query_arg( array( 'foo' => '1' ) ) ); - $this->assertSame( - "$url?foo=2#frag", - add_query_arg( - array( - 'foo' => '1', - 'foo' => '2', - ) - ) - ); - $this->assertSame( - "$url?foo=1&bar=2#frag", - add_query_arg( - array( - 'foo' => '1', - 'bar' => '2', - ) - ) - ); - } - - $qs_urls = array( - 'baz=1', // #WP4903 - '/?baz', - '/2012/07/30/?baz', - 'edit.php?baz', - admin_url( 'edit.php?baz' ), - admin_url( 'edit.php?baz', 'https' ), - admin_url( 'edit.php?baz&za=1' ), - admin_url( 'edit.php?baz=1&za=1' ), - admin_url( 'edit.php?baz=0&za=0' ), - ); - - foreach ( $qs_urls as $url ) { - $_SERVER['REQUEST_URI'] = 'nothing'; - - $this->assertSame( "$url&foo=1", add_query_arg( 'foo', '1', $url ) ); - $this->assertSame( "$url&foo=1", add_query_arg( array( 'foo' => '1' ), $url ) ); - $this->assertSame( - "$url&foo=2", - add_query_arg( - array( - 'foo' => '1', - 'foo' => '2', - ), - $url - ) - ); - $this->assertSame( - "$url&foo=1&bar=2", - add_query_arg( - array( - 'foo' => '1', - 'bar' => '2', - ), - $url - ) - ); - - $_SERVER['REQUEST_URI'] = $url; - - $this->assertSame( "$url&foo=1", add_query_arg( 'foo', '1' ) ); - $this->assertSame( "$url&foo=1", add_query_arg( array( 'foo' => '1' ) ) ); - $this->assertSame( - "$url&foo=2", - add_query_arg( - array( - 'foo' => '1', - 'foo' => '2', - ) - ) - ); - $this->assertSame( - "$url&foo=1&bar=2", - add_query_arg( - array( - 'foo' => '1', - 'bar' => '2', - ) - ) - ); - } - - $_SERVER['REQUEST_URI'] = $old_req_uri; - } - - /** - * @ticket 31306 - */ - public function test_add_query_arg_numeric_keys() { - $url = add_query_arg( array( 'foo' => 'bar' ), '1=1' ); - $this->assertSame( '1=1&foo=bar', $url ); - - $url = add_query_arg( - array( - 'foo' => 'bar', - '1' => '2', - ), - '1=1' - ); - $this->assertSame( '1=2&foo=bar', $url ); - - $url = add_query_arg( array( '1' => '2' ), 'foo=bar' ); - $this->assertSame( 'foo=bar&1=2', $url ); - } - - /** - * Tests that add_query_arg removes the question mark when - * a parameter is set to false. - * - * @dataProvider data_add_query_arg_removes_question_mark - * - * @ticket 44499 - * @group add_query_arg - * - * @covers ::add_query_arg - * - * @param string $url Url to test. - * @param string $expected Expected URL. - */ - public function test_add_query_arg_removes_question_mark( $url, $expected, $key = 'param', $value = false ) { - $this->assertSame( $expected, add_query_arg( $key, $value, $url ) ); - } - - /** - * Data provider. - * - * @return array - */ - public function data_add_query_arg_removes_question_mark() { - return array( - 'anchor' => array( - 'url' => 'http://example.org?#anchor', - 'expected' => 'http://example.org#anchor', - ), - '/ then anchor' => array( - 'url' => 'http://example.org/?#anchor', - 'expected' => 'http://example.org/#anchor', - ), - 'invalid query param and anchor' => array( - 'url' => 'http://example.org?param=value#anchor', - 'expected' => 'http://example.org#anchor', - ), - '/ then invalid query param and anchor' => array( - 'url' => 'http://example.org/?param=value#anchor', - 'expected' => 'http://example.org/#anchor', - ), - '?#anchor when adding valid key/value args' => array( - 'url' => 'http://example.org?#anchor', - 'expected' => 'http://example.org?foo=bar#anchor', - 'key' => 'foo', - 'value' => 'bar', - ), - '/?#anchor when adding valid key/value args' => array( - 'url' => 'http://example.org/?#anchor', - 'expected' => 'http://example.org/?foo=bar#anchor', - 'key' => 'foo', - 'value' => 'bar', - ), - ); - } - - /** - * @ticket 21594 - */ - public function test_get_allowed_mime_types() { - $mimes = get_allowed_mime_types(); - - $this->assertIsArray( $mimes ); - $this->assertNotEmpty( $mimes ); - - add_filter( 'upload_mimes', '__return_empty_array' ); - $mimes = get_allowed_mime_types(); - $this->assertIsArray( $mimes ); - $this->assertEmpty( $mimes ); - - remove_filter( 'upload_mimes', '__return_empty_array' ); - $mimes = get_allowed_mime_types(); - $this->assertIsArray( $mimes ); - $this->assertNotEmpty( $mimes ); - } - - /** - * @ticket 21594 - */ - public function test_wp_get_mime_types() { - $mimes = wp_get_mime_types(); - - $this->assertIsArray( $mimes ); - $this->assertNotEmpty( $mimes ); - - add_filter( 'mime_types', '__return_empty_array' ); - $mimes = wp_get_mime_types(); - $this->assertIsArray( $mimes ); - $this->assertEmpty( $mimes ); - - remove_filter( 'mime_types', '__return_empty_array' ); - $mimes = wp_get_mime_types(); - $this->assertIsArray( $mimes ); - $this->assertNotEmpty( $mimes ); - - // 'upload_mimes' should not affect wp_get_mime_types(). - add_filter( 'upload_mimes', '__return_empty_array' ); - $mimes = wp_get_mime_types(); - $this->assertIsArray( $mimes ); - $this->assertNotEmpty( $mimes ); - - remove_filter( 'upload_mimes', '__return_empty_array' ); - $mimes2 = wp_get_mime_types(); - $this->assertIsArray( $mimes2 ); - $this->assertNotEmpty( $mimes2 ); - $this->assertSame( $mimes2, $mimes ); - } - - /** - * @ticket 23688 - */ - public function test_canonical_charset() { - $orig_blog_charset = get_option( 'blog_charset' ); - - update_option( 'blog_charset', 'utf8' ); - $this->assertSame( 'UTF-8', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'utf-8' ); - $this->assertSame( 'UTF-8', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'UTF8' ); - $this->assertSame( 'UTF-8', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'UTF-8' ); - $this->assertSame( 'UTF-8', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'ISO-8859-1' ); - $this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'ISO8859-1' ); - $this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'iso8859-1' ); - $this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', 'iso-8859-1' ); - $this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) ); - - // Arbitrary strings are passed through. - update_option( 'blog_charset', 'foobarbaz' ); - $this->assertSame( 'foobarbaz', get_option( 'blog_charset' ) ); - - update_option( 'blog_charset', $orig_blog_charset ); - } - - /** - * @dataProvider data_device_can_upload - */ - public function test_device_can_upload( $user_agent, $expected ) { - $_SERVER['HTTP_USER_AGENT'] = $user_agent; - $actual = _device_can_upload(); - unset( $_SERVER['HTTP_USER_AGENT'] ); - $this->assertSame( $expected, $actual ); - } - - public function data_device_can_upload() { - return array( - // iPhone iOS 5.0.1, Safari 5.1. - array( - 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A406)', - false, - ), - // iPad iOS 3.2, Safari 4.0.4. - array( - 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10', - false, - ), - // iPod iOS 4.3.3, Safari 5.0.2. - array( - 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5', - false, - ), - // iPhone iOS 6.0.0, Safari 6.0. - array( - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25', - true, - ), - // iPad iOS 6.0.0, Safari 6.0. - array( - 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25', - true, - ), - // Android 2.2, Android Webkit Browser. - array( - 'Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4', - true, - ), - // BlackBerry 9900, BlackBerry browser. - array( - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+', - true, - ), - // Windows Phone 8.0, Internet Explorer 10.0. - array( - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)', - true, - ), - // Ubuntu desktop, Firefox 41.0. - array( - 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0', - true, - ), - ); - } - - /** - * @ticket 9064 - */ - public function test_wp_extract_urls() { - $original_urls = array( - 'http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html', - 'http://this.com', - 'http://127.0.0.1', - 'http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437', - 'http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html', - 'http://wordpress-core.com:8080/', - 'http://www.website.com:5000', - 'http://wordpress-core/?346236346326&2134362574863.437', - 'http://افغانستا.icom.museum', - 'http://الجزائر.icom.museum', - 'http://österreich.icom.museum', - 'http://বাংলাদেশ.icom.museum', - 'http://беларусь.icom.museum', - 'http://belgië.icom.museum', - 'http://българия.icom.museum', - 'http://تشادر.icom.museum', - 'http://中国.icom.museum', - // 'http://القمر.icom.museum', // Comoros http://القمر.icom.museum - // 'http://κυπρος.icom.museum', // Cyprus http://κυπρος.icom.museum - 'http://českárepublika.icom.museum', - // 'http://مصر.icom.museum', // Egypt http://مصر.icom.museum - 'http://ελλάδα.icom.museum', - 'http://magyarország.icom.museum', - 'http://ísland.icom.museum', - 'http://भारत.icom.museum', - 'http://ايران.icom.museum', - 'http://éire.icom.museum', - 'http://איקו״ם.ישראל.museum', - 'http://日本.icom.museum', - 'http://الأردن.icom.museum', - 'http://қазақстан.icom.museum', - 'http://한국.icom.museum', - 'http://кыргызстан.icom.museum', - 'http://ລາວ.icom.museum', - 'http://لبنان.icom.museum', - 'http://македонија.icom.museum', - // 'http://موريتانيا.icom.museum', // Mauritania http://موريتانيا.icom.museum - 'http://méxico.icom.museum', - 'http://монголулс.icom.museum', - // 'http://المغرب.icom.museum', // Morocco http://المغرب.icom.museum - 'http://नेपाल.icom.museum', - // 'http://عمان.icom.museum', // Oman http://عمان.icom.museum - 'http://قطر.icom.museum', - 'http://românia.icom.museum', - 'http://россия.иком.museum', - 'http://србијаицрнагора.иком.museum', - 'http://இலங்கை.icom.museum', - 'http://españa.icom.museum', - 'http://ไทย.icom.museum', - 'http://تونس.icom.museum', - 'http://türkiye.icom.museum', - 'http://украина.icom.museum', - 'http://việtnam.icom.museum', - 'ftp://127.0.0.1/', - 'http://www.woo.com/video?v=exvUH2qKLTU', - 'http://taco.com?burrito=enchilada#guac', - 'http://example.org/?post_type=post&p=4', - 'http://example.org/?post_type=post&p=5', - 'http://example.org/?post_type=post&p=6', - 'http://typo-in-query.org/?foo=bar&baz=missing_semicolon', - ); - - $blob = ' - http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html - - http://this.com - - http://127.0.0.1 - - http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437 - - http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html - - http://wordpress-core.com:8080/ - - http://www.website.com:5000 - - http://wordpress-core/?346236346326&2134362574863.437 - - http://افغانستا.icom.museum - http://الجزائر.icom.museum - http://österreich.icom.museum - http://বাংলাদেশ.icom.museum - http://беларусь.icom.museum - http://belgië.icom.museum - http://българия.icom.museum - http://تشادر.icom.museum - http://中国.icom.museum - http://českárepublika.icom.museum - http://ελλάδα.icom.museum - http://magyarország.icom.museum - http://ísland.icom.museum - http://भारत.icom.museum - http://ايران.icom.museum - http://éire.icom.museum - http://איקו״ם.ישראל.museum - http://日本.icom.museum - http://الأردن.icom.museum - http://қазақстан.icom.museum - http://한국.icom.museum - http://кыргызстан.icom.museum - http://ລາວ.icom.museum - http://لبنان.icom.museum - http://македонија.icom.museum - http://méxico.icom.museum - http://монголулс.icom.museum - http://नेपाल.icom.museum - http://قطر.icom.museum - http://românia.icom.museum - http://россия.иком.museum - http://србијаицрнагора.иком.museum - http://இலங்கை.icom.museum - http://españa.icom.museum - http://ไทย.icom.museum - http://تونس.icom.museum - http://türkiye.icom.museum - http://украина.icom.museum - http://việtnam.icom.museum - ftp://127.0.0.1/ - http://www.woo.com/video?v=exvUH2qKLTU - - http://taco.com?burrito=enchilada#guac - - http://example.org/?post_type=post&p=4 - http://example.org/?post_type=post&p=5 - http://example.org/?post_type=post&p=6 - - http://typo-in-query.org/?foo=bar&baz=missing_semicolon - '; - - $urls = wp_extract_urls( $blob ); - $this->assertNotEmpty( $urls ); - $this->assertIsArray( $urls ); - $this->assertCount( count( $original_urls ), $urls ); - $this->assertSame( $original_urls, $urls ); - - $exploded = array_values( array_filter( array_map( 'trim', explode( "\n", $blob ) ) ) ); - // wp_extract_urls() calls html_entity_decode(). - $decoded = array_map( 'html_entity_decode', $exploded ); - - $this->assertSame( $decoded, $urls ); - $this->assertSame( $original_urls, $decoded ); - - $blob = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor - incididunt ut labore http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html et dolore magna aliqua. - Ut http://this.com enim ad minim veniam, quis nostrud exercitation 16.06. to 18.06.2014 ullamco http://127.0.0.1 - laboris nisi ut aliquip ex http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437 ea - commodo consequat. http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html Duis aute irure dolor in reprehenderit in voluptate - velit esse http://wordpress-core.com:8080/ cillum dolore eu fugiat nulla http://www.website.com:5000 pariatur. Excepteur sint occaecat cupidatat non proident, - sunt in culpa qui officia deserunt mollit http://wordpress-core/?346236346326&2134362574863.437 anim id est laborum.'; - - $urls = wp_extract_urls( $blob ); - $this->assertNotEmpty( $urls ); - $this->assertIsArray( $urls ); - $this->assertCount( 8, $urls ); - $this->assertSame( array_slice( $original_urls, 0, 8 ), $urls ); - - $blob = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor - incididunt ut labore 343462^ et dolore magna aliqua. - Ut &3640i6p1yi499 enim ad minim veniam, quis nostrud exercitation 16.06. to 18.06.2014 ullamco localhost - laboris nisi ut aliquip ex 343462^ ea - commodo consequat. 343462^ Duis aute irure dolor in reprehenderit in voluptate - velit esse -3-4--321-64-4@#!$^$!@^@^ cillum dolore eu http://www.website.com:5000 fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, - sunt in culpa qui officia deserunt mollit )(*&^%$ anim id est laborum.'; - - $urls = wp_extract_urls( $blob ); - $this->assertNotEmpty( $urls ); - $this->assertIsArray( $urls ); - $this->assertCount( 8, $urls ); - $this->assertSame( array_slice( $original_urls, 0, 8 ), $urls ); - } - - /** - * Tests for backward compatibility of `wp_extract_urls` to remove unused semicolons. - * - * @ticket 30580 - * - * @covers ::wp_extract_urls - */ - public function test_wp_extract_urls_remove_semicolon() { - $expected = array( - 'http://typo.com', - 'http://example.org/?post_type=post&p=8', - ); - $actual = wp_extract_urls( - ' - http://typo.com; - http://example.org/?post_type=;p;o;s;t;&p=8; - ' - ); - - $this->assertSame( $expected, $actual ); - } - - /** - * @ticket 28786 - */ - public function test_wp_json_encode() { - $this->assertSame( wp_json_encode( 'a' ), '"a"' ); - } - - /** - * @ticket 28786 - */ - public function test_wp_json_encode_utf8() { - $this->assertSame( wp_json_encode( '这' ), '"\u8fd9"' ); - } - - /** - * @ticket 28786 - * @requires function mb_detect_order - */ - public function test_wp_json_encode_non_utf8() { - $charsets = mb_detect_order(); - $old_charsets = $charsets; - if ( ! in_array( 'EUC-JP', $charsets, true ) ) { - $charsets[] = 'EUC-JP'; - mb_detect_order( $charsets ); - } - - $eucjp = mb_convert_encoding( 'aあb', 'EUC-JP', 'UTF-8' ); - $utf8 = mb_convert_encoding( $eucjp, 'UTF-8', 'EUC-JP' ); - - $this->assertSame( 'aあb', $utf8 ); - - $this->assertSame( '"a\u3042b"', wp_json_encode( $eucjp ) ); - - mb_detect_order( $old_charsets ); - } - - /** - * @ticket 28786 - * @requires function mb_detect_order - */ - public function test_wp_json_encode_non_utf8_in_array() { - $charsets = mb_detect_order(); - $old_charsets = $charsets; - if ( ! in_array( 'EUC-JP', $charsets, true ) ) { - $charsets[] = 'EUC-JP'; - mb_detect_order( $charsets ); - } - - $eucjp = mb_convert_encoding( 'aあb', 'EUC-JP', 'UTF-8' ); - $utf8 = mb_convert_encoding( $eucjp, 'UTF-8', 'EUC-JP' ); - - $this->assertSame( 'aあb', $utf8 ); - - $this->assertSame( '["c","a\u3042b"]', wp_json_encode( array( 'c', $eucjp ) ) ); - - mb_detect_order( $old_charsets ); - } - - /** - * @ticket 28786 - */ - public function test_wp_json_encode_array() { - $this->assertSame( wp_json_encode( array( 'a' ) ), '["a"]' ); - } - - /** - * @ticket 28786 - */ - public function test_wp_json_encode_object() { - $object = new stdClass(); - $object->a = 'b'; - $this->assertSame( wp_json_encode( $object ), '{"a":"b"}' ); - } - - /** - * @ticket 28786 - */ - public function test_wp_json_encode_depth() { - $data = array( array( array( 1, 2, 3 ) ) ); - $json = wp_json_encode( $data, 0, 1 ); - $this->assertFalse( $json ); - - $data = array( 'あ', array( array( 1, 2, 3 ) ) ); - $json = wp_json_encode( $data, 0, 1 ); - $this->assertFalse( $json ); - } - - /** - * @ticket 53238 - */ - public function test_wp_json_file_decode() { - $result = wp_json_file_decode( - DIR_TESTDATA . '/blocks/notice/block.json' - ); - - $this->assertIsObject( $result ); - $this->assertSame( 'tests/notice', $result->name ); - } - - /** - * @ticket 53238 - */ - public function test_wp_json_file_decode_associative_array() { - $result = wp_json_file_decode( - DIR_TESTDATA . '/blocks/notice/block.json', - array( 'associative' => true ) - ); - - $this->assertIsArray( $result ); - $this->assertSame( 'tests/notice', $result['name'] ); - } - - /** - * @ticket 36054 - * @dataProvider data_mysql_to_rfc3339 - */ - public function test_mysql_to_rfc3339( $expected, $actual ) { - $date_return = mysql_to_rfc3339( $actual ); - - $this->assertIsString( $date_return, 'The date return must be a string' ); - $this->assertNotEmpty( $date_return, 'The date return could not be an empty string' ); - $this->assertSame( $expected, $date_return, 'The date does not match' ); - $this->assertEquals( new DateTime( $expected ), new DateTime( $date_return ), 'The date is not the same after the call method' ); - } - - public function data_mysql_to_rfc3339() { - return array( - array( '2016-03-15T18:54:46', '15-03-2016 18:54:46' ), - array( '2016-03-02T19:13:25', '2016-03-02 19:13:25' ), - array( '2016-03-02T19:13:00', '2016-03-02 19:13' ), - array( '2016-03-02T19:13:00', '16-03-02 19:13' ), - array( '2016-03-02T19:13:00', '16-03-02 19:13' ), - ); - } - - /** - * @ticket 35987 - */ - public function test_wp_get_ext_types() { - $extensions = wp_get_ext_types(); - - $this->assertIsArray( $extensions ); - $this->assertNotEmpty( $extensions ); - - add_filter( 'ext2type', '__return_empty_array' ); - $extensions = wp_get_ext_types(); - $this->assertSame( array(), $extensions ); - - remove_filter( 'ext2type', '__return_empty_array' ); - $extensions = wp_get_ext_types(); - $this->assertIsArray( $extensions ); - $this->assertNotEmpty( $extensions ); - } - - /** - * @ticket 35987 - */ - public function test_wp_ext2type() { - $extensions = wp_get_ext_types(); - - $this->assertNotEmpty( $extensions ); - - foreach ( $extensions as $type => $extension_list ) { - foreach ( $extension_list as $extension ) { - $this->assertSame( $type, wp_ext2type( $extension ) ); - $this->assertSame( $type, wp_ext2type( strtoupper( $extension ) ) ); - } - } - - $this->assertNull( wp_ext2type( 'unknown_format' ) ); - } - - /** - * Tests raising the memory limit. - * - * Unfortunately as the default for 'WP_MAX_MEMORY_LIMIT' in the - * test suite is -1, we can not test the memory limit negotiations. - * - * @ticket 32075 - */ - public function test_wp_raise_memory_limit() { - if ( -1 !== WP_MAX_MEMORY_LIMIT ) { - $this->markTestSkipped( 'WP_MAX_MEMORY_LIMIT should be set to -1.' ); - } - - $ini_limit_before = ini_get( 'memory_limit' ); - $raised_limit = wp_raise_memory_limit(); - $ini_limit_after = ini_get( 'memory_limit' ); - - $this->assertSame( $ini_limit_before, $ini_limit_after ); - $this->assertFalse( $raised_limit ); - $this->assertEquals( WP_MAX_MEMORY_LIMIT, $ini_limit_after ); - } - - /** - * Tests wp_generate_uuid4(). - * - * @covers ::wp_generate_uuid4 - * @ticket 38164 - */ - public function test_wp_generate_uuid4() { - $uuids = array(); - for ( $i = 0; $i < 20; $i += 1 ) { - $uuid = wp_generate_uuid4(); - $this->assertTrue( wp_is_uuid( $uuid, 4 ) ); - $uuids[] = $uuid; - } - - $unique_uuids = array_unique( $uuids ); - $this->assertSame( $uuids, $unique_uuids ); - } - - /** - * Tests wp_is_uuid(). - * - * @covers ::wp_is_uuid - * @ticket 39778 - */ - public function test_wp_is_valid_uuid() { - $uuids_v4 = array( - '27fe2421-780c-44c5-b39b-fff753092b55', - 'b7c7713a-4ee9-45a1-87ed-944a90390fc7', - 'fbedbe35-7bf5-49cc-a5ac-0343bd94360a', - '4c58e67e-123b-4290-a41c-5eeb6970fa3e', - 'f54f5b78-e414-4637-84a9-a6cdc94a1beb', - 'd1c533ac-abcf-44b6-9b0e-6477d2c91b09', - '7fcd683f-e5fd-454a-a8b9-ed15068830da', - '7962c750-e58c-470a-af0d-ec1eae453ff2', - 'a59878ce-9a67-4493-8ca0-a756b52804b3', - '6faa519d-1e13-4415-bd6f-905ae3689d1d', - ); - - foreach ( $uuids_v4 as $uuid ) { - $this->assertTrue( wp_is_uuid( $uuid, 4 ) ); - } - - $uuids = array( - '00000000-0000-0000-0000-000000000000', // Nil. - '9e3a0460-d72d-11e4-a631-c8e0eb141dab', // Version 1. - '2c1d43b8-e6d7-376e-af7f-d4bde997cc3f', // Version 3. - '39888f87-fb62-5988-a425-b2ea63f5b81e', // Version 5. - ); - - foreach ( $uuids as $uuid ) { - $this->assertTrue( wp_is_uuid( $uuid ) ); - $this->assertFalse( wp_is_uuid( $uuid, 4 ) ); - } - - $invalid_uuids = array( - 'a19d5192-ea41-41e6-b006', - 'this-is-not-valid', - 1234, - true, - array(), - ); - - foreach ( $invalid_uuids as $invalid_uuid ) { - $this->assertFalse( wp_is_uuid( $invalid_uuid, 4 ) ); - $this->assertFalse( wp_is_uuid( $invalid_uuid ) ); - } - } - - /** - * Tests wp_unique_id(). - * - * @covers ::wp_unique_id - * @ticket 44883 - */ - public function test_wp_unique_id() { - - // Test without prefix. - $ids = array(); - for ( $i = 0; $i < 20; $i += 1 ) { - $id = wp_unique_id(); - $this->assertIsString( $id ); - $this->assertIsNumeric( $id ); - $ids[] = $id; - } - $this->assertSame( $ids, array_unique( $ids ) ); - - // Test with prefix. - $ids = array(); - for ( $i = 0; $i < 20; $i += 1 ) { - $id = wp_unique_id( 'foo-' ); - $this->assertMatchesRegularExpression( '/^foo-\d+$/', $id ); - $ids[] = $id; - } - $this->assertSame( $ids, array_unique( $ids ) ); - } - - /** - * @ticket 40017 - * @dataProvider data_wp_get_image_mime - */ - public function test_wp_get_image_mime( $file, $expected ) { - if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) { - $this->markTestSkipped( 'The exif PHP extension is not loaded.' ); - } - - if ( is_array( $expected ) ) { - $this->assertContains( wp_get_image_mime( $file ), $expected ); - } else { - $this->assertSame( $expected, wp_get_image_mime( $file ) ); - } - } - - /** - * Data provider for test_wp_get_image_mime(). - */ - public function data_wp_get_image_mime() { - $data = array( - // Standard JPEG. - array( - DIR_TESTDATA . '/images/test-image.jpg', - 'image/jpeg', - ), - // Standard GIF. - array( - DIR_TESTDATA . '/images/test-image.gif', - 'image/gif', - ), - // Standard PNG. - array( - DIR_TESTDATA . '/images/test-image.png', - 'image/png', - ), - // Image with wrong extension. - array( - DIR_TESTDATA . '/images/test-image-mime-jpg.png', - 'image/jpeg', - ), - // Animated WebP. - array( - DIR_TESTDATA . '/images/webp-animated.webp', - 'image/webp', - ), - // Lossless WebP. - array( - DIR_TESTDATA . '/images/webp-lossless.webp', - 'image/webp', - ), - // Lossy WebP. - array( - DIR_TESTDATA . '/images/webp-lossy.webp', - 'image/webp', - ), - // Transparent WebP. - array( - DIR_TESTDATA . '/images/webp-transparent.webp', - 'image/webp', - ), - // Not an image. - array( - DIR_TESTDATA . '/uploads/dashicons.woff', - false, - ), - // Animated AVIF. - array( - DIR_TESTDATA . '/images/avif-animated.avif', - 'image/avif', - ), - // Lossless AVIF. - array( - DIR_TESTDATA . '/images/avif-lossless.avif', - 'image/avif', - ), - // Lossy AVIF. - array( - DIR_TESTDATA . '/images/avif-lossy.avif', - 'image/avif', - ), - // Transparent AVIF. - array( - DIR_TESTDATA . '/images/avif-transparent.avif', - 'image/avif', - ), - // HEIC. - array( - DIR_TESTDATA . '/images/test-image.heic', - // In PHP 8.5, it returns 'image/heif'. Before that, it returns 'image/heic'. - array( 'image/heic', 'image/heif' ), - ), - ); - - return $data; - } - - /** - * @ticket 35725 - * @dataProvider data_wp_getimagesize - */ - public function test_wp_getimagesize( $file, $expected ) { - if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) { - $this->markTestSkipped( 'The exif PHP extension is not loaded.' ); - } - - $result = wp_getimagesize( $file ); - - // The getimagesize() function varies in its response, so - // let's restrict comparison to expected keys only. - if ( is_array( $expected ) ) { - foreach ( $expected as $k => $v ) { - $this->assertArrayHasKey( $k, $result ); - $this->assertSame( $expected[ $k ], $result[ $k ] ); - } - } else { - $this->assertSame( $expected, $result ); - } - } - - /** - * Data provider for test_wp_getimagesize(). - */ - public function data_wp_getimagesize() { - $data = array( - // Standard JPEG. - array( - DIR_TESTDATA . '/images/test-image.jpg', - array( - 50, - 50, - IMAGETYPE_JPEG, - 'width="50" height="50"', - 'mime' => 'image/jpeg', - ), - ), - // Standard GIF. - array( - DIR_TESTDATA . '/images/test-image.gif', - array( - 50, - 50, - IMAGETYPE_GIF, - 'width="50" height="50"', - 'mime' => 'image/gif', - ), - ), - // Standard PNG. - array( - DIR_TESTDATA . '/images/test-image.png', - array( - 50, - 50, - IMAGETYPE_PNG, - 'width="50" height="50"', - 'mime' => 'image/png', - ), - ), - // Image with wrong extension. - array( - DIR_TESTDATA . '/images/test-image-mime-jpg.png', - array( - 50, - 50, - IMAGETYPE_JPEG, - 'width="50" height="50"', - 'mime' => 'image/jpeg', - ), - ), - // Animated WebP. - array( - DIR_TESTDATA . '/images/webp-animated.webp', - array( - 100, - 100, - IMAGETYPE_WEBP, - 'width="100" height="100"', - 'mime' => 'image/webp', - ), - ), - // Lossless WebP. - array( - DIR_TESTDATA . '/images/webp-lossless.webp', - array( - 1200, - 675, - IMAGETYPE_WEBP, - 'width="1200" height="675"', - 'mime' => 'image/webp', - ), - ), - // Lossy WebP. - array( - DIR_TESTDATA . '/images/webp-lossy.webp', - array( - 1200, - 675, - IMAGETYPE_WEBP, - 'width="1200" height="675"', - 'mime' => 'image/webp', - ), - ), - // Transparent WebP. - array( - DIR_TESTDATA . '/images/webp-transparent.webp', - array( - 1200, - 675, - IMAGETYPE_WEBP, - 'width="1200" height="675"', - 'mime' => 'image/webp', - ), - ), - // Not an image. - array( - DIR_TESTDATA . '/uploads/dashicons.woff', - false, - ), - // Animated AVIF. - array( - DIR_TESTDATA . '/images/avif-animated.avif', - array( - 150, - 150, - IMAGETYPE_AVIF, - 'width="150" height="150"', - 'mime' => 'image/avif', - ), - ), - // Lossless AVIF. - array( - DIR_TESTDATA . '/images/avif-lossless.avif', - array( - 400, - 400, - IMAGETYPE_AVIF, - 'width="400" height="400"', - 'mime' => 'image/avif', - ), - ), - // Lossy AVIF. - array( - DIR_TESTDATA . '/images/avif-lossy.avif', - array( - 400, - 400, - IMAGETYPE_AVIF, - 'width="400" height="400"', - 'mime' => 'image/avif', - ), - ), - // Transparent AVIF. - array( - DIR_TESTDATA . '/images/avif-transparent.avif', - array( - 128, - 128, - IMAGETYPE_AVIF, - 'width="128" height="128"', - 'mime' => 'image/avif', - ), - ), - // Grid AVIF. - array( - DIR_TESTDATA . '/images/avif-alpha-grid2x1.avif', - array( - 199, - 200, - IMAGETYPE_AVIF, - 'width="199" height="200"', - 'mime' => 'image/avif', - ), - ), - ); - - return $data; - } - - /** - * Tests that wp_getimagesize() correctly handles HEIC image files. - * - * @ticket 53645 - */ - public function test_wp_getimagesize_heic() { - if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) { - $this->markTestSkipped( 'The exif PHP extension is not loaded.' ); - } - - $file = DIR_TESTDATA . '/images/test-image.heic'; - - $editor = wp_get_image_editor( $file ); - if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/heic' ) ) { - $this->markTestSkipped( 'No HEIC support in the editor engine on this system.' ); - } - - $expected = array( - 1180, - 1180, - IMAGETYPE_HEIF, - 'width="1180" height="1180"', - ); - - // As of PHP 8.5.0, getimagesize() supports HEIF/HEIC files. - if ( PHP_VERSION_ID >= 80500 ) { - $expected = array_merge( - $expected, - array( - 'bits' => 8, - 'channels' => 3, - 'mime' => 'image/heif', - 'width_unit' => 'px', - 'height_unit' => 'px', - ) - ); - } else { - $expected['mime'] = 'image/heic'; - } - - $result = wp_getimagesize( $file ); - $this->assertSame( $expected, $result ); - } - - - /** - * @ticket 39550 - * @dataProvider data_wp_check_filetype_and_ext - * @requires extension fileinfo - */ - public function test_wp_check_filetype_and_ext( $file, $filename, $expected ) { - $this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) ); - } - - public function data_wp_check_filetype_and_ext() { - $data = array( - // Standard image. - array( - DIR_TESTDATA . '/images/canola.jpg', - 'canola.jpg', - array( - 'ext' => 'jpg', - 'type' => 'image/jpeg', - 'proper_filename' => false, - ), - ), - // Image with wrong extension. - array( - DIR_TESTDATA . '/images/test-image-mime-jpg.png', - 'test-image-mime-jpg.png', - array( - 'ext' => 'jpg', - 'type' => 'image/jpeg', - 'proper_filename' => 'test-image-mime-jpg.jpg', - ), - ), - // Image without extension. - array( - DIR_TESTDATA . '/images/test-image-no-extension', - 'test-image-no-extension', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - // Valid non-image file with an image extension. - array( - DIR_TESTDATA . '/formatting/big5.txt', - 'big5.jpg', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - // Non-image file not allowed. - array( - DIR_TESTDATA . '/export/crazy-cdata.xml', - 'crazy-cdata.xml', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - // Non-image file not allowed even if it's named like one. - array( - DIR_TESTDATA . '/export/crazy-cdata.xml', - 'crazy-cdata.jpg', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - // Non-image file not allowed if it's named like something else. - array( - DIR_TESTDATA . '/export/crazy-cdata.xml', - 'crazy-cdata.doc', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - // Non-image file not allowed even if it's named like one. - array( - DIR_TESTDATA . '/export/crazy-cdata.xml', - 'crazy-cdata.jpg', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - // Non-image file not allowed if it's named like something else. - array( - DIR_TESTDATA . '/export/crazy-cdata.xml', - 'crazy-cdata.doc', - array( - 'ext' => false, - 'type' => false, - 'proper_filename' => false, - ), - ), - ); - - // Test a few additional file types on single sites. - if ( ! is_multisite() ) { - $data = array_merge( - $data, - array( - // Standard non-image file. - array( - DIR_TESTDATA . '/formatting/big5.txt', - 'big5.txt', - array( - 'ext' => 'txt', - 'type' => 'text/plain', - 'proper_filename' => false, - ), - ), - // Google Docs file for which finfo_file() returns a duplicate mime type. - array( - DIR_TESTDATA . '/uploads/double-mime-type.docx', - 'double-mime-type.docx', - array( - 'ext' => 'docx', - 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'proper_filename' => false, - ), - ), - // Non-image file with wrong sub-type. - array( - DIR_TESTDATA . '/uploads/pages-to-word.docx', - 'pages-to-word.docx', - array( - 'ext' => 'docx', - 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'proper_filename' => false, - ), - ), - // FLAC file. - array( - DIR_TESTDATA . '/uploads/small-audio.flac', - 'small-audio.flac', - array( - 'ext' => 'flac', - 'type' => 'audio/flac', - 'proper_filename' => false, - ), - ), - // Assorted text/* sample files - array( - DIR_TESTDATA . '/uploads/test.vtt', - 'test.vtt', - array( - 'ext' => 'vtt', - 'type' => 'text/vtt', - 'proper_filename' => false, - ), - ), - array( - DIR_TESTDATA . '/uploads/test.csv', - 'test.csv', - array( - 'ext' => 'csv', - 'type' => 'text/csv', - 'proper_filename' => false, - ), - ), - // RTF files. - array( - DIR_TESTDATA . '/uploads/test.rtf', - 'test.rtf', - array( - 'ext' => 'rtf', - 'type' => 'application/rtf', - 'proper_filename' => false, - ), - ), - ) - ); - } - - return $data; - } - - /** - * @ticket 39550 - * @group ms-excluded - * @requires extension fileinfo - */ - public function test_wp_check_filetype_and_ext_with_filtered_svg() { - $file = DIR_TESTDATA . '/uploads/video-play.svg'; - $filename = 'video-play.svg'; - - $expected = array( - 'ext' => 'svg', - 'type' => 'image/svg+xml', - 'proper_filename' => false, - ); - - add_filter( - 'upload_mimes', - static function ( $mimes ) { - $mimes['svg'] = 'image/svg+xml'; - return $mimes; - } - ); - - $this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) ); - } - - /** - * @ticket 39550 - * @group ms-excluded - * @requires extension fileinfo - */ - public function test_wp_check_filetype_and_ext_with_filtered_woff() { - $file = DIR_TESTDATA . '/uploads/dashicons.woff'; - $filename = 'dashicons.woff'; - - $woff_mime_type = 'application/font-woff'; - - /* - * As of PHP 8.1.12, which includes libmagic/file update to version 5.42, - * the expected mime type for WOFF files is 'font/woff'. - * - * See https://github.com/php/php-src/issues/8805. - */ - if ( PHP_VERSION_ID >= 80112 ) { - $woff_mime_type = 'font/woff'; - } - - $expected = array( - 'ext' => 'woff', - 'type' => $woff_mime_type, - 'proper_filename' => false, - ); - - add_filter( - 'upload_mimes', - static function ( $mimes ) use ( $woff_mime_type ) { - $mimes['woff'] = $woff_mime_type; - return $mimes; - } - ); - - $this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) ); - } - - /** - * Test file path validation - * - * @ticket 42016 - * @ticket 61488 - * @dataProvider data_validate_file - * - * @param string $file File path. - * @param array $allowed_files List of allowed files. - * @param int $expected Expected result. - */ - public function test_validate_file( $file, $allowed_files, $expected ) { - $this->assertSame( $expected, validate_file( $file, $allowed_files ) ); - } - - /** - * Data provider for file validation. - * - * @return array { - * @type array ...$0 { - * @type string $0 File path. - * @type array $1 List of allowed files. - * @type int $2 Expected result. - * } - * } - */ - public function data_validate_file() { - return array( - - // Allowed files: - array( - null, - array(), - 0, - ), - array( - '', - array(), - 0, - ), - array( - ' ', - array(), - 0, - ), - array( - '.', - array(), - 0, - ), - array( - '..', - array(), - 0, - ), - array( - './', - array(), - 0, - ), - array( - 'foo.ext', - array( 'foo.ext' ), - 0, - ), - array( - 'dir/foo.ext', - array(), - 0, - ), - array( - 'foo..ext', - array(), - 0, - ), - array( - 'dir/dir/../', - array(), - 0, - ), - - // Directory traversal: - array( - '../', - array(), - 1, - ), - array( - '../../', - array(), - 1, - ), - array( - '../file.ext', - array(), - 1, - ), - array( - '../dir/../', - array(), - 1, - ), - array( - '/dir/dir/../../', - array(), - 1, - ), - array( - '/dir/dir/../../', - array( '/dir/dir/../../' ), - 1, - ), - - // Windows drives: - array( - 'c:', - array(), - 2, - ), - array( - 'C:/WINDOWS/system32', - array( 'C:/WINDOWS/system32' ), - 2, - ), - - // Windows Path with allowed file - array( - 'Apache24\htdocs\wordpress/wp-content/themes/twentyten/style.css', - array( 'Apache24\htdocs\wordpress/wp-content/themes/twentyten/style.css' ), - 0, - ), - - // Disallowed files: - array( - 'foo.ext', - array( 'bar.ext' ), - 3, - ), - array( - 'foo.ext', - array( '.ext' ), - 3, - ), - array( - 'path/foo.ext', - array( 'foo.ext' ), - 3, - ), - - ); - } - - /** - * Test stream URL validation. - * - * @dataProvider data_wp_is_stream - * - * @param string $path The resource path or URL. - * @param bool $expected Expected result. - */ - public function test_wp_is_stream( $path, $expected ) { - if ( ! extension_loaded( 'openssl' ) && false !== strpos( $path, 'https://' ) ) { - $this->markTestSkipped( 'The openssl PHP extension is not loaded.' ); - } - - $this->assertSame( $expected, wp_is_stream( $path ) ); - } - - /** - * Data provider for stream URL validation. - * - * @return array { - * @type array ...$0 { - * @type string $0 The resource path or URL. - * @type bool $1 Expected result. - * } - * } - */ - public function data_wp_is_stream() { - return array( - // Legitimate stream examples. - array( 'http://example.com', true ), - array( 'https://example.com', true ), - array( 'ftp://example.com', true ), - array( 'file:///path/to/some/file', true ), - array( 'php://some/php/file.php', true ), - - // Non-stream examples. - array( 'fakestream://foo/bar/baz', false ), - array( '../../some/relative/path', false ), - array( 'some/other/relative/path', false ), - array( '/leading/relative/path', false ), - ); - } - - /** - * Test human_readable_duration(). - * - * @ticket 39667 - * @dataProvider data_human_readable_duration - * - * @param string $input Duration. - * @param string $expected Expected human readable duration. - */ - public function test_human_readable_duration( $input, $expected ) { - $this->assertSame( $expected, human_readable_duration( $input ) ); - } - - /** - * Data provider for test_duration_format(). - * - * @return array { - * @type array { - * @type string $input Duration. - * @type string $expect Expected human readable duration. - * } - * } - */ - public function data_human_readable_duration() { - return array( - // Valid ii:ss cases. - array( '0:0', '0 minutes, 0 seconds' ), - array( '00:00', '0 minutes, 0 seconds' ), - array( '0:5', '0 minutes, 5 seconds' ), - array( '0:05', '0 minutes, 5 seconds' ), - array( '01:01', '1 minute, 1 second' ), - array( '30:00', '30 minutes, 0 seconds' ), - array( ' 30:00 ', '30 minutes, 0 seconds' ), - // Valid HH:ii:ss cases. - array( '0:0:0', '0 hours, 0 minutes, 0 seconds' ), - array( '00:00:00', '0 hours, 0 minutes, 0 seconds' ), - array( '00:30:34', '0 hours, 30 minutes, 34 seconds' ), - array( '01:01:01', '1 hour, 1 minute, 1 second' ), - array( '1:02:00', '1 hour, 2 minutes, 0 seconds' ), - array( '10:30:34', '10 hours, 30 minutes, 34 seconds' ), - array( '1234567890:59:59', '1234567890 hours, 59 minutes, 59 seconds' ), - // Valid ii:ss cases with negative sign. - array( '-00:00', '0 minutes, 0 seconds' ), - array( '-3:00', '3 minutes, 0 seconds' ), - array( '-03:00', '3 minutes, 0 seconds' ), - array( '-30:00', '30 minutes, 0 seconds' ), - // Valid HH:ii:ss cases with negative sign. - array( '-00:00:00', '0 hours, 0 minutes, 0 seconds' ), - array( '-1:02:00', '1 hour, 2 minutes, 0 seconds' ), - // Invalid cases. - array( null, false ), - array( '', false ), - array( ':', false ), - array( '::', false ), - array( array(), false ), - array( 'Batman Begins !', false ), - array( '', false ), - array( '-1', false ), - array( -1, false ), - array( 0, false ), - array( 1, false ), - array( '00', false ), - array( '30:-10', false ), - array( ':30:00', false ), // Missing HH. - array( 'MM:30:00', false ), // Invalid HH. - array( '30:MM:00', false ), // Invalid ii. - array( '30:30:MM', false ), // Invalid ss. - array( '30:MM', false ), // Invalid ss. - array( 'MM:00', false ), // Invalid ii. - array( 'MM:MM', false ), // Invalid ii and ss. - array( '10 :30', false ), // Containing a space. - array( '59:61', false ), // Out of bound. - array( '61:59', false ), // Out of bound. - array( '3:59:61', false ), // Out of bound. - array( '03:61:59', false ), // Out of bound. - ); - } - - /** - * @ticket 49404 - * @dataProvider data_wp_is_json_media_type - */ - public function test_wp_is_json_media_type( $input, $expected ) { - $this->assertSame( $expected, wp_is_json_media_type( $input ) ); - } - - - public function data_wp_is_json_media_type() { - return array( - array( 'application/ld+json', true ), - array( 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', true ), - array( 'application/activity+json', true ), - array( 'application/json+oembed', true ), - array( 'application/json', true ), - array( 'application/nojson', false ), - array( 'application/no.json', false ), - array( 'text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8', false ), - array( 'application/activity+json, application/nojson', true ), - ); - } - - /** - * @ticket 53668 - */ - public function test_wp_get_default_extension_for_mime_type() { - $this->assertSame( 'jpg', wp_get_default_extension_for_mime_type( 'image/jpeg' ), 'jpg not returned as default extension for "image/jpeg"' ); - $this->assertNotEquals( 'jpeg', wp_get_default_extension_for_mime_type( 'image/jpeg' ), 'jpeg should not be returned as default extension for "image/jpeg"' ); - $this->assertSame( 'png', wp_get_default_extension_for_mime_type( 'image/png' ), 'png not returned as default extension for "image/png"' ); - $this->assertFalse( wp_get_default_extension_for_mime_type( 'wibble/wobble' ), 'false not returned for unrecognized mime type' ); - $this->assertFalse( wp_get_default_extension_for_mime_type( '' ), 'false not returned when empty string as mime type supplied' ); - $this->assertFalse( wp_get_default_extension_for_mime_type( ' ' ), 'false not returned when empty string as mime type supplied' ); - $this->assertFalse( wp_get_default_extension_for_mime_type( 123 ), 'false not returned when int as mime type supplied' ); - $this->assertFalse( wp_get_default_extension_for_mime_type( null ), 'false not returned when null as mime type supplied' ); - } - - /** - * @ticket 55505 - * @covers ::wp_recursive_ksort - */ - public function test_wp_recursive_ksort() { - // Create an array to test. - $theme_json = array( - 'version' => 1, - 'settings' => array( - 'typography' => array( - 'fontFamilies' => array( - 'fontFamily' => 'DM Sans, sans-serif', - 'slug' => 'dm-sans', - 'name' => 'DM Sans', - ), - ), - 'color' => array( - 'palette' => array( - array( - 'slug' => 'foreground', - 'color' => '#242321', - 'name' => 'Foreground', - ), - array( - 'slug' => 'background', - 'color' => '#FCFBF8', - 'name' => 'Background', - ), - array( - 'slug' => 'primary', - 'color' => '#71706E', - 'name' => 'Primary', - ), - array( - 'slug' => 'tertiary', - 'color' => '#CFCFCF', - 'name' => 'Tertiary', - ), - ), - ), - ), - ); - - // Sort the array. - wp_recursive_ksort( $theme_json ); - - // Expected result. - $expected_theme_json = array( - 'settings' => array( - 'color' => array( - 'palette' => array( - array( - 'color' => '#242321', - 'name' => 'Foreground', - 'slug' => 'foreground', - ), - array( - 'color' => '#FCFBF8', - 'name' => 'Background', - 'slug' => 'background', - ), - array( - 'color' => '#71706E', - 'name' => 'Primary', - 'slug' => 'primary', - ), - array( - 'color' => '#CFCFCF', - 'name' => 'Tertiary', - 'slug' => 'tertiary', - ), - ), - ), - 'typography' => array( - 'fontFamilies' => array( - 'fontFamily' => 'DM Sans, sans-serif', - 'name' => 'DM Sans', - 'slug' => 'dm-sans', - ), - ), - ), - 'version' => 1, - ); - $this->assertSameSetsWithIndex( $theme_json, $expected_theme_json ); - } -} diff --git a/tests/phpunit/tests/functions/addQueryArg.php b/tests/phpunit/tests/functions/addQueryArg.php new file mode 100644 index 0000000000000..d6d808145de3a --- /dev/null +++ b/tests/phpunit/tests/functions/addQueryArg.php @@ -0,0 +1,271 @@ +assertSame( "$url?foo=1", add_query_arg( 'foo', '1', $url ) ); + $this->assertSame( "$url?foo=1", add_query_arg( array( 'foo' => '1' ), $url ) ); + $this->assertSame( + "$url?foo=2", + add_query_arg( + array( + 'foo' => '1', + 'foo' => '2', + ), + $url + ) + ); + $this->assertSame( + "$url?foo=1&bar=2", + add_query_arg( + array( + 'foo' => '1', + 'bar' => '2', + ), + $url + ) + ); + + $_SERVER['REQUEST_URI'] = $url; + + $this->assertSame( "$url?foo=1", add_query_arg( 'foo', '1' ) ); + $this->assertSame( "$url?foo=1", add_query_arg( array( 'foo' => '1' ) ) ); + $this->assertSame( + "$url?foo=2", + add_query_arg( + array( + 'foo' => '1', + 'foo' => '2', + ) + ) + ); + $this->assertSame( + "$url?foo=1&bar=2", + add_query_arg( + array( + 'foo' => '1', + 'bar' => '2', + ) + ) + ); + } + + foreach ( $frag_urls as $frag_url ) { + $_SERVER['REQUEST_URI'] = 'nothing'; + $url = str_replace( '#frag', '', $frag_url ); + + $this->assertSame( "$url?foo=1#frag", add_query_arg( 'foo', '1', $frag_url ) ); + $this->assertSame( "$url?foo=1#frag", add_query_arg( array( 'foo' => '1' ), $frag_url ) ); + $this->assertSame( + "$url?foo=2#frag", + add_query_arg( + array( + 'foo' => '1', + 'foo' => '2', + ), + $frag_url + ) + ); + $this->assertSame( + "$url?foo=1&bar=2#frag", + add_query_arg( + array( + 'foo' => '1', + 'bar' => '2', + ), + $frag_url + ) + ); + + $_SERVER['REQUEST_URI'] = $frag_url; + + $this->assertSame( "$url?foo=1#frag", add_query_arg( 'foo', '1' ) ); + $this->assertSame( "$url?foo=1#frag", add_query_arg( array( 'foo' => '1' ) ) ); + $this->assertSame( + "$url?foo=2#frag", + add_query_arg( + array( + 'foo' => '1', + 'foo' => '2', + ) + ) + ); + $this->assertSame( + "$url?foo=1&bar=2#frag", + add_query_arg( + array( + 'foo' => '1', + 'bar' => '2', + ) + ) + ); + } + + $qs_urls = array( + 'baz=1', // #WP4903 + '/?baz', + '/2012/07/30/?baz', + 'edit.php?baz', + admin_url( 'edit.php?baz' ), + admin_url( 'edit.php?baz', 'https' ), + admin_url( 'edit.php?baz&za=1' ), + admin_url( 'edit.php?baz=1&za=1' ), + admin_url( 'edit.php?baz=0&za=0' ), + ); + + foreach ( $qs_urls as $url ) { + $_SERVER['REQUEST_URI'] = 'nothing'; + + $this->assertSame( "$url&foo=1", add_query_arg( 'foo', '1', $url ) ); + $this->assertSame( "$url&foo=1", add_query_arg( array( 'foo' => '1' ), $url ) ); + $this->assertSame( + "$url&foo=2", + add_query_arg( + array( + 'foo' => '1', + 'foo' => '2', + ), + $url + ) + ); + $this->assertSame( + "$url&foo=1&bar=2", + add_query_arg( + array( + 'foo' => '1', + 'bar' => '2', + ), + $url + ) + ); + + $_SERVER['REQUEST_URI'] = $url; + + $this->assertSame( "$url&foo=1", add_query_arg( 'foo', '1' ) ); + $this->assertSame( "$url&foo=1", add_query_arg( array( 'foo' => '1' ) ) ); + $this->assertSame( + "$url&foo=2", + add_query_arg( + array( + 'foo' => '1', + 'foo' => '2', + ) + ) + ); + $this->assertSame( + "$url&foo=1&bar=2", + add_query_arg( + array( + 'foo' => '1', + 'bar' => '2', + ) + ) + ); + } + + $_SERVER['REQUEST_URI'] = $old_req_uri; + } + + /** + * @ticket 31306 + */ + public function test_add_query_arg_numeric_keys() { + $url = add_query_arg( array( 'foo' => 'bar' ), '1=1' ); + $this->assertSame( '1=1&foo=bar', $url ); + + $url = add_query_arg( + array( + 'foo' => 'bar', + '1' => '2', + ), + '1=1' + ); + $this->assertSame( '1=2&foo=bar', $url ); + + $url = add_query_arg( array( '1' => '2' ), 'foo=bar' ); + $this->assertSame( 'foo=bar&1=2', $url ); + } + + /** + * Tests that add_query_arg removes the question mark when + * a parameter is set to false. + * + * @dataProvider data_add_query_arg_removes_question_mark + * + * @ticket 44499 + * @group add_query_arg + * + * @covers ::add_query_arg + * + * @param string $url Url to test. + * @param string $expected Expected URL. + */ + public function test_add_query_arg_removes_question_mark( $url, $expected, $key = 'param', $value = false ) { + $this->assertSame( $expected, add_query_arg( $key, $value, $url ) ); + } + + /** + * Data provider. + * + * @return array + */ + public function data_add_query_arg_removes_question_mark() { + return array( + 'anchor' => array( + 'url' => 'http://example.org?#anchor', + 'expected' => 'http://example.org#anchor', + ), + '/ then anchor' => array( + 'url' => 'http://example.org/?#anchor', + 'expected' => 'http://example.org/#anchor', + ), + 'invalid query param and anchor' => array( + 'url' => 'http://example.org?param=value#anchor', + 'expected' => 'http://example.org#anchor', + ), + '/ then invalid query param and anchor' => array( + 'url' => 'http://example.org/?param=value#anchor', + 'expected' => 'http://example.org/#anchor', + ), + '?#anchor when adding valid key/value args' => array( + 'url' => 'http://example.org?#anchor', + 'expected' => 'http://example.org?foo=bar#anchor', + 'key' => 'foo', + 'value' => 'bar', + ), + '/?#anchor when adding valid key/value args' => array( + 'url' => 'http://example.org/?#anchor', + 'expected' => 'http://example.org/?foo=bar#anchor', + 'key' => 'foo', + 'value' => 'bar', + ), + ); + } +} diff --git a/tests/phpunit/tests/functions/boolFromYn.php b/tests/phpunit/tests/functions/boolFromYn.php new file mode 100644 index 0000000000000..129b83de54eb4 --- /dev/null +++ b/tests/phpunit/tests/functions/boolFromYn.php @@ -0,0 +1,17 @@ +assertTrue( bool_from_yn( 'Y' ) ); + $this->assertTrue( bool_from_yn( 'y' ) ); + $this->assertFalse( bool_from_yn( 'n' ) ); + } +} diff --git a/tests/phpunit/tests/functions/canonicalCharset.php b/tests/phpunit/tests/functions/canonicalCharset.php index b46b6f5ce5b42..16207456f7cad 100644 --- a/tests/phpunit/tests/functions/canonicalCharset.php +++ b/tests/phpunit/tests/functions/canonicalCharset.php @@ -1,10 +1,6 @@ assertSame( $expected, $actual ); + } + + public function data_device_can_upload() { + return array( + // iPhone iOS 5.0.1, Safari 5.1. + array( + 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A406)', + false, + ), + // iPad iOS 3.2, Safari 4.0.4. + array( + 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10', + false, + ), + // iPod iOS 4.3.3, Safari 5.0.2. + array( + 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5', + false, + ), + // iPhone iOS 6.0.0, Safari 6.0. + array( + 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25', + true, + ), + // iPad iOS 6.0.0, Safari 6.0. + array( + 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25', + true, + ), + // Android 2.2, Android Webkit Browser. + array( + 'Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4', + true, + ), + // BlackBerry 9900, BlackBerry browser. + array( + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+', + true, + ), + // Windows Phone 8.0, Internet Explorer 10.0. + array( + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)', + true, + ), + // Ubuntu desktop, Firefox 41.0. + array( + 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0', + true, + ), + ); + } +} diff --git a/tests/phpunit/tests/functions/getAllowedMimeTypes.php b/tests/phpunit/tests/functions/getAllowedMimeTypes.php new file mode 100644 index 0000000000000..dd387498d2893 --- /dev/null +++ b/tests/phpunit/tests/functions/getAllowedMimeTypes.php @@ -0,0 +1,28 @@ +assertIsArray( $mimes ); + $this->assertNotEmpty( $mimes ); + + add_filter( 'upload_mimes', '__return_empty_array' ); + $mimes = get_allowed_mime_types(); + $this->assertIsArray( $mimes ); + $this->assertEmpty( $mimes ); + + remove_filter( 'upload_mimes', '__return_empty_array' ); + $mimes = get_allowed_mime_types(); + $this->assertIsArray( $mimes ); + $this->assertNotEmpty( $mimes ); + } +} diff --git a/tests/phpunit/tests/functions/getFileData.php b/tests/phpunit/tests/functions/getFileData.php new file mode 100644 index 0000000000000..7ac923bc2a984 --- /dev/null +++ b/tests/phpunit/tests/functions/getFileData.php @@ -0,0 +1,90 @@ + 'Theme Name', + 'ThemeURI' => 'Theme URI', + 'Description' => 'Description', + 'Version' => 'Version', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + ); + + $actual = get_file_data( DIR_TESTDATA . '/themedir1/default/style.css', $theme_headers ); + + $expected = array( + 'Name' => 'WordPress Default', + 'ThemeURI' => 'http://wordpress.org/', + 'Description' => 'The default WordPress theme based on the famous Kubrick.', + 'Version' => '1.6', + 'Author' => 'Michael Heilemann', + 'AuthorURI' => 'http://binarybonsai.com/', + ); + + $this->assertNotEmpty( $actual ); + + foreach ( $actual as $header => $value ) { + $this->assertSame( $expected[ $header ], $value, $header ); + } + } + + /** + * @ticket 19854 + * @group plugins + * @group themes + */ + public function test_get_file_data_with_cr_line_endings() { + $headers = array( + 'SomeHeader' => 'Some Header', + 'Description' => 'Description', + 'Author' => 'Author', + ); + + $actual = get_file_data( DIR_TESTDATA . '/formatting/file-header-cr-line-endings.php', $headers ); + $expected = array( + 'SomeHeader' => 'Some header value!', + 'Description' => 'This file is using CR line endings for a testcase.', + 'Author' => 'A Very Old Mac', + ); + + $this->assertNotEmpty( $actual ); + + foreach ( $actual as $header => $value ) { + $this->assertSame( $expected[ $header ], $value, $header ); + } + } + + /** + * @ticket 47186 + * @group plugins + * @group themes + */ + public function test_get_file_data_with_php_open_tag_prefix() { + $headers = array( + 'TemplateName' => 'Template Name', + ); + + $actual = get_file_data( DIR_TESTDATA . '/formatting/file-header-php-open-tag-prefix.php', $headers ); + $expected = array( + 'TemplateName' => 'Something', + ); + + $this->assertNotEmpty( $actual ); + + foreach ( $actual as $header => $value ) { + $this->assertSame( $expected[ $header ], $value, $header ); + } + } +} diff --git a/tests/phpunit/tests/functions/humanReadableDuration.php b/tests/phpunit/tests/functions/humanReadableDuration.php new file mode 100644 index 0000000000000..a567d568aaa93 --- /dev/null +++ b/tests/phpunit/tests/functions/humanReadableDuration.php @@ -0,0 +1,90 @@ +assertSame( $expected, human_readable_duration( $input ) ); + } + + /** + * Data provider for test_human_readable_duration(). + * + * @return array { + * @type array { + * @type string $input Duration. + * @type string $expect Expected human readable duration. + * } + * } + */ + public function data_human_readable_duration() { + return array( + // Valid ii:ss cases. + array( '0:0', '0 minutes, 0 seconds' ), + array( '00:00', '0 minutes, 0 seconds' ), + array( '0:5', '0 minutes, 5 seconds' ), + array( '0:05', '0 minutes, 5 seconds' ), + array( '01:01', '1 minute, 1 second' ), + array( '30:00', '30 minutes, 0 seconds' ), + array( ' 30:00 ', '30 minutes, 0 seconds' ), + // Valid HH:ii:ss cases. + array( '0:0:0', '0 hours, 0 minutes, 0 seconds' ), + array( '00:00:00', '0 hours, 0 minutes, 0 seconds' ), + array( '00:30:34', '0 hours, 30 minutes, 34 seconds' ), + array( '01:01:01', '1 hour, 1 minute, 1 second' ), + array( '1:02:00', '1 hour, 2 minutes, 0 seconds' ), + array( '10:30:34', '10 hours, 30 minutes, 34 seconds' ), + array( '1234567890:59:59', '1234567890 hours, 59 minutes, 59 seconds' ), + // Valid ii:ss cases with negative sign. + array( '-00:00', '0 minutes, 0 seconds' ), + array( '-3:00', '3 minutes, 0 seconds' ), + array( '-03:00', '3 minutes, 0 seconds' ), + array( '-30:00', '30 minutes, 0 seconds' ), + // Valid HH:ii:ss cases with negative sign. + array( '-00:00:00', '0 hours, 0 minutes, 0 seconds' ), + array( '-1:02:00', '1 hour, 2 minutes, 0 seconds' ), + // Invalid cases. + array( null, false ), + array( '', false ), + array( ':', false ), + array( '::', false ), + array( array(), false ), + array( 'Batman Begins !', false ), + array( '', false ), + array( '-1', false ), + array( -1, false ), + array( 0, false ), + array( 1, false ), + array( '00', false ), + array( '30:-10', false ), + array( ':30:00', false ), // Missing HH. + array( 'MM:30:00', false ), // Invalid HH. + array( '30:MM:00', false ), // Invalid ii. + array( '30:30:MM', false ), // Invalid ss. + array( '30:MM', false ), // Invalid ss. + array( 'MM:00', false ), // Invalid ii. + array( 'MM:MM', false ), // Invalid ii and ss. + array( '10 :30', false ), // Containing a space. + array( '59:61', false ), // Out of bound. + array( '61:59', false ), // Out of bound. + array( '3:59:61', false ), // Out of bound. + array( '03:61:59', false ), // Out of bound. + ); + } +} diff --git a/tests/phpunit/tests/date/mysql2date.php b/tests/phpunit/tests/functions/mysql2date.php similarity index 100% rename from tests/phpunit/tests/date/mysql2date.php rename to tests/phpunit/tests/functions/mysql2date.php diff --git a/tests/phpunit/tests/functions/mysqlToRfc3339.php b/tests/phpunit/tests/functions/mysqlToRfc3339.php new file mode 100644 index 0000000000000..6c71d5991f047 --- /dev/null +++ b/tests/phpunit/tests/functions/mysqlToRfc3339.php @@ -0,0 +1,31 @@ +assertIsString( $date_return, 'The date return must be a string' ); + $this->assertNotEmpty( $date_return, 'The date return could not be an empty string' ); + $this->assertSame( $expected, $date_return, 'The date does not match' ); + $this->assertEquals( new DateTime( $expected ), new DateTime( $date_return ), 'The date is not the same after the call method' ); + } + + public function data_mysql_to_rfc3339() { + return array( + array( '2016-03-15T18:54:46', '15-03-2016 18:54:46' ), + array( '2016-03-02T19:13:25', '2016-03-02 19:13:25' ), + array( '2016-03-02T19:13:00', '2016-03-02 19:13' ), + array( '2016-03-02T19:13:00', '16-03-02 19:13' ), + array( '2016-03-02T19:13:00', '16-03-02 19:13' ), + ); + } +} diff --git a/tests/phpunit/tests/functions/pathIsAbsolute.php b/tests/phpunit/tests/functions/pathIsAbsolute.php new file mode 100644 index 0000000000000..edd0acd2cc393 --- /dev/null +++ b/tests/phpunit/tests/functions/pathIsAbsolute.php @@ -0,0 +1,47 @@ +assertTrue( path_is_absolute( $path ), "path_is_absolute('$path') should return true" ); + } + } + + public function test_path_is_not_absolute() { + $relative_paths = array( + '', + '.', + '..', + '../foo', + '../', + '../foo.bar', + 'foo/bar', + 'foo', + 'FOO', + '..\\WINDOWS', + ); + foreach ( $relative_paths as $path ) { + $this->assertFalse( path_is_absolute( $path ), "path_is_absolute('$path') should return false" ); + } + } +} diff --git a/tests/phpunit/tests/functions/pathJoin.php b/tests/phpunit/tests/functions/pathJoin.php new file mode 100644 index 0000000000000..406e36919b88f --- /dev/null +++ b/tests/phpunit/tests/functions/pathJoin.php @@ -0,0 +1,73 @@ +assertSame( $expected, path_join( $base, $path ) ); + } + + /** + * Data provider for test_path_join(). + * + * @return string[][] + */ + public function data_path_join() { + return array( + // Absolute paths. + 'absolute path should return path' => array( + 'base' => 'base', + 'path' => '/path', + 'expected' => '/path', + ), + 'windows path with slashes' => array( + 'base' => 'base', + 'path' => '//path', + 'expected' => '//path', + ), + 'windows path with backslashes' => array( + 'base' => 'base', + 'path' => '\\\\path', + 'expected' => '\\\\path', + ), + // Non-absolute paths. + 'join base and path' => array( + 'base' => 'base', + 'path' => 'path', + 'expected' => 'base/path', + ), + 'strip trailing slashes in base' => array( + 'base' => 'base///', + 'path' => 'path', + 'expected' => 'base/path', + ), + 'empty path' => array( + 'base' => 'base', + 'path' => '', + 'expected' => 'base/', + ), + 'empty base' => array( + 'base' => '', + 'path' => 'path', + 'expected' => '/path', + ), + 'empty path and base' => array( + 'base' => '', + 'path' => '', + 'expected' => '/', + ), + ); + } +} diff --git a/tests/phpunit/tests/functions/validateFile.php b/tests/phpunit/tests/functions/validateFile.php new file mode 100644 index 0000000000000..8c634563ef6cc --- /dev/null +++ b/tests/phpunit/tests/functions/validateFile.php @@ -0,0 +1,161 @@ +assertSame( $expected, validate_file( $file, $allowed_files ) ); + } + + /** + * Data provider for file validation. + * + * @return array { + * @type array ...$0 { + * @type string $0 File path. + * @type array $1 List of allowed files. + * @type int $2 Expected result. + * } + * } + */ + public function data_validate_file() { + return array( + + // Allowed files: + array( + null, + array(), + 0, + ), + array( + '', + array(), + 0, + ), + array( + ' ', + array(), + 0, + ), + array( + '.', + array(), + 0, + ), + array( + '..', + array(), + 0, + ), + array( + './', + array(), + 0, + ), + array( + 'foo.ext', + array( 'foo.ext' ), + 0, + ), + array( + 'dir/foo.ext', + array(), + 0, + ), + array( + 'foo..ext', + array(), + 0, + ), + array( + 'dir/dir/../', + array(), + 0, + ), + + // Directory traversal: + array( + '../', + array(), + 1, + ), + array( + '../../', + array(), + 1, + ), + array( + '../file.ext', + array(), + 1, + ), + array( + '../dir/../', + array(), + 1, + ), + array( + '/dir/dir/../../', + array(), + 1, + ), + array( + '/dir/dir/../../', + array( '/dir/dir/../../' ), + 1, + ), + + // Windows drives: + array( + 'c:', + array(), + 2, + ), + array( + 'C:/WINDOWS/system32', + array( 'C:/WINDOWS/system32' ), + 2, + ), + + // Windows Path with allowed file + array( + 'Apache24\htdocs\wordpress/wp-content/themes/twentyten/style.css', + array( 'Apache24\htdocs\wordpress/wp-content/themes/twentyten/style.css' ), + 0, + ), + + // Disallowed files: + array( + 'foo.ext', + array( 'bar.ext' ), + 3, + ), + array( + 'foo.ext', + array( '.ext' ), + 3, + ), + array( + 'path/foo.ext', + array( 'foo.ext' ), + 3, + ), + + ); + } +} diff --git a/tests/phpunit/tests/functions/wpCheckFiletypeAndExt.php b/tests/phpunit/tests/functions/wpCheckFiletypeAndExt.php new file mode 100644 index 0000000000000..4b30be2891334 --- /dev/null +++ b/tests/phpunit/tests/functions/wpCheckFiletypeAndExt.php @@ -0,0 +1,258 @@ +assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) ); + } + + public function data_wp_check_filetype_and_ext() { + $data = array( + // Standard image. + array( + DIR_TESTDATA . '/images/canola.jpg', + 'canola.jpg', + array( + 'ext' => 'jpg', + 'type' => 'image/jpeg', + 'proper_filename' => false, + ), + ), + // Image with wrong extension. + array( + DIR_TESTDATA . '/images/test-image-mime-jpg.png', + 'test-image-mime-jpg.png', + array( + 'ext' => 'jpg', + 'type' => 'image/jpeg', + 'proper_filename' => 'test-image-mime-jpg.jpg', + ), + ), + // Image without extension. + array( + DIR_TESTDATA . '/images/test-image-no-extension', + 'test-image-no-extension', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + // Valid non-image file with an image extension. + array( + DIR_TESTDATA . '/formatting/big5.txt', + 'big5.jpg', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + // Non-image file not allowed. + array( + DIR_TESTDATA . '/export/crazy-cdata.xml', + 'crazy-cdata.xml', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + // Non-image file not allowed even if it's named like one. + array( + DIR_TESTDATA . '/export/crazy-cdata.xml', + 'crazy-cdata.jpg', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + // Non-image file not allowed if it's named like something else. + array( + DIR_TESTDATA . '/export/crazy-cdata.xml', + 'crazy-cdata.doc', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + // Non-image file not allowed even if it's named like one. + array( + DIR_TESTDATA . '/export/crazy-cdata.xml', + 'crazy-cdata.jpg', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + // Non-image file not allowed if it's named like something else. + array( + DIR_TESTDATA . '/export/crazy-cdata.xml', + 'crazy-cdata.doc', + array( + 'ext' => false, + 'type' => false, + 'proper_filename' => false, + ), + ), + ); + + // Test a few additional file types on single sites. + if ( ! is_multisite() ) { + $data = array_merge( + $data, + array( + // Standard non-image file. + array( + DIR_TESTDATA . '/formatting/big5.txt', + 'big5.txt', + array( + 'ext' => 'txt', + 'type' => 'text/plain', + 'proper_filename' => false, + ), + ), + // Google Docs file for which finfo_file() returns a duplicate mime type. + array( + DIR_TESTDATA . '/uploads/double-mime-type.docx', + 'double-mime-type.docx', + array( + 'ext' => 'docx', + 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'proper_filename' => false, + ), + ), + // Non-image file with wrong sub-type. + array( + DIR_TESTDATA . '/uploads/pages-to-word.docx', + 'pages-to-word.docx', + array( + 'ext' => 'docx', + 'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'proper_filename' => false, + ), + ), + // FLAC file. + array( + DIR_TESTDATA . '/uploads/small-audio.flac', + 'small-audio.flac', + array( + 'ext' => 'flac', + 'type' => 'audio/flac', + 'proper_filename' => false, + ), + ), + // Assorted text/* sample files + array( + DIR_TESTDATA . '/uploads/test.vtt', + 'test.vtt', + array( + 'ext' => 'vtt', + 'type' => 'text/vtt', + 'proper_filename' => false, + ), + ), + array( + DIR_TESTDATA . '/uploads/test.csv', + 'test.csv', + array( + 'ext' => 'csv', + 'type' => 'text/csv', + 'proper_filename' => false, + ), + ), + // RTF files. + array( + DIR_TESTDATA . '/uploads/test.rtf', + 'test.rtf', + array( + 'ext' => 'rtf', + 'type' => 'application/rtf', + 'proper_filename' => false, + ), + ), + ) + ); + } + + return $data; + } + + /** + * @ticket 39550 + * @group ms-excluded + * @requires extension fileinfo + */ + public function test_wp_check_filetype_and_ext_with_filtered_svg() { + $file = DIR_TESTDATA . '/uploads/video-play.svg'; + $filename = 'video-play.svg'; + + $expected = array( + 'ext' => 'svg', + 'type' => 'image/svg+xml', + 'proper_filename' => false, + ); + + add_filter( + 'upload_mimes', + static function ( $mimes ) { + $mimes['svg'] = 'image/svg+xml'; + return $mimes; + } + ); + + $this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) ); + } + + /** + * @ticket 39550 + * @group ms-excluded + * @requires extension fileinfo + */ + public function test_wp_check_filetype_and_ext_with_filtered_woff() { + $file = DIR_TESTDATA . '/uploads/dashicons.woff'; + $filename = 'dashicons.woff'; + + $woff_mime_type = 'application/font-woff'; + + /* + * As of PHP 8.1.12, which includes libmagic/file update to version 5.42, + * the expected mime type for WOFF files is 'font/woff'. + * + * See https://github.com/php/php-src/issues/8805. + */ + if ( PHP_VERSION_ID >= 80112 ) { + $woff_mime_type = 'font/woff'; + } + + $expected = array( + 'ext' => 'woff', + 'type' => $woff_mime_type, + 'proper_filename' => false, + ); + + add_filter( + 'upload_mimes', + static function ( $mimes ) use ( $woff_mime_type ) { + $mimes['woff'] = $woff_mime_type; + return $mimes; + } + ); + + $this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) ); + } +} diff --git a/tests/phpunit/tests/date/wpDate.php b/tests/phpunit/tests/functions/wpDate.php similarity index 100% rename from tests/phpunit/tests/date/wpDate.php rename to tests/phpunit/tests/functions/wpDate.php diff --git a/tests/phpunit/tests/functions/wpExt2Type.php b/tests/phpunit/tests/functions/wpExt2Type.php new file mode 100644 index 0000000000000..d6de698f449a8 --- /dev/null +++ b/tests/phpunit/tests/functions/wpExt2Type.php @@ -0,0 +1,26 @@ +assertNotEmpty( $extensions ); + + foreach ( $extensions as $type => $extension_list ) { + foreach ( $extension_list as $extension ) { + $this->assertSame( $type, wp_ext2type( $extension ) ); + $this->assertSame( $type, wp_ext2type( strtoupper( $extension ) ) ); + } + } + + $this->assertNull( wp_ext2type( 'unknown_format' ) ); + } +} diff --git a/tests/phpunit/tests/functions/wpExtractUrls.php b/tests/phpunit/tests/functions/wpExtractUrls.php new file mode 100644 index 0000000000000..9e36ea42cd578 --- /dev/null +++ b/tests/phpunit/tests/functions/wpExtractUrls.php @@ -0,0 +1,210 @@ +assertNotEmpty( $urls ); + $this->assertIsArray( $urls ); + $this->assertCount( count( $original_urls ), $urls ); + $this->assertSame( $original_urls, $urls ); + + $exploded = array_values( array_filter( array_map( 'trim', explode( "\n", $blob ) ) ) ); + // wp_extract_urls() calls html_entity_decode(). + $decoded = array_map( 'html_entity_decode', $exploded ); + + $this->assertSame( $decoded, $urls ); + $this->assertSame( $original_urls, $decoded ); + + $blob = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor + incididunt ut labore http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html et dolore magna aliqua. + Ut http://this.com enim ad minim veniam, quis nostrud exercitation 16.06. to 18.06.2014 ullamco http://127.0.0.1 + laboris nisi ut aliquip ex http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437 ea + commodo consequat. http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html Duis aute irure dolor in reprehenderit in voluptate + velit esse http://wordpress-core.com:8080/ cillum dolore eu fugiat nulla http://www.website.com:5000 pariatur. Excepteur sint occaecat cupidatat non proident, + sunt in culpa qui officia deserunt mollit http://wordpress-core/?346236346326&2134362574863.437 anim id est laborum.'; + + $urls = wp_extract_urls( $blob ); + $this->assertNotEmpty( $urls ); + $this->assertIsArray( $urls ); + $this->assertCount( 8, $urls ); + $this->assertSame( array_slice( $original_urls, 0, 8 ), $urls ); + + $blob = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor + incididunt ut labore 343462^ et dolore magna aliqua. + Ut &3640i6p1yi499 enim ad minim veniam, quis nostrud exercitation 16.06. to 18.06.2014 ullamco localhost + laboris nisi ut aliquip ex 343462^ ea + commodo consequat. 343462^ Duis aute irure dolor in reprehenderit in voluptate + velit esse -3-4--321-64-4@#!$^$!@^@^ cillum dolore eu http://www.website.com:5000 fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, + sunt in culpa qui officia deserunt mollit )(*&^%$ anim id est laborum.'; + + $urls = wp_extract_urls( $blob ); + $this->assertNotEmpty( $urls ); + $this->assertIsArray( $urls ); + $this->assertCount( 8, $urls ); + $this->assertSame( array_slice( $original_urls, 0, 8 ), $urls ); + } + + /** + * Tests for backward compatibility of `wp_extract_urls` to remove unused semicolons. + * + * @ticket 30580 + * + * @covers ::wp_extract_urls + */ + public function test_wp_extract_urls_remove_semicolon() { + $expected = array( + 'http://typo.com', + 'http://example.org/?post_type=post&p=8', + ); + $actual = wp_extract_urls( + ' + http://typo.com; + http://example.org/?post_type=;p;o;s;t;&p=8; + ' + ); + + $this->assertSame( $expected, $actual ); + } +} diff --git a/tests/phpunit/tests/functions/wpGenerateUuid4.php b/tests/phpunit/tests/functions/wpGenerateUuid4.php new file mode 100644 index 0000000000000..95569a020e6bb --- /dev/null +++ b/tests/phpunit/tests/functions/wpGenerateUuid4.php @@ -0,0 +1,27 @@ +assertTrue( wp_is_uuid( $uuid, 4 ) ); + $uuids[] = $uuid; + } + + $unique_uuids = array_unique( $uuids ); + $this->assertSame( $uuids, $unique_uuids ); + } +} diff --git a/tests/phpunit/tests/functions/wpGetDefaultExtensionForMimeType.php b/tests/phpunit/tests/functions/wpGetDefaultExtensionForMimeType.php new file mode 100644 index 0000000000000..88e2549ad27bd --- /dev/null +++ b/tests/phpunit/tests/functions/wpGetDefaultExtensionForMimeType.php @@ -0,0 +1,22 @@ +assertSame( 'jpg', wp_get_default_extension_for_mime_type( 'image/jpeg' ), 'jpg not returned as default extension for "image/jpeg"' ); + $this->assertNotEquals( 'jpeg', wp_get_default_extension_for_mime_type( 'image/jpeg' ), 'jpeg should not be returned as default extension for "image/jpeg"' ); + $this->assertSame( 'png', wp_get_default_extension_for_mime_type( 'image/png' ), 'png not returned as default extension for "image/png"' ); + $this->assertFalse( wp_get_default_extension_for_mime_type( 'wibble/wobble' ), 'false not returned for unrecognized mime type' ); + $this->assertFalse( wp_get_default_extension_for_mime_type( '' ), 'false not returned when empty string as mime type supplied' ); + $this->assertFalse( wp_get_default_extension_for_mime_type( ' ' ), 'false not returned when empty string as mime type supplied' ); + $this->assertFalse( wp_get_default_extension_for_mime_type( 123 ), 'false not returned when int as mime type supplied' ); + $this->assertFalse( wp_get_default_extension_for_mime_type( null ), 'false not returned when null as mime type supplied' ); + } +} diff --git a/tests/phpunit/tests/functions/wpGetExtTypes.php b/tests/phpunit/tests/functions/wpGetExtTypes.php new file mode 100644 index 0000000000000..fd0d2d1f41123 --- /dev/null +++ b/tests/phpunit/tests/functions/wpGetExtTypes.php @@ -0,0 +1,27 @@ +assertIsArray( $extensions ); + $this->assertNotEmpty( $extensions ); + + add_filter( 'ext2type', '__return_empty_array' ); + $extensions = wp_get_ext_types(); + $this->assertSame( array(), $extensions ); + + remove_filter( 'ext2type', '__return_empty_array' ); + $extensions = wp_get_ext_types(); + $this->assertIsArray( $extensions ); + $this->assertNotEmpty( $extensions ); + } +} diff --git a/tests/phpunit/tests/http/wpGetHttpHeaders.php b/tests/phpunit/tests/functions/wpGetHttpHeaders.php similarity index 100% rename from tests/phpunit/tests/http/wpGetHttpHeaders.php rename to tests/phpunit/tests/functions/wpGetHttpHeaders.php diff --git a/tests/phpunit/tests/functions/wpGetImageMime.php b/tests/phpunit/tests/functions/wpGetImageMime.php new file mode 100644 index 0000000000000..ab403f48e8bb4 --- /dev/null +++ b/tests/phpunit/tests/functions/wpGetImageMime.php @@ -0,0 +1,109 @@ +markTestSkipped( 'The exif PHP extension is not loaded.' ); + } + + if ( is_array( $expected ) ) { + $this->assertContains( wp_get_image_mime( $file ), $expected ); + } else { + $this->assertSame( $expected, wp_get_image_mime( $file ) ); + } + } + + /** + * Data provider for test_wp_get_image_mime(). + * + * @return array[] + */ + public function data_wp_get_image_mime() { + $data = array( + // Standard JPEG. + array( + DIR_TESTDATA . '/images/test-image.jpg', + 'image/jpeg', + ), + // Standard GIF. + array( + DIR_TESTDATA . '/images/test-image.gif', + 'image/gif', + ), + // Standard PNG. + array( + DIR_TESTDATA . '/images/test-image.png', + 'image/png', + ), + // Image with wrong extension. + array( + DIR_TESTDATA . '/images/test-image-mime-jpg.png', + 'image/jpeg', + ), + // Animated WebP. + array( + DIR_TESTDATA . '/images/webp-animated.webp', + 'image/webp', + ), + // Lossless WebP. + array( + DIR_TESTDATA . '/images/webp-lossless.webp', + 'image/webp', + ), + // Lossy WebP. + array( + DIR_TESTDATA . '/images/webp-lossy.webp', + 'image/webp', + ), + // Transparent WebP. + array( + DIR_TESTDATA . '/images/webp-transparent.webp', + 'image/webp', + ), + // Not an image. + array( + DIR_TESTDATA . '/uploads/dashicons.woff', + false, + ), + // Animated AVIF. + array( + DIR_TESTDATA . '/images/avif-animated.avif', + 'image/avif', + ), + // Lossless AVIF. + array( + DIR_TESTDATA . '/images/avif-lossless.avif', + 'image/avif', + ), + // Lossy AVIF. + array( + DIR_TESTDATA . '/images/avif-lossy.avif', + 'image/avif', + ), + // Transparent AVIF. + array( + DIR_TESTDATA . '/images/avif-transparent.avif', + 'image/avif', + ), + // HEIC. + array( + DIR_TESTDATA . '/images/test-image.heic', + // In PHP 8.5, it returns 'image/heif'. Before that, it returns 'image/heic'. + array( 'image/heic', 'image/heif' ), + ), + ); + + return $data; + } +} diff --git a/tests/phpunit/tests/functions/wpGetImageSize.php b/tests/phpunit/tests/functions/wpGetImageSize.php new file mode 100644 index 0000000000000..eb48638df8f30 --- /dev/null +++ b/tests/phpunit/tests/functions/wpGetImageSize.php @@ -0,0 +1,234 @@ +markTestSkipped( 'The exif PHP extension is not loaded.' ); + } + + $result = wp_getimagesize( $file ); + + // The getimagesize() function varies in its response, so + // let's restrict comparison to expected keys only. + if ( is_array( $expected ) ) { + foreach ( $expected as $k => $v ) { + $this->assertArrayHasKey( $k, $result ); + $this->assertSame( $expected[ $k ], $result[ $k ] ); + } + } else { + $this->assertSame( $expected, $result ); + } + } + + /** + * Data provider for test_wp_getimagesize(). + */ + public function data_wp_getimagesize() { + $data = array( + // Standard JPEG. + array( + DIR_TESTDATA . '/images/test-image.jpg', + array( + 50, + 50, + IMAGETYPE_JPEG, + 'width="50" height="50"', + 'mime' => 'image/jpeg', + ), + ), + // Standard GIF. + array( + DIR_TESTDATA . '/images/test-image.gif', + array( + 50, + 50, + IMAGETYPE_GIF, + 'width="50" height="50"', + 'mime' => 'image/gif', + ), + ), + // Standard PNG. + array( + DIR_TESTDATA . '/images/test-image.png', + array( + 50, + 50, + IMAGETYPE_PNG, + 'width="50" height="50"', + 'mime' => 'image/png', + ), + ), + // Image with wrong extension. + array( + DIR_TESTDATA . '/images/test-image-mime-jpg.png', + array( + 50, + 50, + IMAGETYPE_JPEG, + 'width="50" height="50"', + 'mime' => 'image/jpeg', + ), + ), + // Animated WebP. + array( + DIR_TESTDATA . '/images/webp-animated.webp', + array( + 100, + 100, + IMAGETYPE_WEBP, + 'width="100" height="100"', + 'mime' => 'image/webp', + ), + ), + // Lossless WebP. + array( + DIR_TESTDATA . '/images/webp-lossless.webp', + array( + 1200, + 675, + IMAGETYPE_WEBP, + 'width="1200" height="675"', + 'mime' => 'image/webp', + ), + ), + // Lossy WebP. + array( + DIR_TESTDATA . '/images/webp-lossy.webp', + array( + 1200, + 675, + IMAGETYPE_WEBP, + 'width="1200" height="675"', + 'mime' => 'image/webp', + ), + ), + // Transparent WebP. + array( + DIR_TESTDATA . '/images/webp-transparent.webp', + array( + 1200, + 675, + IMAGETYPE_WEBP, + 'width="1200" height="675"', + 'mime' => 'image/webp', + ), + ), + // Not an image. + array( + DIR_TESTDATA . '/uploads/dashicons.woff', + false, + ), + // Animated AVIF. + array( + DIR_TESTDATA . '/images/avif-animated.avif', + array( + 150, + 150, + IMAGETYPE_AVIF, + 'width="150" height="150"', + 'mime' => 'image/avif', + ), + ), + // Lossless AVIF. + array( + DIR_TESTDATA . '/images/avif-lossless.avif', + array( + 400, + 400, + IMAGETYPE_AVIF, + 'width="400" height="400"', + 'mime' => 'image/avif', + ), + ), + // Lossy AVIF. + array( + DIR_TESTDATA . '/images/avif-lossy.avif', + array( + 400, + 400, + IMAGETYPE_AVIF, + 'width="400" height="400"', + 'mime' => 'image/avif', + ), + ), + // Transparent AVIF. + array( + DIR_TESTDATA . '/images/avif-transparent.avif', + array( + 128, + 128, + IMAGETYPE_AVIF, + 'width="128" height="128"', + 'mime' => 'image/avif', + ), + ), + // Grid AVIF. + array( + DIR_TESTDATA . '/images/avif-alpha-grid2x1.avif', + array( + 199, + 200, + IMAGETYPE_AVIF, + 'width="199" height="200"', + 'mime' => 'image/avif', + ), + ), + ); + + return $data; + } + + /** + * Tests that wp_getimagesize() correctly handles HEIC image files. + * + * @ticket 53645 + */ + public function test_wp_getimagesize_heic() { + if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) { + $this->markTestSkipped( 'The exif PHP extension is not loaded.' ); + } + + $file = DIR_TESTDATA . '/images/test-image.heic'; + + $editor = wp_get_image_editor( $file ); + if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/heic' ) ) { + $this->markTestSkipped( 'No HEIC support in the editor engine on this system.' ); + } + + $expected = array( + 1180, + 1180, + IMAGETYPE_HEIF, + 'width="1180" height="1180"', + ); + + // As of PHP 8.5.0, getimagesize() supports HEIF/HEIC files. + if ( PHP_VERSION_ID >= 80500 ) { + $expected = array_merge( + $expected, + array( + 'bits' => 8, + 'channels' => 3, + 'mime' => 'image/heif', + 'width_unit' => 'px', + 'height_unit' => 'px', + ) + ); + } else { + $expected['mime'] = 'image/heic'; + } + + $result = wp_getimagesize( $file ); + $this->assertSame( $expected, $result ); + } +} diff --git a/tests/phpunit/tests/functions/wpGetMimeTypes.php b/tests/phpunit/tests/functions/wpGetMimeTypes.php index 8bcd0aed8a9dc..7e69b35861f89 100644 --- a/tests/phpunit/tests/functions/wpGetMimeTypes.php +++ b/tests/phpunit/tests/functions/wpGetMimeTypes.php @@ -1,32 +1,40 @@ assertIsArray( $mime_types_start ); - $this->assertNotEmpty( $mime_types_start ); + $this->assertIsArray( $mimes ); + $this->assertNotEmpty( $mimes ); add_filter( 'mime_types', '__return_empty_array' ); - $mime_types_empty = wp_get_mime_types(); - $this->assertSame( array(), $mime_types_empty ); + $mimes = wp_get_mime_types(); + $this->assertIsArray( $mimes ); + $this->assertEmpty( $mimes ); remove_filter( 'mime_types', '__return_empty_array' ); - $mime_types = wp_get_mime_types(); - $this->assertIsArray( $mime_types ); - $this->assertNotEmpty( $mime_types ); - // Did it revert to the original after filter remove? - $this->assertSame( $mime_types_start, $mime_types ); + $mimes = wp_get_mime_types(); + $this->assertIsArray( $mimes ); + $this->assertNotEmpty( $mimes ); + + // 'upload_mimes' should not affect wp_get_mime_types(). + add_filter( 'upload_mimes', '__return_empty_array' ); + $mimes = wp_get_mime_types(); + $this->assertIsArray( $mimes ); + $this->assertNotEmpty( $mimes ); + + remove_filter( 'upload_mimes', '__return_empty_array' ); + $mimes2 = wp_get_mime_types(); + $this->assertIsArray( $mimes2 ); + $this->assertNotEmpty( $mimes2 ); + $this->assertSame( $mimes2, $mimes ); } } diff --git a/tests/phpunit/tests/functions/wpIsJsonMediaType.php b/tests/phpunit/tests/functions/wpIsJsonMediaType.php new file mode 100644 index 0000000000000..aeda89167706c --- /dev/null +++ b/tests/phpunit/tests/functions/wpIsJsonMediaType.php @@ -0,0 +1,31 @@ +assertSame( $expected, wp_is_json_media_type( $input ) ); + } + + + public function data_wp_is_json_media_type() { + return array( + array( 'application/ld+json', true ), + array( 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', true ), + array( 'application/activity+json', true ), + array( 'application/json+oembed', true ), + array( 'application/json', true ), + array( 'application/nojson', false ), + array( 'application/no.json', false ), + array( 'text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8', false ), + array( 'application/activity+json, application/nojson', true ), + ); + } +} diff --git a/tests/phpunit/tests/functions/wpIsStream.php b/tests/phpunit/tests/functions/wpIsStream.php new file mode 100644 index 0000000000000..9e8699bec0836 --- /dev/null +++ b/tests/phpunit/tests/functions/wpIsStream.php @@ -0,0 +1,51 @@ +markTestSkipped( 'The openssl PHP extension is not loaded.' ); + } + + $this->assertSame( $expected, wp_is_stream( $path ) ); + } + + /** + * Data provider for stream URL validation. + * + * @return array { + * @type array ...$0 { + * @type string $0 The resource path or URL. + * @type bool $1 Expected result. + * } + * } + */ + public function data_wp_is_stream() { + return array( + // Legitimate stream examples. + array( 'http://example.com', true ), + array( 'https://example.com', true ), + array( 'ftp://example.com', true ), + array( 'file:///path/to/some/file', true ), + array( 'php://some/php/file.php', true ), + + // Non-stream examples. + array( 'fakestream://foo/bar/baz', false ), + array( '../../some/relative/path', false ), + array( 'some/other/relative/path', false ), + array( '/leading/relative/path', false ), + ); + } +} diff --git a/tests/phpunit/tests/functions/wpIsUuid.php b/tests/phpunit/tests/functions/wpIsUuid.php new file mode 100644 index 0000000000000..1dff89f161d11 --- /dev/null +++ b/tests/phpunit/tests/functions/wpIsUuid.php @@ -0,0 +1,58 @@ +assertTrue( wp_is_uuid( $uuid, 4 ) ); + } + + $uuids = array( + '00000000-0000-0000-0000-000000000000', // Nil. + '9e3a0460-d72d-11e4-a631-c8e0eb141dab', // Version 1. + '2c1d43b8-e6d7-376e-af7f-d4bde997cc3f', // Version 3. + '39888f87-fb62-5988-a425-b2ea63f5b81e', // Version 5. + ); + + foreach ( $uuids as $uuid ) { + $this->assertTrue( wp_is_uuid( $uuid ) ); + $this->assertFalse( wp_is_uuid( $uuid, 4 ) ); + } + + $invalid_uuids = array( + 'a19d5192-ea41-41e6-b006', + 'this-is-not-valid', + 1234, + true, + array(), + ); + + foreach ( $invalid_uuids as $invalid_uuid ) { + $this->assertFalse( wp_is_uuid( $invalid_uuid, 4 ) ); + $this->assertFalse( wp_is_uuid( $invalid_uuid ) ); + } + } +} diff --git a/tests/phpunit/tests/functions/wpJsonEncode.php b/tests/phpunit/tests/functions/wpJsonEncode.php new file mode 100644 index 0000000000000..8d91a212b07bc --- /dev/null +++ b/tests/phpunit/tests/functions/wpJsonEncode.php @@ -0,0 +1,96 @@ +assertSame( wp_json_encode( 'a' ), '"a"' ); + } + + /** + * @ticket 28786 + */ + public function test_wp_json_encode_utf8() { + $this->assertSame( wp_json_encode( '这' ), '"\u8fd9"' ); + } + + /** + * @ticket 28786 + * @requires function mb_detect_order + */ + public function test_wp_json_encode_non_utf8() { + $charsets = mb_detect_order(); + $old_charsets = $charsets; + if ( ! in_array( 'EUC-JP', $charsets, true ) ) { + $charsets[] = 'EUC-JP'; + mb_detect_order( $charsets ); + } + + $eucjp = mb_convert_encoding( 'aあb', 'EUC-JP', 'UTF-8' ); + $utf8 = mb_convert_encoding( $eucjp, 'UTF-8', 'EUC-JP' ); + + $this->assertSame( 'aあb', $utf8 ); + + $this->assertSame( '"a\u3042b"', wp_json_encode( $eucjp ) ); + + mb_detect_order( $old_charsets ); + } + + /** + * @ticket 28786 + * @requires function mb_detect_order + */ + public function test_wp_json_encode_non_utf8_in_array() { + $charsets = mb_detect_order(); + $old_charsets = $charsets; + if ( ! in_array( 'EUC-JP', $charsets, true ) ) { + $charsets[] = 'EUC-JP'; + mb_detect_order( $charsets ); + } + + $eucjp = mb_convert_encoding( 'aあb', 'EUC-JP', 'UTF-8' ); + $utf8 = mb_convert_encoding( $eucjp, 'UTF-8', 'EUC-JP' ); + + $this->assertSame( 'aあb', $utf8 ); + + $this->assertSame( '["c","a\u3042b"]', wp_json_encode( array( 'c', $eucjp ) ) ); + + mb_detect_order( $old_charsets ); + } + + /** + * @ticket 28786 + */ + public function test_wp_json_encode_array() { + $this->assertSame( wp_json_encode( array( 'a' ) ), '["a"]' ); + } + + /** + * @ticket 28786 + */ + public function test_wp_json_encode_object() { + $object = new stdClass(); + $object->a = 'b'; + $this->assertSame( wp_json_encode( $object ), '{"a":"b"}' ); + } + + /** + * @ticket 28786 + */ + public function test_wp_json_encode_depth() { + $data = array( array( array( 1, 2, 3 ) ) ); + $json = wp_json_encode( $data, 0, 1 ); + $this->assertFalse( $json ); + + $data = array( 'あ', array( array( 1, 2, 3 ) ) ); + $json = wp_json_encode( $data, 0, 1 ); + $this->assertFalse( $json ); + } +} diff --git a/tests/phpunit/tests/functions/wpJsonFileDecode.php b/tests/phpunit/tests/functions/wpJsonFileDecode.php new file mode 100644 index 0000000000000..ce265ed3fd557 --- /dev/null +++ b/tests/phpunit/tests/functions/wpJsonFileDecode.php @@ -0,0 +1,33 @@ +assertIsObject( $result ); + $this->assertSame( 'tests/notice', $result->name ); + } + + /** + * @ticket 53238 + */ + public function test_wp_json_file_decode_associative_array() { + $result = wp_json_file_decode( + DIR_TESTDATA . '/blocks/notice/block.json', + array( 'associative' => true ) + ); + + $this->assertIsArray( $result ); + $this->assertSame( 'tests/notice', $result['name'] ); + } +} diff --git a/tests/phpunit/tests/functions/wpNormalizePath.php b/tests/phpunit/tests/functions/wpNormalizePath.php new file mode 100644 index 0000000000000..1b106f02e3531 --- /dev/null +++ b/tests/phpunit/tests/functions/wpNormalizePath.php @@ -0,0 +1,102 @@ +assertSame( $expected, wp_normalize_path( $path ) ); + } + + public function data_wp_normalize_path() { + return array( + // Windows paths. + array( 'C:\\www\\path\\', 'C:/www/path/' ), + array( 'C:\\www\\\\path\\', 'C:/www/path/' ), + array( 'c:/www/path', 'C:/www/path' ), + array( 'c:\\www\\path\\', 'C:/www/path/' ), // Uppercase drive letter. + array( 'c:\\\\www\\path\\', 'C:/www/path/' ), + array( '\\\\Domain\\DFSRoots\\share\\path\\', '//Domain/DFSRoots/share/path/' ), + array( '\\\\Server\\share\\path', '//Server/share/path' ), + array( '\\\\Server\\share', '//Server/share' ), + + // Linux paths. + array( '/www/path/', '/www/path/' ), + array( '/www/path/////', '/www/path/' ), + array( '/www/path', '/www/path' ), + + // PHP stream wrappers. + array( 'php://input', 'php://input' ), + array( 'http://example.com//path.ext', 'http://example.com/path.ext' ), + array( 'file://c:\\www\\path\\', 'file://C:/www/path/' ), + + // Edge cases. + array( '', '' ), // Empty string should return empty string. + array( 123, '123' ), // Integer should be cast to string. + ); + } + + /** + * Tests that wp_normalize_path() works with objects that have __toString(). + * + * This is important because the function uses a static cache, and the input + * must be cast to string before being used as an array key. + * + * @ticket 64538 + */ + public function test_wp_normalize_path_with_stringable_object() { + $file_info = new SplFileInfo( '/var/www/html\\test' ); + + $this->assertSame( '/var/www/html/test', wp_normalize_path( $file_info ) ); + } + + /** + * Tests that wp_normalize_path() returns consistent results on repeated calls. + * + * The function uses a static cache, so this verifies cache behavior. + * + * @ticket 64538 + */ + public function test_wp_normalize_path_returns_consistent_results() { + $path = 'C:\\www\\path\\'; + + $first_call = wp_normalize_path( $path ); + $second_call = wp_normalize_path( $path ); + $third_call = wp_normalize_path( $path ); + + $this->assertSame( $first_call, $second_call, 'Second call should return same result as first.' ); + $this->assertSame( $second_call, $third_call, 'Third call should return same result as second.' ); + $this->assertSame( 'C:/www/path/', $first_call, 'Normalized path should match expected value.' ); + } + + /** + * Tests that wp_normalize_path() static cache stores results. + * + * @ticket 64538 + */ + public function test_wp_normalize_path_static_cache() { + $path = '/var/www/cache-test\\subdir\\'; + $expected = '/var/www/cache-test/subdir/'; + + $result = wp_normalize_path( $path ); + $this->assertSame( $expected, $result ); + + $reflection = new ReflectionFunction( 'wp_normalize_path' ); + $static_vars = $reflection->getStaticVariables(); + + $this->assertArrayHasKey( 'cache', $static_vars, 'Static cache array should exist.' ); + $this->assertArrayHasKey( $path, $static_vars['cache'], 'Cache should contain the normalized path.' ); + $this->assertSame( $expected, $static_vars['cache'][ $path ], 'Cached value should match the expected normalized path.' ); + } +} diff --git a/tests/phpunit/tests/functions/wpParseArgs.php b/tests/phpunit/tests/functions/wpParseArgs.php new file mode 100644 index 0000000000000..1f29208c37c1a --- /dev/null +++ b/tests/phpunit/tests/functions/wpParseArgs.php @@ -0,0 +1,88 @@ +_baba = 5; + $x->yZ = 'baba'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $x->a = array( 5, 111, 'x' ); + $this->assertSame( + array( + '_baba' => 5, + 'yZ' => 'baba', + 'a' => array( 5, 111, 'x' ), + ), + wp_parse_args( $x ) + ); + $y = new MockClass(); + $this->assertSame( array(), wp_parse_args( $y ) ); + } + + public function test_wp_parse_args_array() { + // Arrays. + $a = array(); + $this->assertSame( array(), wp_parse_args( $a ) ); + $b = array( + '_baba' => 5, + 'yZ' => 'baba', + 'a' => array( 5, 111, 'x' ), + ); + $this->assertSame( + array( + '_baba' => 5, + 'yZ' => 'baba', + 'a' => array( 5, 111, 'x' ), + ), + wp_parse_args( $b ) + ); + } + + public function test_wp_parse_args_defaults() { + $x = new MockClass(); + $x->_baba = 5; + $x->yZ = 'baba'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $x->a = array( 5, 111, 'x' ); + $d = array( 'pu' => 'bu' ); + $this->assertSame( + array( + 'pu' => 'bu', + '_baba' => 5, + 'yZ' => 'baba', + 'a' => array( 5, 111, 'x' ), + ), + wp_parse_args( $x, $d ) + ); + $e = array( '_baba' => 6 ); + $this->assertSame( + array( + '_baba' => 5, + 'yZ' => 'baba', + 'a' => array( 5, 111, 'x' ), + ), + wp_parse_args( $x, $e ) + ); + } + + public function test_wp_parse_args_other() { + $b = true; + wp_parse_str( $b, $s ); + $this->assertSame( $s, wp_parse_args( $b ) ); + $q = 'x=5&_baba=dudu&'; + wp_parse_str( $q, $ss ); + $this->assertSame( $ss, wp_parse_args( $q ) ); + } + + /** + * @ticket 30753 + */ + public function test_wp_parse_args_boolean_strings() { + $args = wp_parse_args( 'foo=false&bar=true' ); + $this->assertIsString( $args['foo'] ); + $this->assertIsString( $args['bar'] ); + } +} diff --git a/tests/phpunit/tests/functions/wpRaiseMemoryLimit.php b/tests/phpunit/tests/functions/wpRaiseMemoryLimit.php new file mode 100644 index 0000000000000..4bb9dcc016e2c --- /dev/null +++ b/tests/phpunit/tests/functions/wpRaiseMemoryLimit.php @@ -0,0 +1,30 @@ +markTestSkipped( 'WP_MAX_MEMORY_LIMIT should be set to -1.' ); + } + + $ini_limit_before = ini_get( 'memory_limit' ); + $raised_limit = wp_raise_memory_limit(); + $ini_limit_after = ini_get( 'memory_limit' ); + + $this->assertSame( $ini_limit_before, $ini_limit_after ); + $this->assertFalse( $raised_limit ); + $this->assertEquals( WP_MAX_MEMORY_LIMIT, $ini_limit_after ); + } +} diff --git a/tests/phpunit/tests/functions/wpRecursiveKsort.php b/tests/phpunit/tests/functions/wpRecursiveKsort.php new file mode 100644 index 0000000000000..278199dd70196 --- /dev/null +++ b/tests/phpunit/tests/functions/wpRecursiveKsort.php @@ -0,0 +1,95 @@ + 1, + 'settings' => array( + 'typography' => array( + 'fontFamilies' => array( + 'fontFamily' => 'DM Sans, sans-serif', + 'slug' => 'dm-sans', + 'name' => 'DM Sans', + ), + ), + 'color' => array( + 'palette' => array( + array( + 'slug' => 'foreground', + 'color' => '#242321', + 'name' => 'Foreground', + ), + array( + 'slug' => 'background', + 'color' => '#FCFBF8', + 'name' => 'Background', + ), + array( + 'slug' => 'primary', + 'color' => '#71706E', + 'name' => 'Primary', + ), + array( + 'slug' => 'tertiary', + 'color' => '#CFCFCF', + 'name' => 'Tertiary', + ), + ), + ), + ), + ); + + // Sort the array. + wp_recursive_ksort( $theme_json ); + + // Expected result. + $expected_theme_json = array( + 'settings' => array( + 'color' => array( + 'palette' => array( + array( + 'color' => '#242321', + 'name' => 'Foreground', + 'slug' => 'foreground', + ), + array( + 'color' => '#FCFBF8', + 'name' => 'Background', + 'slug' => 'background', + ), + array( + 'color' => '#71706E', + 'name' => 'Primary', + 'slug' => 'primary', + ), + array( + 'color' => '#CFCFCF', + 'name' => 'Tertiary', + 'slug' => 'tertiary', + ), + ), + ), + 'typography' => array( + 'fontFamilies' => array( + 'fontFamily' => 'DM Sans, sans-serif', + 'name' => 'DM Sans', + 'slug' => 'dm-sans', + ), + ), + ), + 'version' => 1, + ); + $this->assertSameSetsWithIndex( $theme_json, $expected_theme_json ); + } +} diff --git a/tests/phpunit/tests/date/wpTimezone.php b/tests/phpunit/tests/functions/wpTimezone.php similarity index 90% rename from tests/phpunit/tests/date/wpTimezone.php rename to tests/phpunit/tests/functions/wpTimezone.php index d4e7e7e220fdd..17e27e0fe4462 100644 --- a/tests/phpunit/tests/date/wpTimezone.php +++ b/tests/phpunit/tests/functions/wpTimezone.php @@ -4,7 +4,6 @@ * @group date * @group datetime * - * @covers ::wp_timezone_string * @covers ::wp_timezone */ class Tests_Date_wpTimezone extends WP_UnitTestCase { @@ -32,8 +31,6 @@ public function test_should_convert_gmt_offset( $gmt_offset, $tz_name ) { delete_option( 'timezone_string' ); update_option( 'gmt_offset', $gmt_offset ); - $this->assertSame( $tz_name, wp_timezone_string() ); - $timezone = wp_timezone(); $this->assertSame( $tz_name, $timezone->getName() ); @@ -110,11 +107,9 @@ public function data_should_convert_gmt_offset() { /** * @ticket 24730 */ - public function test_should_return_timezone_string() { + public function test_should_return_timezone_object() { update_option( 'timezone_string', 'Europe/Helsinki' ); - $this->assertSame( 'Europe/Helsinki', wp_timezone_string() ); - $timezone = wp_timezone(); $this->assertSame( 'Europe/Helsinki', $timezone->getName() ); @@ -125,12 +120,10 @@ public function test_should_return_timezone_string() { * * @ticket 56468 */ - public function test_should_return_deprecated_timezone_string() { + public function test_should_return_deprecated_timezone_object() { $tz_string = 'America/Buenos_Aires'; // This timezone was deprecated pre-PHP 5.6. update_option( 'timezone_string', $tz_string ); - $this->assertSame( $tz_string, wp_timezone_string() ); - $timezone = wp_timezone(); $this->assertSame( $tz_string, $timezone->getName() ); diff --git a/tests/phpunit/tests/functions/wpTimezoneString.php b/tests/phpunit/tests/functions/wpTimezoneString.php new file mode 100644 index 0000000000000..cfea6d9ffa5ff --- /dev/null +++ b/tests/phpunit/tests/functions/wpTimezoneString.php @@ -0,0 +1,125 @@ +assertSame( $tz_name, wp_timezone_string() ); + } + + /** + * Data provider to test numeric offset conversion. + * + * @return array + */ + public function data_should_convert_gmt_offset() { + return array( + array( -12, '-12:00' ), + array( -11.5, '-11:30' ), + array( -11, '-11:00' ), + array( -10.5, '-10:30' ), + array( -10, '-10:00' ), + array( -9.5, '-09:30' ), + array( -9, '-09:00' ), + array( -8.5, '-08:30' ), + array( -8, '-08:00' ), + array( -7.5, '-07:30' ), + array( -7, '-07:00' ), + array( -6.5, '-06:30' ), + array( -6, '-06:00' ), + array( -5.5, '-05:30' ), + array( -5, '-05:00' ), + array( -4.5, '-04:30' ), + array( -4, '-04:00' ), + array( -3.5, '-03:30' ), + array( -3, '-03:00' ), + array( -2.5, '-02:30' ), + array( -2, '-02:00' ), + array( '-1.5', '-01:30' ), + array( -1.5, '-01:30' ), + array( -1, '-01:00' ), + array( -0.5, '-00:30' ), + array( 0, '+00:00' ), + array( '0', '+00:00' ), + array( 0.5, '+00:30' ), + array( 1, '+01:00' ), + array( 1.5, '+01:30' ), + array( '1.5', '+01:30' ), + array( 2, '+02:00' ), + array( 2.5, '+02:30' ), + array( 3, '+03:00' ), + array( 3.5, '+03:30' ), + array( 4, '+04:00' ), + array( 4.5, '+04:30' ), + array( 5, '+05:00' ), + array( 5.5, '+05:30' ), + array( 5.75, '+05:45' ), + array( 6, '+06:00' ), + array( 6.5, '+06:30' ), + array( 7, '+07:00' ), + array( 7.5, '+07:30' ), + array( 8, '+08:00' ), + array( 8.5, '+08:30' ), + array( 8.75, '+08:45' ), + array( 9, '+09:00' ), + array( 9.5, '+09:30' ), + array( 10, '+10:00' ), + array( 10.5, '+10:30' ), + array( 11, '+11:00' ), + array( 11.5, '+11:30' ), + array( 12, '+12:00' ), + array( 12.75, '+12:45' ), + array( 13, '+13:00' ), + array( 13.75, '+13:45' ), + array( 14, '+14:00' ), + ); + } + + /** + * @ticket 24730 + */ + public function test_should_return_timezone_string() { + update_option( 'timezone_string', 'Europe/Helsinki' ); + + $this->assertSame( 'Europe/Helsinki', wp_timezone_string() ); + } + + /** + * Ensures that deprecated timezone strings are handled correctly. + * + * @ticket 56468 + */ + public function test_should_return_deprecated_timezone_string() { + $tz_string = 'America/Buenos_Aires'; // This timezone was deprecated pre-PHP 5.6. + update_option( 'timezone_string', $tz_string ); + + $this->assertSame( $tz_string, wp_timezone_string() ); + } +} diff --git a/tests/phpunit/tests/functions/wpUniqueFilename.php b/tests/phpunit/tests/functions/wpUniqueFilename.php new file mode 100644 index 0000000000000..ed48f242ea805 --- /dev/null +++ b/tests/phpunit/tests/functions/wpUniqueFilename.php @@ -0,0 +1,193 @@ +assertSame( $expected, wp_unique_filename( $testdir, $filename ), $message ); + } + + /** + * Data provider for test_wp_unique_filename. + * + * @return array[] + */ + public function data_wp_unique_filename() { + return array( + 'non-existing file' => array( + 'filename' => 'abcdefg.png', + 'expected' => 'abcdefg.png', + 'message' => 'Test non-existing file, file name should be unchanged.', + ), + 'file already exists' => array( + 'filename' => 'test-image.png', + 'expected' => 'test-image-1.png', + 'message' => 'File name not unique, number not appended.', + ), + 'uppercase extension' => array( + 'filename' => 'test-image.PNG', + 'expected' => 'test-image-1.png', + 'message' => 'File name with uppercase extension not unique, number not appended.', + ), + 'already added number' => array( + 'filename' => 'test-image-2.gif', + 'expected' => 'test-image-2-1.gif', + 'message' => 'File name not unique, number not appended correctly.', + ), + 'special chars' => array( + 'filename' => 'testtést-imagé.png', + 'expected' => 'testtest-image.png', + 'message' => 'Filename with special chars failed', + ), + 'special chars with potential conflict' => array( + 'filename' => 'tést-imagé.png', + 'expected' => 'test-image-1.png', + 'message' => 'Filename with special chars failed', + ), + 'single quotes in name' => array( + 'filename' => "abcdefg'h.png", + 'expected' => 'abcdefgh.png', + 'message' => 'File with quote failed', + ), + 'double quotes in name' => array( + 'filename' => 'abcdefg"h.png', + 'expected' => 'abcdefgh.png', + 'message' => 'File with quote failed', + ), + 'crazy name' => array( + 'filename' => '12%af34567890#~!@#$..%^&*()|_+qwerty fgh`jkl zx<>?:"{}[]="\'/?.png', + 'expected' => '12af34567890@.^_qwerty-fghjkl-zx.png', + 'message' => 'Failed crazy file name', + ), + 'single slash' => array( + 'filename' => 'abcde\fg.png', + 'expected' => 'abcdefg.png', + 'message' => 'Slash not removed', + ), + 'double slash' => array( + 'filename' => 'abcde\\fg.png', + 'expected' => 'abcdefg.png', + 'message' => 'Double slashed not removed', + ), + 'triple slash' => array( + 'filename' => 'abcde\\\fg.png', + 'expected' => 'abcdefg.png', + 'message' => 'Triple slashed not removed', + ), + ); + } + + /** + * @ticket 42437 + */ + public function test_unique_filename_with_dimension_like_filename() { + $testdir = DIR_TESTDATA . '/images/'; + + add_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); + + // Test collision with "dimension-like" original filename. + $this->assertSame( 'one-blue-pixel-100x100-1.png', wp_unique_filename( $testdir, 'one-blue-pixel-100x100.png' ) ); + // Test collision with existing sub-size filename. + // Existing files: one-blue-pixel-100x100.png, one-blue-pixel-1-100x100.png. + $this->assertSame( 'one-blue-pixel-2.png', wp_unique_filename( $testdir, 'one-blue-pixel.png' ) ); + // Same as above with upper case extension. + $this->assertSame( 'one-blue-pixel-2.png', wp_unique_filename( $testdir, 'one-blue-pixel.PNG' ) ); + + remove_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); + } + + // Callback to patch "basedir" when used in `wp_unique_filename()`. + public function upload_dir_patch_basedir( $upload_dir ) { + $upload_dir['basedir'] = DIR_TESTDATA . '/images/'; + return $upload_dir; + } + + /** + * @ticket 53668 + */ + public function test_wp_unique_filename_with_additional_image_extension() { + $testdir = DIR_TESTDATA . '/images/'; + + add_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); + + // Set conversions for uploaded images. + add_filter( 'image_editor_output_format', array( $this, 'image_editor_output_format_handler' ) ); + + // Ensure the test images exist. + $this->assertFileExists( $testdir . 'test-image-1-100x100.jpg', 'test-image-1-100x100.jpg does not exist' ); + $this->assertFileExists( $testdir . 'test-image-2.gif', 'test-image-2.gif does not exist' ); + $this->assertFileExists( $testdir . 'test-image-3.jpg', 'test-image-3.jpg does not exist' ); + $this->assertFileExists( $testdir . 'test-image-4.png', 'test-image-4.png does not exist' ); + + // Standard test: file does not exist and there are no possible intersections with other files. + $this->assertSame( + 'abcdef.png', + wp_unique_filename( $testdir, 'abcdef.png' ), + 'The abcdef.png, abcdef.gif, and abcdef.jpg images do not exist. The file name should not be changed.' + ); + + // Actual clash recognized. + $this->assertSame( + 'canola-1.jpg', + wp_unique_filename( $testdir, 'canola.jpg' ), + 'The canola.jpg image exists. The file name should be unique.' + ); + + // Same name with different uppercase extension and the image will be converted. + $this->assertSame( + 'canola-1.png', + wp_unique_filename( $testdir, 'canola.PNG' ), + 'The canola.jpg image exists. Uploading canola.PNG that will be converted to canola.jpg should produce unique file name.' + ); + + // Actual clash with several images with different extensions. + $this->assertSame( + 'test-image-5.png', + wp_unique_filename( $testdir, 'test-image.png' ), + 'The test-image.png, test-image-1-100x100.jpg, test-image-2.gif, test-image-3.jpg, and test-image-4.png images exist.' . + 'All of them may clash when creating sub-sizes or regenerating thumbnails in the future. The filename should be unique.' + ); + + // Possible clash with regenerated thumbnails in the future. + $this->assertSame( + 'codeispoetry-1.jpg', + wp_unique_filename( $testdir, 'codeispoetry.jpg' ), + 'The codeispoetry.png image exists. When regenerating thumbnails for it they will be converted to JPG.' . + 'The name of the newly uploaded codeispoetry.jpg should be made unique.' + ); + + remove_filter( 'image_editor_output_format', array( $this, 'image_editor_output_format_handler' ) ); + remove_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) ); + } + + /** + * Changes the output format when editing images. When uploading a PNG file + * it will be converted to JPEG, GIF to JPEG, and PICT to BMP + * (if the image editor in PHP supports it). + * + * @param array $formats + * + * @return array + */ + public function image_editor_output_format_handler( $formats ) { + $formats['image/png'] = 'image/jpeg'; + $formats['image/gif'] = 'image/jpeg'; + $formats['image/pct'] = 'image/bmp'; + + return $formats; + } +} diff --git a/tests/phpunit/tests/functions/wpUniqueId.php b/tests/phpunit/tests/functions/wpUniqueId.php new file mode 100644 index 0000000000000..931ea82b136f3 --- /dev/null +++ b/tests/phpunit/tests/functions/wpUniqueId.php @@ -0,0 +1,36 @@ +assertIsString( $id ); + $this->assertIsNumeric( $id ); + $ids[] = $id; + } + $this->assertSame( $ids, array_unique( $ids ) ); + + // Test with prefix. + $ids = array(); + for ( $i = 0; $i < 20; $i += 1 ) { + $id = wp_unique_id( 'foo-' ); + $this->assertMatchesRegularExpression( '/^foo-\d+$/', $id ); + $ids[] = $id; + } + $this->assertSame( $ids, array_unique( $ids ) ); + } +} diff --git a/tests/phpunit/tests/functions/wpUploadDir.php b/tests/phpunit/tests/functions/wpUploadDir.php new file mode 100644 index 0000000000000..31a2f647ef4ed --- /dev/null +++ b/tests/phpunit/tests/functions/wpUploadDir.php @@ -0,0 +1,38 @@ +reset_options(); + } + + private function reset_options() { + // System defaults. + update_option( 'upload_path', 'wp-content/uploads' ); + update_option( 'upload_url_path', '' ); + update_option( 'uploads_use_yearmonth_folders', 1 ); + } + + /** + * @covers ::wp_upload_dir + */ + public function test_upload_dir_default() { + // wp_upload_dir() with default parameters. + $info = wp_upload_dir(); + $subdir = date_format( date_create( 'now' ), '/Y/m' ); + + $this->assertSame( get_option( 'siteurl' ) . '/wp-content/uploads' . $subdir, $info['url'] ); + $this->assertSame( ABSPATH . 'wp-content/uploads' . $subdir, $info['path'] ); + $this->assertSame( $subdir, $info['subdir'] ); + $this->assertFalse( $info['error'] ); + } +} diff --git a/tests/phpunit/tests/upload.php b/tests/phpunit/tests/functions/wpUploadDirInternal.php similarity index 86% rename from tests/phpunit/tests/upload.php rename to tests/phpunit/tests/functions/wpUploadDirInternal.php index 46fcea7099097..822fcd580891b 100644 --- a/tests/phpunit/tests/upload.php +++ b/tests/phpunit/tests/functions/wpUploadDirInternal.php @@ -1,11 +1,14 @@ assertSame( get_option( 'siteurl' ) . '/wp-content/uploads' . $subdir, $info['url'] ); - $this->assertSame( ABSPATH . 'wp-content/uploads' . $subdir, $info['path'] ); - $this->assertSame( $subdir, $info['subdir'] ); - $this->assertFalse( $info['error'] ); - } - public function test_upload_dir_relative() { // wp_upload_dir() with a relative upload path that is not 'wp-content/uploads'. update_option( 'upload_path', 'foo/bar' );