174 lines
5.4 KiB
PHP
174 lines
5.4 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Class WC_Settings_Emails_Test file.
|
||
|
*
|
||
|
* @package WooCommerce\Tests\Settings
|
||
|
*/
|
||
|
|
||
|
use Automattic\WooCommerce\Testing\Tools\CodeHacking\Hacks\FunctionsMockerHack;
|
||
|
use Automattic\WooCommerce\Testing\Tools\CodeHacking\Hacks\StaticMockerHack;
|
||
|
|
||
|
require_once __DIR__ . '/class-wc-settings-unit-test-case.php';
|
||
|
|
||
|
/**
|
||
|
* Unit tests for the WC_Settings_Email class.
|
||
|
*/
|
||
|
class WC_Settings_Emails_Test extends WC_Settings_Unit_Test_Case {
|
||
|
|
||
|
/**
|
||
|
* @testdox get_sections should get all the existing sections.
|
||
|
*/
|
||
|
public function test_get_sections() {
|
||
|
$sut = new WC_Settings_Emails();
|
||
|
|
||
|
$section_names = array_keys( $sut->get_sections() );
|
||
|
|
||
|
$expected = array(
|
||
|
'',
|
||
|
);
|
||
|
|
||
|
$this->assertEquals( $expected, $section_names );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get_settings should trigger the appropriate filter depending on the requested section name.
|
||
|
*
|
||
|
* @testWith ["", "woocommerce_email_settings"]
|
||
|
*
|
||
|
* @param string $section_name The section name to test getting the settings for.
|
||
|
* @param string $filter_name The name of the filter that is expected to be triggered.
|
||
|
*/
|
||
|
public function test_get_settings_triggers_filter( $section_name, $filter_name ) {
|
||
|
$actual_settings_via_filter = null;
|
||
|
|
||
|
add_filter(
|
||
|
$filter_name,
|
||
|
function ( $settings ) use ( &$actual_settings_via_filter ) {
|
||
|
$actual_settings_via_filter = $settings;
|
||
|
|
||
|
return $settings;
|
||
|
},
|
||
|
10,
|
||
|
1
|
||
|
);
|
||
|
|
||
|
$sut = new WC_Settings_Emails();
|
||
|
|
||
|
$actual_settings_returned = $sut->get_settings( $section_name );
|
||
|
remove_all_filters( $filter_name );
|
||
|
|
||
|
$this->assertSame( $actual_settings_returned, $actual_settings_via_filter );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @testdox get_settings('') should return all the settings for the default section.
|
||
|
*/
|
||
|
public function test_get_default_settings_returns_all_settings() {
|
||
|
$sut = new WC_Settings_Emails();
|
||
|
|
||
|
$settings = $sut->get_settings( '' );
|
||
|
$settings_ids_and_types = $this->get_ids_and_types( $settings );
|
||
|
|
||
|
$expected = array(
|
||
|
'email_notification_settings' => array( 'title', 'sectionend' ),
|
||
|
'' => 'email_notification',
|
||
|
'email_recipient_options' => 'sectionend',
|
||
|
'email_options' => array( 'title', 'sectionend' ),
|
||
|
'woocommerce_email_from_name' => 'text',
|
||
|
'woocommerce_email_from_address' => 'email',
|
||
|
'email_template_options' => array( 'title', 'sectionend' ),
|
||
|
'woocommerce_email_header_image' => 'text',
|
||
|
'woocommerce_email_footer_text' => 'textarea',
|
||
|
'woocommerce_email_base_color' => 'color',
|
||
|
'woocommerce_email_background_color' => 'color',
|
||
|
'woocommerce_email_body_background_color' => 'color',
|
||
|
'woocommerce_email_text_color' => 'color',
|
||
|
);
|
||
|
|
||
|
$this->assertEquals( $expected, $settings_ids_and_types );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @testDox When the current section is the name of an existing email, 'output' invokes that email's 'admin_options' method.
|
||
|
*/
|
||
|
public function test_output_is_done_via_admin_options_method_of_email_specified_as_settings_section() {
|
||
|
global $current_section;
|
||
|
$current_section = 'wc_email_new_order';
|
||
|
|
||
|
$admin_options_invoked = false;
|
||
|
$actual_email = null;
|
||
|
|
||
|
$sut = $this->getMockBuilder( WC_Settings_Emails::class )
|
||
|
->setMethods( array( 'run_email_admin_options' ) )
|
||
|
->getMock();
|
||
|
|
||
|
$sut->method( 'run_email_admin_options' )
|
||
|
->will(
|
||
|
$this->returnCallback(
|
||
|
function( $email ) use ( &$admin_options_invoked, &$actual_email ) {
|
||
|
$admin_options_invoked = true;
|
||
|
$actual_email = $email;
|
||
|
}
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$sut->output();
|
||
|
|
||
|
$this->assertTrue( $admin_options_invoked );
|
||
|
$this->assertInstanceOf( WC_Email_New_Order::class, $actual_email );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @testDox 'save' will trigger 'save_settings_for_current_section_invoked', and the appropriate actions.
|
||
|
*
|
||
|
* @testWith ["wc_email_new_order", false]
|
||
|
* ["", true]
|
||
|
*
|
||
|
* @param string $section_name The current section name.
|
||
|
* @param bool $expect_save_settings_for_current_section Whether 'save_settings_for_current_section' is expected to be invoked or not.
|
||
|
*/
|
||
|
public function test_save_triggers_appropriate_methods_and_actions( $section_name, $expect_save_settings_for_current_section ) {
|
||
|
global $current_section;
|
||
|
$current_section = $section_name;
|
||
|
|
||
|
$save_settings_for_current_section_invoked = false;
|
||
|
|
||
|
$email = WC_Emails::instance()->get_emails()[ WC_Email_New_Order::class ];
|
||
|
|
||
|
$emails = $this->getMockBuilder( WC_Emails::class )
|
||
|
->setMethods( array( 'get_emails' ) )
|
||
|
->getMock();
|
||
|
|
||
|
$emails->method( 'get_emails' )
|
||
|
->willReturn( array( WC_Email_New_Order::class => $email ) );
|
||
|
|
||
|
StaticMockerHack::add_method_mocks(
|
||
|
array(
|
||
|
'WC_Emails' => array(
|
||
|
'instance' => function() use ( $emails ) {
|
||
|
return $emails;
|
||
|
},
|
||
|
),
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$sut = $this->getMockBuilder( WC_Settings_Emails::class )
|
||
|
->setMethods( array( 'save_settings_for_current_section' ) )
|
||
|
->getMock();
|
||
|
|
||
|
$sut->method( 'save_settings_for_current_section' )
|
||
|
->will(
|
||
|
$this->returnCallback(
|
||
|
function() use ( &$save_settings_for_current_section_invoked ) {
|
||
|
$save_settings_for_current_section_invoked = true;
|
||
|
}
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$sut->save();
|
||
|
|
||
|
$this->assertEquals( $expect_save_settings_for_current_section, $save_settings_for_current_section_invoked );
|
||
|
$this->assertEquals( '' === $section_name ? 0 : 1, did_action( 'woocommerce_update_options_email_new_order' ) );
|
||
|
}
|
||
|
}
|