286 lines
8.9 KiB
PHP
286 lines
8.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* PHPMailer - PHP email transport unit tests.
|
|
* PHP version 5.5.
|
|
*
|
|
* @author Marcus Bointon <phpmailer@synchromedia.co.uk>
|
|
* @author Andy Prevost
|
|
* @copyright 2012 - 2020 Marcus Bointon
|
|
* @copyright 2004 - 2009 Andy Prevost
|
|
* @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
|
|
*/
|
|
|
|
namespace PHPMailer\Test\PHPMailer;
|
|
|
|
use PHPMailer\PHPMailer\Exception;
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\Test\TestCase;
|
|
|
|
/**
|
|
* Test custom header functionality.
|
|
*/
|
|
final class CustomHeaderTest extends TestCase
|
|
{
|
|
/**
|
|
* Tests setting and getting custom headers.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::addCustomHeader
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::getCustomHeaders
|
|
*
|
|
* @dataProvider dataAddAndGetCustomHeader
|
|
*
|
|
* @param array $headers Array of headers to set.
|
|
* @param array|null $expected Optional. The expected set headers.
|
|
* Only needs to be passed if different from the $headers array.
|
|
*/
|
|
public function testAddAndGetCustomHeader($headers, $expected = null)
|
|
{
|
|
if (isset($expected) === false) {
|
|
$expected = $headers;
|
|
}
|
|
|
|
// Test setting the custom header(s).
|
|
foreach ($headers as $header) {
|
|
if (isset($header[1])) {
|
|
$set = $this->Mail->addCustomHeader($header[0], $header[1]);
|
|
} else {
|
|
$set = $this->Mail->addCustomHeader($header[0]);
|
|
}
|
|
|
|
self::assertTrue($set, 'Custom header failed to set for ' . var_export($header, true));
|
|
}
|
|
|
|
// Test retrieving the custom header(s) and verify they have been correctly set.
|
|
self::assertSame(
|
|
$expected,
|
|
$this->Mail->getCustomHeaders(),
|
|
'Custom headers retrieved not the same as expected'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Data provider.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function dataAddAndGetCustomHeader()
|
|
{
|
|
return [
|
|
'Single custom header' => [
|
|
'headers' => [
|
|
['foo', 'bar'],
|
|
],
|
|
],
|
|
'Multiple custom headers' => [
|
|
'headers' => [
|
|
['foo', 'bar'],
|
|
['foo', 'baz'],
|
|
],
|
|
],
|
|
'Custom header: only name, no colon' => [
|
|
'headers' => [
|
|
['yux'],
|
|
],
|
|
'expected' => [
|
|
['yux', ''],
|
|
],
|
|
],
|
|
'Custom header: whitespace around name and value' => [
|
|
'headers' => [
|
|
[' name ', ' value '],
|
|
],
|
|
'expected' => [
|
|
['name', 'value'],
|
|
],
|
|
],
|
|
'Custom headers: "name: value" sets' => [
|
|
'headers' => [
|
|
['Content-Type: application/json'],
|
|
['SomeHeader: Some Value'],
|
|
],
|
|
'expected' => [
|
|
['Content-Type', 'application/json'],
|
|
['SomeHeader', 'Some Value'],
|
|
],
|
|
],
|
|
'Custom headers: "name:value" sets, no space and lots of space' => [
|
|
'headers' => [
|
|
['Content-Type:application/json'],
|
|
['SomeHeader : Some Value'],
|
|
],
|
|
'expected' => [
|
|
['Content-Type', 'application/json'],
|
|
['SomeHeader', 'Some Value'],
|
|
],
|
|
],
|
|
'Custom headers: "name: value" set with a colon in the value' => [
|
|
'headers' => [
|
|
['name: value:value'],
|
|
],
|
|
'expected' => [
|
|
['name', 'value:value'],
|
|
],
|
|
],
|
|
'Custom headers: "name: value" set without a value' => [
|
|
'headers' => [
|
|
['name:'],
|
|
],
|
|
'expected' => [
|
|
['name', ''],
|
|
],
|
|
],
|
|
'Custom header: "name: value" set with whitespace around name and value' => [
|
|
'headers' => [
|
|
[' name : value '],
|
|
],
|
|
'expected' => [
|
|
['name', 'value'],
|
|
],
|
|
],
|
|
'Custom headers: duplicate headers' => [
|
|
'headers' => [
|
|
['SomeHeader: Some Value'],
|
|
['SomeHeader', 'Some Value']
|
|
],
|
|
'expected' => [
|
|
['SomeHeader', 'Some Value'],
|
|
['SomeHeader', 'Some Value'],
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Tests failing to set custom headers when the header info provided does not validate.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::addCustomHeader
|
|
* @dataProvider dataAddCustomHeaderInvalid
|
|
*
|
|
* @param string $name Custom header name.
|
|
* @param mixed $value Optional. Custom header value.
|
|
*/
|
|
public function testAddCustomHeaderInvalid($name, $value = null)
|
|
{
|
|
self::assertFalse($this->Mail->addCustomHeader($name, $value));
|
|
}
|
|
|
|
/**
|
|
* Data provider.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function dataAddCustomHeaderInvalid()
|
|
{
|
|
return [
|
|
'Invalid: new line in value' => [
|
|
'name' => 'SomeHeader',
|
|
'value' => "Some\n Value",
|
|
],
|
|
'Invalid: new line in name' => [
|
|
'name' => "Some\nHeader",
|
|
'value' => 'Some Value',
|
|
],
|
|
'Invalid: empty name' => [
|
|
'name' => ' ',
|
|
],
|
|
'Invalid: empty name and empty value' => [
|
|
'name' => ' : ',
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test removing previously set custom header.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::clearCustomHeader
|
|
*/
|
|
public function testClearCustomHeader()
|
|
{
|
|
// make sure 'foo' is cleared, even if there is more than one header set.
|
|
$this->Mail->addCustomHeader('foo', 'bar');
|
|
$this->Mail->addCustomHeader('foo', 'baz');
|
|
self::assertSame([['foo', 'bar'], ['foo', 'baz']], $this->Mail->getCustomHeaders());
|
|
|
|
$this->Mail->clearCustomHeader('foo');
|
|
|
|
$cleared = $this->Mail->getCustomHeaders();
|
|
self::assertIsArray($cleared);
|
|
self::assertEmpty($cleared);
|
|
}
|
|
|
|
/**
|
|
* Test removing previously set custom header value.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::clearCustomHeader
|
|
*/
|
|
public function testClearCustomHeaderValue()
|
|
{
|
|
// Test clearing 'name', 'value'
|
|
$this->Mail->addCustomHeader('foo', 'bar');
|
|
$this->Mail->addCustomHeader('foo', 'baz');
|
|
self::assertSame([['foo', 'bar'], ['foo', 'baz']], $this->Mail->getCustomHeaders());
|
|
|
|
$this->Mail->clearCustomHeader('foo', 'bar');
|
|
self::assertSame([['foo', 'baz']], array_values($this->Mail->getCustomHeaders()));
|
|
|
|
// Test clearing 'name: value'
|
|
$this->Mail->addCustomHeader('foo', 'bar');
|
|
self::assertSame([['foo', 'baz'], ['foo', 'bar']], array_values($this->Mail->getCustomHeaders()));
|
|
|
|
$this->Mail->clearCustomHeader('foo: bar');
|
|
self::assertSame([['foo', 'baz']], array_values($this->Mail->getCustomHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Test removing previously set custom headers.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::clearCustomHeaders
|
|
*/
|
|
public function testClearCustomHeaders()
|
|
{
|
|
$this->Mail->addCustomHeader('foo', 'bar');
|
|
self::assertSame([['foo', 'bar']], $this->Mail->getCustomHeaders());
|
|
|
|
$this->Mail->clearCustomHeaders();
|
|
|
|
$cleared = $this->Mail->getCustomHeaders();
|
|
self::assertIsArray($cleared);
|
|
self::assertEmpty($cleared);
|
|
}
|
|
|
|
/**
|
|
* Check whether setting a bad custom header throws exceptions.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::addCustomHeader
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
public function testInvalidHeaderException()
|
|
{
|
|
$this->expectException(Exception::class);
|
|
$this->expectExceptionMessage('Invalid header name or value');
|
|
|
|
$mail = new PHPMailer(true);
|
|
$mail->addCustomHeader('SomeHeader', "Some\n Value");
|
|
}
|
|
|
|
/**
|
|
* Test replacing a previously set custom header.
|
|
*
|
|
* @covers \PHPMailer\PHPMailer\PHPMailer::replaceCustomHeader
|
|
*/
|
|
public function testReplaceCustomHeader()
|
|
{
|
|
$this->Mail->addCustomHeader('foo', 'bar');
|
|
$this->Mail->replaceCustomHeader('foo', 'baz');
|
|
|
|
// Test retrieving the custom header(s) and verify the updated value is seet.
|
|
self::assertSame(
|
|
[['foo', 'baz']],
|
|
$this->Mail->getCustomHeaders(),
|
|
'Custom header does not contain expected update'
|
|
);
|
|
}
|
|
}
|