1
0
Fork 0
mirror of https://github.com/buddypress/buddypress.git synced 2026-07-23 21:06:56 +08:00
buddypress/tests/phpunit/testcases/core/class-bp-email.php
Mathieu Viet 89a6666dc6 Fully enjoy Yoast’s PHPUnit polyfills
Using these polyfills let us use PHPUnit v9.x for our tests and add PHP 8.1 to our testing matrix. Some additional edits to our PHP unit tests suite were needed:

- Stop using PHPunit deprecated functions.
- Rename some `BP_UnitTestCase` methods to use Yoast's polyfills.
- Edit the PHP Unit test GH action and also run this action on pull requests.
- Update some composer dependencies, remove the one about `phpunit/phpunit:^7.5` and add a new composer script to use PHPUnit v9.x. 

Props renatonascalves, rafiahmedd

Closes https://github.com/buddypress/buddypress/pull/13
Fixes #8649


git-svn-id: https://buddypress.svn.wordpress.org/trunk@13314 cdf35c40-ae34-48e0-9cc9-0c9da1808c22
2022-08-13 08:58:51 +00:00

299 lines
9.9 KiB
PHP

<?php
/**
* @group core
* @group BP_Email
*/
class BP_Tests_Email extends BP_UnitTestCase_Emails {
protected $u1;
protected $u2;
public function set_up() {
parent::set_up();
$this->u1 = self::factory()->user->create( array(
'display_name' => 'Unit Test',
'user_email' => 'test1@example.com',
) );
$this->u2 = self::factory()->user->create( array(
'display_name' => 'Unit Test2',
'user_email' => 'test2@example.com',
) );
}
public function test_valid_subject() {
$message = 'test';
$email = new BP_Email( 'activity-at-message' );
$email->set_subject( $message )->set_tokens( array( 'poster.name' => 'example' ) );
$this->assertSame( $message, $email->get_subject() );
}
public function test_valid_html_content() {
$message = '<b>test</b>';
$email = new BP_Email( 'activity-at-message' );
$email->set_content_html( $message );
$email->set_content_type( 'html' );
$this->assertSame( $message, $email->get_content() );
}
public function test_valid_plaintext_content() {
$message = 'test';
$email = new BP_Email( 'activity-at-message' );
$email->set_content_plaintext( $message );
$email->set_content_type( 'plaintext' );
$this->assertSame( $message, $email->get_content() );
}
public function test_valid_template() {
$message = 'test';
$email = new BP_Email( 'activity-at-message' );
$email->set_template( $message );
$this->assertSame( $message, $email->get_template() );
}
public function test_tokens() {
$email = new BP_Email( 'activity-at-message' );
$default_tokens = $email->get_tokens();
$tokens = array( 'test1' => 'hello', 'test2' => 'world' );
$email->set_tokens( $tokens );
$this->assertSame(
array_keys( $tokens + $default_tokens ),
array_keys( $email->get_tokens() )
);
$this->assertSame(
array_values( $tokens + $default_tokens ),
array_values( $email->get_tokens() )
);
}
public function test_headers() {
$email = new BP_Email( 'activity-at-message' );
$default_headers = $email->get_headers();
$headers = array( 'custom_header' => 'custom_value' );
$email->set_headers( $headers );
$this->assertSame( $headers + $default_headers, $email->get_headers() );
}
public function test_validation() {
$email = new BP_Email( 'activity-at-message' );
$email->set_from( 'test1@example.com' )->set_to( 'test2@example.com' )->set_subject( 'testing' );
$email->set_content_html( 'testing' )->set_tokens( array( 'poster.name' => 'example' ) );
$this->assertTrue( $email->validate() );
}
public function test_invalid_characters_are_stripped_from_tokens() {
$email = new BP_Email( 'activity-at-message' );
$default_tokens = $email->get_tokens();
$email->set_tokens( array( 'te{st}1' => 'hello world' ) );
$this->assertSame(
array_keys( array( 'test1' => 'hello world' ) + $default_tokens ),
array_keys( $email->get_tokens() )
);
}
public function test_token_are_escaped() {
$token = '<blink>';
$email = new BP_Email( 'activity-at-message' );
$email->set_content_html( '{{test}}' )->set_tokens( array( 'test' => $token ) );
$this->assertSame(
esc_html( $token ),
$email->get_content( 'replace-tokens' )
);
}
public function test_token_are_not_escaped() {
$token = '<blink>';
$email = new BP_Email( 'activity-at-message' );
$email->set_content_html( '{{{test}}}' )->set_tokens( array( 'test' => $token ) );
$this->assertSame(
$token,
$email->get_content( 'replace-tokens' )
);
}
public function test_invalid_headers() {
$email = new BP_Email( 'activity-at-message' );
$default_headers = $email->get_headers();
$headers = array( 'custom:header' => 'custom:value' );
$email->set_headers( $headers );
$this->assertNotSame( $headers + $default_headers, $email->get( 'headers' ) );
$this->assertSame( array( 'customheader' => 'customvalue' ) + $default_headers, $email->get( 'headers' ) );
}
public function test_validation_with_missing_required_data() {
$email = new BP_Email( 'activity-at-message' );
$email->set_from( 'test1@example.com' )->set_to( 'test2@example.com' )->set_subject( 'testing' ); // Content
$email->set_tokens( array( 'poster.name' => 'example' ) );
$result = $email->validate();
$this->assertTrue( is_wp_error( $result ) );
$this->assertSame( 'missing_parameter', $result->get_error_code() );
}
public function test_validation_with_missing_template() {
$email = new BP_Email( 'activity-at-message' );
$email->set_from( 'test1@example.com' )->set_to( 'test2@example.com' )->set_subject( 'testing' );
$email->set_content_html( 'testing' )->set_tokens( array( 'poster.name' => 'example' ) )->set_template( '' );
$result = $email->validate();
// Template has a default value, but it can't be blank.
$this->assertTrue( is_wp_error( $result ) );
$this->assertSame( 'missing_parameter', $result->get_error_code() );
}
public function test_invalid_tags_should_be_removed_from_html_content() {
$message = '<b>hello world</b><iframe src="https://example.com"></iframe><b>hello world</b>';
$email = new BP_Email( 'activity-at-message' );
$email->set_content_html( $message );
$email->set_content_type( 'html' );
$this->assertSame( '<b>hello world</b><b>hello world</b>', $email->get_content() );
}
public function test_multiple_recipients_are_supported_by_address() {
$email1 = 'test1@example.com';
$email2 = 'test2@example.com';
$email = new BP_Email( 'activity-at-message' );
$email->set_to( array( $email1, $email2 ) );
$addresses = $email->get_to();
$this->assertCount( 2, $addresses );
$this->assertSame( $email1, $addresses[0]->get_address() );
$this->assertSame( $email2, $addresses[1]->get_address() );
}
public function test_multiple_recipients_are_supported_by_wp_user_object() {
$user1 = get_user_by( 'id', $this->u1 );
$user2 = get_user_by( 'id', $this->u2 );
$email = new BP_Email( 'activity-at-message' );
$email->set_to( array( $user1, $user2 ) );
$addresses = $email->get_to();
$this->assertCount( 2, $addresses );
$this->assertSame( $user1->user_email, $addresses[0]->get_address() );
$this->assertSame( $user2->user_email, $addresses[1]->get_address() );
}
public function test_multiple_recipients_are_supported_by_wp_user_id() {
$user1 = get_user_by( 'id', $this->u1 );
$user2 = get_user_by( 'id', $this->u2 );
$email = new BP_Email( 'activity-at-message' );
$email->set_to( array( $this->u1, $this->u2 ) );
$addresses = $email->get_to();
$this->assertCount( 2, $addresses );
$this->assertSame( $user1->user_email, $addresses[0]->get_address() );
$this->assertSame( $user2->user_email, $addresses[1]->get_address() );
}
public function test_multiple_recipients_are_supported() {
$user1 = get_user_by( 'id', $this->u1 );
$user2 = get_user_by( 'id', $this->u2 );
$user3 = 'test3@example.com';
$email = new BP_Email( 'activity-at-message' );
$email->set_to( array( $user1, $this->u2, $user3 ) );
$addresses = $email->get_to();
$this->assertCount( 3, $addresses );
$this->assertSame( $user1->user_email, $addresses[0]->get_address() );
$this->assertSame( $user2->user_email, $addresses[1]->get_address() );
$this->assertSame( $user3, $addresses[2]->get_address() );
}
public function test_replacing_existing_recipients_with_new_recipients() {
$email = new BP_Email( 'activity-at-message' );
$original_recipient = 'test1@example.com';
$new_recipient = 'test2@example.com';
$email->set_to( $original_recipient );
$addresses = $email->get_to();
$this->assertSame( $original_recipient, $addresses[0]->get_address() );
$email->set_to( $new_recipient );
$addresses = $email->get_to();
$this->assertSame( $new_recipient, $addresses[0]->get_address() );
}
public function test_appending_new_recipients_to_existing_recipients() {
$email = new BP_Email( 'activity-at-message' );
$original_recipient = 'test1@example.com';
$new_recipient = 'test2@example.com';
$email->set_to( $original_recipient );
$addresses = $email->get_to();
$this->assertSame( $original_recipient, $addresses[0]->get_address() );
$email->set_to( $new_recipient, '', 'add' );
$addresses = $email->get_to();
$this->assertSame( $original_recipient, $addresses[0]->get_address() );
$this->assertSame( $new_recipient, $addresses[1]->get_address() );
}
public function test_sending_email() {
require_once( BP_PLUGIN_DIR . '/bp-core/admin/bp-core-admin-schema.php' );
bp_core_install_emails();
$user1 = get_user_by( 'id', $this->u1 );
$result = bp_send_email( 'activity-comment', $this->u1, array(
'tokens' => array(
'comment.id' => 123,
'commenter.id' => $this->u2,
'usermessage' => 'hello world',
'original_activity.user_id' => $this->u1,
'poster.name' => 'name',
'thread.url' => 'http://example.com',
'unsubscribe' => 'http://example.com',
),
) );
$this->assertTrue( $result );
}
public function test_html_entities_are_decoded_in_email_subject() {
// Emulate custom post title for an email post type.
$subject = "It's pretty <new & magical.";
$email = new BP_Email( 'activity-at-message' );
$email->set_subject( $subject )->set_tokens( array( 'poster.name' => 'blah' ) );
// Subject always has to have tokens replaced before sending.
$this->assertSame( $subject, $email->get_subject( 'replace-tokens' ) );
}
public function test_html_entities_are_decoded_in_email_recipient_names() {
// Raw display name.
$name = "Test o'Toole";
// Emulate rendered {poster.name} token.
$token = apply_filters( 'bp_core_get_user_displayname', $name );
$email = new BP_Email( 'activity-at-message' );
$email->set_subject( '{{poster.name}}' )->set_tokens( array( 'poster.name' => $token ) );
// Subject always has to have tokens replaced before sending.
$this->assertSame( $name, $email->get_subject( 'replace-tokens' ) );
}
}