1
0
Fork 0
mirror of https://github.com/buddypress/buddypress.git synced 2026-07-22 20:56:55 +08:00
buddypress/tests/phpunit/testcases/core/avatars.php
Mathieu Viet d0aa915375 14.2.1 version bumps (branch 14.0)
git-svn-id: https://buddypress.svn.wordpress.org/branches/14.0@14051 cdf35c40-ae34-48e0-9cc9-0c9da1808c22
2024-10-22 20:51:48 +00:00

450 lines
14 KiB
PHP

<?php
/**
* @group core
* @group avatars
*/
class BP_Tests_Avatars extends BP_UnitTestCase {
private $params = array();
protected $allowed_image_types = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
protected $allowed_image_mimes = array( 'image/jpeg', 'image/jpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/webp' );
protected $capture = array();
public function set_up() {
parent::set_up();
}
private function clean_existing_avatars( $type = 'user' ) {
if ( 'user' === $type ) {
$avatar_dir = 'avatars';
} elseif ( 'group' === $object ) {
$avatar_dir = 'group-avatars';
}
$this->rrmdir( bp_core_avatar_upload_path() . '/' . $avatar_dir );
}
/**
* @ticket BP4948
*/
function test_avatars_on_non_root_blog() {
// Do not pass 'Go', do not collect $200
if ( ! is_multisite() ) {
$this->markTestSkipped();
}
$u = self::factory()->user->create();
// get BP root blog's upload directory data
$upload_dir = wp_upload_dir();
// create new subsite
$blog_id = self::factory()->blog->create( array(
'user_id' => $u,
'title' => 'Test Title',
'path' => '/path' . rand() . time() . '/',
) );
// emulate a page load on the new sub-site
$this->go_to( get_blog_option( $blog_id, 'siteurl' ) );
// test to see if the upload dir is correct
$this->assertEquals( $upload_dir['baseurl'], bp_core_avatar_url() );
// reset globals
$this->go_to( '/' );
}
/**
* @group bp_get_user_has_avatar
*/
public function test_bp_get_user_has_avatar_no_avatar_uploaded() {
$this->clean_existing_avatars();
$u = self::factory()->user->create();
$this->assertFalse( bp_get_user_has_avatar( $u ) );
}
/**
* @group bp_get_user_has_avatar
*/
public function test_bp_get_user_has_avatar_has_avatar_uploaded() {
$u = self::factory()->user->create();
// Fake it
add_filter( 'bp_core_fetch_avatar_url', array( $this, 'avatar_cb' ) );
$this->assertTrue( bp_get_user_has_avatar( $u ) );
remove_filter( 'bp_core_fetch_avatar_url', array( $this, 'avatar_cb' ) );
}
public function avatar_cb() {
return 'foo';
}
/**
* @group bp_core_fetch_avatar
*/
public function test_bp_core_fetch_avatar_parameter_conservation() {
// First, run the check with custom parameters, specifying no gravatar.
$this->params = array(
'item_id' => 1406,
'object' => 'custom_object',
'type' => 'full',
'avatar_dir' => 'custom-dir',
'width' => 48,
'height' => 54,
'class' => 'custom-class',
'css_id' => 'custom-css-id',
'alt' => 'custom alt',
'email' => 'avatar@avatar.org',
'no_grav' => true,
'html' => true,
'title' => 'custom-title',
'extra_attr' => 'data-testing="buddypress"',
'scheme' => 'http',
'rating' => get_option( 'avatar_rating' ),
'force_default' => false,
);
// Check to make sure the custom parameters survived the function all the way up to output
add_filter( 'bp_core_fetch_avatar', array( $this, 'bp_core_fetch_avatar_filter_check' ), 12, 2 );
$avatar = bp_core_fetch_avatar( $this->params );
// Re-run check, allowing gravatars.
$this->params['no_grav'] = false;
$avatar = bp_core_fetch_avatar( $this->params );
remove_filter( 'bp_core_fetch_avatar', array( $this, 'bp_core_fetch_avatar_filter_check' ), 12 );
unset( $this->params );
}
public function bp_core_fetch_avatar_filter_check( $html, $params ) {
// Check that the passed parameters match the original custom parameters.
$this->assertEmpty( array_merge( array_diff( $params, $this->params ), array_diff( $this->params, $params ) ) );
// Check the returned html to see that it matches an expected value.
// Get the correct default avatar, based on whether gravatars are allowed.
if ( $params['no_grav'] ) {
$avatar_url = bp_core_avatar_default( 'local', $params );
} else {
// This test has the slight odor of hokum since it recreates so much code that could be changed at any time.
$bp = buddypress();
$host = '//www.gravatar.com/avatar/';
// Set expected gravatar type
if ( empty( $bp->grav_default->{$this->params['object']} ) ) {
$default_grav = 'wavatar';
} elseif ( 'mystery' == $bp->grav_default->{$this->params['object']} ) {
$default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $this->params['width'] );
} else {
$default_grav = $bp->grav_default->{$this->params['object']};
}
$avatar_url = $host . md5( strtolower( $this->params['email'] ) );
// Main Gravatar URL args.
$url_args = array(
's' => $this->params['width']
);
// Force default.
if ( ! empty( $this->params['force_default'] ) ) {
$url_args['f'] = 'y';
}
// Gravatar rating; http://bit.ly/89QxZA
$rating = strtolower( get_option( 'avatar_rating' ) );
if ( ! empty( $rating ) ) {
$url_args['r'] = $rating;
}
// Default avatar.
if ( 'gravatar_default' !== $default_grav ) {
$url_args['d'] = $default_grav;
}
// Set up the Gravatar URL.
$avatar_url = esc_url( add_query_arg(
rawurlencode_deep( array_filter( $url_args ) ),
$avatar_url
) );
}
$expected_html = '<img loading="lazy" src="' . $avatar_url . '" id="' . $this->params['css_id'] . '" class="' . $this->params['class'] . ' ' . $this->params['object'] . '-' . $this->params['item_id'] . '-avatar avatar-' . $this->params['width'] . ' photo" width="' . $this->params['width'] . '" height="' . $this->params['height'] . '" alt="' . $this->params['alt'] . '" title="' . $this->params['title'] . '" ' . $this->params['extra_attr'] . ' />';
$this->assertEquals( $html, $expected_html );
}
/**
* @group bp_core_fetch_avatar
*/
public function test_bp_core_fetch_avatar_class_attribute() {
$u = self::factory()->user->create();
$hw = 100;
$args = array(
'item_id' => $u,
'object' => 'user',
'type' => 'full',
'width' => $hw,
'height' => $hw,
'class' => '',
'no_grav' => true,
'html' => true,
);
// Class attribute is empty
$avatar = bp_core_fetch_avatar( $args );
$expected = array( 'avatar', 'user-' . $u . '-avatar', 'avatar-' . $hw );
preg_match( '/class=["\']?([^"\']*)["\' ]/is', $avatar, $matches );
$classes = explode( ' ', $matches[1] );
$this->assertSame( $expected, array_intersect_key( $expected, $classes ) );
// Class attribute is a String
$args['class'] = 'custom-class class-custom';
$avatar = bp_core_fetch_avatar( $args );
$expected = array_merge( explode( ' ', $args['class'] ), array( 'user-' . $u . '-avatar', 'avatar-' . $hw ) );
preg_match( '/class=["\']?([^"\']*)["\' ]/is', $avatar, $matches );
$classes = explode( ' ', $matches[1] );
$this->assertSame( $expected, array_intersect_key( $expected, $classes ) );
// Class attribute is an Array
$args['class'] = array( 'custom-class', 'class-custom' );
$avatar = bp_core_fetch_avatar( $args );
$expected = array_merge( $args['class'], array( 'user-' . $u . '-avatar', 'avatar-' . $hw ) );
preg_match( '/class=["\']?([^"\']*)["\' ]/is', $avatar, $matches );
$classes = explode( ' ', $matches[1] );
$this->assertSame( $expected, array_intersect_key( $expected, $classes ) );
}
/**
* @group bp_core_check_avatar_type
*/
public function test_bp_core_check_avatar_type() {
$plugin_dir = trailingslashit( buddypress()->plugin_dir );
$file = array(
'file' => array(
'name' => 'humans.txt',
'type' => 'text/plain',
'tmp_name' => $plugin_dir . 'humans.txt',
)
);
$this->assertFalse( bp_core_check_avatar_type( $file ) );
$file = array(
'file' => array(
'name' => 'mystery-man.jpg',
'type' => 'image/jpeg',
'tmp_name' => $plugin_dir . 'bp-core/images/mystery-man.jpg',
)
);
$this->assertTrue( bp_core_check_avatar_type( $file ) );
$file = array(
'file' => array(
'name' => 'mystery-man.jpg',
'type' => 'application/octet-stream',
'tmp_name' => $plugin_dir . 'bp-core/images/mystery-man.jpg',
)
);
$this->assertTrue( bp_core_check_avatar_type( $file ), 'flash is using application/octet-stream for image uploads' );
}
/**
* @group bp_core_check_avatar_type
* @group bp_core_get_allowed_avatar_types
*/
public function test_bp_core_get_allowed_avatar_types_filter() {
$allowed_image_types = $this->allowed_image_types;
add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
$this->assertEquals( $allowed_image_types, bp_core_get_allowed_avatar_types() );
remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
array_shift( $allowed_image_types );
$this->assertEquals( $allowed_image_types, bp_core_get_allowed_avatar_types() );
remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
add_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
$this->assertEquals( $this->allowed_image_types, bp_core_get_allowed_avatar_types() );
remove_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
}
/**
* @group bp_core_check_avatar_type
* @group bp_core_get_allowed_avatar_mimes
*/
public function test_bp_core_get_allowed_avatar_mimes() {
$mimes = bp_core_get_allowed_avatar_mimes();
$allowed_image_mimes = $this->allowed_image_mimes;
$this->assertEqualSets( $this->allowed_image_types, array_keys( $mimes ) );
$this->assertEqualSets( $allowed_image_mimes, array_values( $mimes ) );
add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
$this->assertEqualSets( $allowed_image_mimes, array_values( bp_core_get_allowed_avatar_mimes() ) );
remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
array_shift( $allowed_image_mimes );
$this->assertEqualSets( array_merge( $allowed_image_mimes, array( 'image/jpeg' ) ), array_values( bp_core_get_allowed_avatar_mimes() ) );
remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
add_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
$this->assertEqualSets( $this->allowed_image_mimes, array_values( bp_core_get_allowed_avatar_mimes() ) );
remove_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
}
public function avatar_types_filter_add_type( $types ) {
$types[] = 'bmp';
return $types;
}
public function avatar_types_filter_remove_type( $types ) {
$jpeg = array_shift( $types );
return $types;
}
/**
* @group BP7056
*/
public function test_no_grav_default_should_respect_thumb_type() {
$found = bp_core_fetch_avatar( array(
'item_id' => 12345,
'object' => 'user',
'type' => 'thumb',
'no_grav' => true,
'html' => false,
) );
$this->assertStringContainsString( 'mystery-man-50.jpg', $found );
}
/**
* @group BP7056
*/
public function test_no_grav_default_should_return_thumb_avatar_for_small_enough_width() {
$found = bp_core_fetch_avatar( array(
'item_id' => 12345,
'object' => 'user',
'type' => 'full',
'width' => '50',
'no_grav' => true,
'html' => false,
) );
$this->assertStringContainsString( 'mystery-man-50.jpg', $found );
}
/**
* @group BP7056
*/
public function test_no_grav_default_should_return_full_avatar_for_thumb_when_thumb_width_is_too_wide() {
add_filter( 'bp_core_avatar_thumb_width', array( $this, 'filter_thumb_width' ) );
$found = bp_core_fetch_avatar( array(
'item_id' => 12345,
'object' => 'user',
'type' => 'thumb',
'no_grav' => true,
'html' => false,
) );
remove_filter( 'bp_core_avatar_thumb_width', array( $this, 'filter_thumb_width' ) );
$this->assertStringContainsString( 'mystery-man.jpg', $found );
}
public function filter_thumb_width() {
return 51;
}
/**
* @group bp_core_delete_existing_avatar
*/
public function test_bp_core_delete_existing_avatar() {
$avatar_dir1 = bp_core_avatar_upload_path() . '/avatars/1';
$avatar_dir2 = bp_core_avatar_upload_path() . '/avatars/2';
wp_mkdir_p( $avatar_dir1 );
wp_mkdir_p( $avatar_dir2 );
copy( BP_TESTS_DIR . 'assets/upside-down.jpg', $avatar_dir1 . '/avatar-bpfull.jpg' );
copy( BP_TESTS_DIR . 'assets/upside-down.jpg', $avatar_dir1 . '/avatar-bpthumb.jpg' );
copy( BP_TESTS_DIR . 'assets/upside-down.jpg', $avatar_dir2 . '/avatar-bpfull.jpg' );
copy( BP_TESTS_DIR . 'assets/upside-down.jpg', $avatar_dir2 . '/avatar-bpthumb.jpg' );
$test = bp_core_delete_existing_avatar( array(
'item_id' => '2/../1',
'object' => 'user',
'avatar_dir' => false
) );
$this->assertTrue( is_dir( $avatar_dir1 ) );
$test2 = bp_core_delete_existing_avatar( array(
'item_id' => '2',
'object' => 'user',
'avatar_dir' => false
) );
$this->assertFalse( is_dir( $avatar_dir2 ) );
$test1 = bp_core_delete_existing_avatar( array(
'item_id' => 1.1,
'object' => 'user',
'avatar_dir' => false
) );
$this->assertTrue( is_dir( $avatar_dir1 ) );
$test1 = bp_core_delete_existing_avatar( array(
'item_id' => 1,
'object' => 'user',
'avatar_dir' => false
) );
$this->assertFalse( is_dir( $avatar_dir1 ) );
}
public function set_capture( $return, $data ) {
$this->capture = $data;
return false;
}
/**
* @group bp_avatar_handle_capture
*/
public function test_bp_avatar_handle_capture() {
$u = self::factory()->user->create();
$data = 'hello world';
add_filter( 'bp_core_pre_avatar_handle_crop', array( $this, 'set_capture' ), 10, 2 );
bp_avatar_handle_capture( $data, $u . '/../../../../../../foobar', 'array' );
remove_filter( 'bp_core_pre_avatar_handle_crop', array( $this, 'set_capture' ), 10, 2 );
$expected = '/avatars/' . $u . '/webcam-capture-' . $u . '.png';
$this->assertEquals( $expected, $this->capture['original_file'] );
}
}