Wordpress/tests/phpunit/tests/theme/themeDir.php
Sergey Biryukov 164b22cf6a Tests: First pass at using assertSame() instead of assertEquals() in most of the unit tests.
This ensures that not only the return values match the expected results, but also that their type is the same.

Going forward, stricter type checking by using `assertSame()` should generally be preferred to `assertEquals()` where appropriate, to make the tests more reliable.

Props johnbillion, jrf, SergeyBiryukov.
See #38266.

git-svn-id: https://develop.svn.wordpress.org/trunk@48937 602fd350-edb4-49c9-b593-d223f7449a82
2020-09-02 00:35:36 +00:00

298 lines
10 KiB
PHP

<?php
/**
* Test functions that fetch stuff from the theme directory
*
* @group themes
*/
class Tests_Theme_ThemeDir extends WP_UnitTestCase {
function setUp() {
parent::setUp();
$this->theme_root = DIR_TESTDATA . '/themedir1';
$this->orig_theme_dir = $GLOBALS['wp_theme_directories'];
// /themes is necessary as theme.php functions assume /themes is the root if there is only one root.
$GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root );
add_filter( 'theme_root', array( $this, '_theme_root' ) );
add_filter( 'stylesheet_root', array( $this, '_theme_root' ) );
add_filter( 'template_root', array( $this, '_theme_root' ) );
// Clear caches.
wp_clean_themes_cache();
unset( $GLOBALS['wp_themes'] );
}
function tearDown() {
$GLOBALS['wp_theme_directories'] = $this->orig_theme_dir;
remove_filter( 'theme_root', array( $this, '_theme_root' ) );
remove_filter( 'stylesheet_root', array( $this, '_theme_root' ) );
remove_filter( 'template_root', array( $this, '_theme_root' ) );
wp_clean_themes_cache();
unset( $GLOBALS['wp_themes'] );
parent::tearDown();
}
// Replace the normal theme root directory with our premade test directory.
function _theme_root( $dir ) {
return $this->theme_root;
}
/**
* @expectedDeprecated get_theme
* @expectedDeprecated get_themes
*/
function test_theme_default() {
$themes = get_themes();
$theme = get_theme( 'WordPress Default' );
$this->assertSame( $themes['WordPress Default'], $theme );
$this->assertFalse( empty( $theme ) );
// echo gen_tests_array( 'theme', $theme );
$this->assertSame( 'WordPress Default', $theme['Name'] );
$this->assertSame( 'WordPress Default', $theme['Title'] );
$this->assertSame( 'The default WordPress theme based on the famous <a href="http://binarybonsai.com/kubrick/">Kubrick</a>.', $theme['Description'] );
$this->assertSame( '<a href="http://binarybonsai.com/">Michael Heilemann</a>', $theme['Author'] );
$this->assertSame( '1.6', $theme['Version'] );
$this->assertSame( 'default', $theme['Template'] );
$this->assertSame( 'default', $theme['Stylesheet'] );
$this->assertContains( $this->theme_root . '/default/functions.php', $theme['Template Files'] );
$this->assertContains( $this->theme_root . '/default/index.php', $theme['Template Files'] );
$this->assertContains( $this->theme_root . '/default/style.css', $theme['Stylesheet Files'] );
$this->assertSame( $this->theme_root . '/default', $theme['Template Dir'] );
$this->assertSame( $this->theme_root . '/default', $theme['Stylesheet Dir'] );
$this->assertSame( 'publish', $theme['Status'] );
$this->assertSame( '', $theme['Parent Theme'] );
}
/**
* @expectedDeprecated get_theme
* @expectedDeprecated get_themes
*/
function test_theme_sandbox() {
$theme = get_theme( 'Sandbox' );
$this->assertFalse( empty( $theme ) );
// echo gen_tests_array( 'theme', $theme );
$this->assertSame( 'Sandbox', $theme['Name'] );
$this->assertSame( 'Sandbox', $theme['Title'] );
$this->assertSame( 'A theme with powerful, semantic CSS selectors and the ability to add new skins.', $theme['Description'] );
$this->assertSame( '<a href="http://andy.wordpress.com/">Andy Skelton</a> &amp; <a href="http://www.plaintxt.org/">Scott Allan Wallick</a>', $theme['Author'] );
$this->assertSame( '0.6.1-wpcom', $theme['Version'] );
$this->assertSame( 'sandbox', $theme['Template'] );
$this->assertSame( 'sandbox', $theme['Stylesheet'] );
$template_files = $theme['Template Files'];
$this->assertSame( $this->theme_root . '/sandbox/functions.php', reset( $template_files ) );
$this->assertSame( $this->theme_root . '/sandbox/index.php', next( $template_files ) );
$stylesheet_files = $theme['Stylesheet Files'];
$this->assertSame( $this->theme_root . '/sandbox/style.css', reset( $stylesheet_files ) );
$this->assertSame( $this->theme_root . '/sandbox', $theme['Template Dir'] );
$this->assertSame( $this->theme_root . '/sandbox', $theme['Stylesheet Dir'] );
$this->assertSame( 'publish', $theme['Status'] );
$this->assertSame( '', $theme['Parent Theme'] );
}
/**
* A CSS-only theme
*
* @expectedDeprecated get_themes
*/
function test_theme_stylesheet_only() {
$themes = get_themes();
$theme = $themes['Stylesheet Only'];
$this->assertFalse( empty( $theme ) );
// echo gen_tests_array( 'theme', $theme );
$this->assertSame( 'Stylesheet Only', $theme['Name'] );
$this->assertSame( 'Stylesheet Only', $theme['Title'] );
$this->assertSame( 'A three-column widget-ready theme in dark blue.', $theme['Description'] );
$this->assertSame( '<a href="http://www.example.com/">Henry Crun</a>', $theme['Author'] );
$this->assertSame( '1.0', $theme['Version'] );
$this->assertSame( 'sandbox', $theme['Template'] );
$this->assertSame( 'stylesheetonly', $theme['Stylesheet'] );
$this->assertContains( $this->theme_root . '/sandbox/functions.php', $theme['Template Files'] );
$this->assertContains( $this->theme_root . '/sandbox/index.php', $theme['Template Files'] );
$this->assertContains( $this->theme_root . '/stylesheetonly/style.css', $theme['Stylesheet Files'] );
$this->assertSame( $this->theme_root . '/sandbox', $theme['Template Dir'] );
$this->assertSame( $this->theme_root . '/stylesheetonly', $theme['Stylesheet Dir'] );
$this->assertSame( 'publish', $theme['Status'] );
$this->assertSame( 'Sandbox', $theme['Parent Theme'] );
}
/**
* @expectedDeprecated get_themes
*/
function test_theme_list() {
$themes = get_themes();
// Ignore themes in the default /themes directory.
foreach ( $themes as $theme_name => $theme ) {
if ( $theme->get_theme_root() !== $this->theme_root ) {
unset( $themes[ $theme_name ] );
}
}
$theme_names = array_keys( $themes );
$expected = array(
'WordPress Default',
'Sandbox',
'Stylesheet Only',
'My Theme',
'My Theme/theme1', // Duplicate theme should be given a unique name.
'My Subdir Theme', // Theme in a subdirectory should work.
'Page Template Child Theme', // Theme which inherits page templates.
'Page Template Theme', // Theme with page templates for other test code.
'Theme with Spaces in the Directory',
'Internationalized Theme',
'camelCase',
'REST Theme',
);
sort( $theme_names );
sort( $expected );
$this->assertSame( $expected, $theme_names );
}
/**
* @expectedDeprecated get_themes
* @expectedDeprecated get_broken_themes
*/
function test_broken_themes() {
$themes = get_themes();
$expected = array(
'broken-theme' => array(
'Name' => 'broken-theme',
'Title' => 'broken-theme',
'Description' => __( 'Stylesheet is missing.' ),
),
'Child and Parent Theme' => array(
'Name' => 'Child and Parent Theme',
'Title' => 'Child and Parent Theme',
'Description' => sprintf( __( 'The theme defines itself as its parent theme. Please check the %s header.' ), '<code>Template</code>' ),
),
);
$this->assertSame( $expected, get_broken_themes() );
}
function test_wp_get_theme_with_non_default_theme_root() {
$this->assertFalse( wp_get_theme( 'sandbox', $this->theme_root )->errors() );
$this->assertFalse( wp_get_theme( 'sandbox' )->errors() );
}
/**
* @expectedDeprecated get_themes
*/
function test_page_templates() {
$themes = get_themes();
$theme = $themes['Page Template Theme'];
$this->assertFalse( empty( $theme ) );
$templates = $theme['Template Files'];
$this->assertTrue( in_array( $this->theme_root . '/page-templates/template-top-level.php', $templates, true ) );
}
/**
* @expectedDeprecated get_theme_data
*/
function test_get_theme_data_top_level() {
$theme_data = get_theme_data( DIR_TESTDATA . '/themedir1/theme1/style.css' );
$this->assertSame( 'My Theme', $theme_data['Name'] );
$this->assertSame( 'http://example.org/', $theme_data['URI'] );
$this->assertSame( 'An example theme', $theme_data['Description'] );
$this->assertSame( '<a href="http://example.com/">Minnie Bannister</a>', $theme_data['Author'] );
$this->assertSame( 'http://example.com/', $theme_data['AuthorURI'] );
$this->assertSame( '1.3', $theme_data['Version'] );
$this->assertSame( '', $theme_data['Template'] );
$this->assertSame( 'publish', $theme_data['Status'] );
$this->assertSame( array(), $theme_data['Tags'] );
$this->assertSame( 'My Theme', $theme_data['Title'] );
$this->assertSame( 'Minnie Bannister', $theme_data['AuthorName'] );
}
/**
* @expectedDeprecated get_theme_data
*/
function test_get_theme_data_subdir() {
$theme_data = get_theme_data( $this->theme_root . '/subdir/theme2/style.css' );
$this->assertSame( 'My Subdir Theme', $theme_data['Name'] );
$this->assertSame( 'http://example.org/', $theme_data['URI'] );
$this->assertSame( 'An example theme in a sub directory', $theme_data['Description'] );
$this->assertSame( '<a href="http://wordpress.org/">Mr. WordPress</a>', $theme_data['Author'] );
$this->assertSame( 'http://wordpress.org/', $theme_data['AuthorURI'] );
$this->assertSame( '0.1', $theme_data['Version'] );
$this->assertSame( '', $theme_data['Template'] );
$this->assertSame( 'publish', $theme_data['Status'] );
$this->assertSame( array(), $theme_data['Tags'] );
$this->assertSame( 'My Subdir Theme', $theme_data['Title'] );
$this->assertSame( 'Mr. WordPress', $theme_data['AuthorName'] );
}
/**
* @ticket 28662
*/
function test_theme_dir_slashes() {
$size = count( $GLOBALS['wp_theme_directories'] );
@mkdir( WP_CONTENT_DIR . '/themes/foo' );
@mkdir( WP_CONTENT_DIR . '/themes/foo-themes' );
$this->assertFileExists( WP_CONTENT_DIR . '/themes/foo' );
$this->assertFileExists( WP_CONTENT_DIR . '/themes/foo-themes' );
register_theme_directory( '/' );
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
register_theme_directory( 'themes/' );
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
register_theme_directory( '/foo/' );
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
register_theme_directory( 'foo/' );
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
register_theme_directory( 'themes/foo/' );
$this->assertCount( $size + 1, $GLOBALS['wp_theme_directories'] );
register_theme_directory( WP_CONTENT_DIR . '/foo-themes/' );
$this->assertCount( $size + 1, $GLOBALS['wp_theme_directories'] );
foreach ( $GLOBALS['wp_theme_directories'] as $dir ) {
$this->assertNotEquals( '/', substr( $dir, -1 ) );
}
rmdir( WP_CONTENT_DIR . '/themes/foo' );
rmdir( WP_CONTENT_DIR . '/themes/foo-themes' );
}
}