Skip to content

Commit

Permalink
Fix formatting messages to EmailTarget::export() (#18)
Browse files Browse the repository at this point in the history
* Fix formatting messages to EmailTarget::export()
* Remove use LogLevel
* Change throwing exceptions to native ones
  • Loading branch information
devanych committed Nov 29, 2020
1 parent 3a05146 commit f4b675d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 36 deletions.
17 changes: 9 additions & 8 deletions src/EmailTarget.php
Expand Up @@ -4,7 +4,8 @@

namespace Yiisoft\Log\Target\Email;

use Yiisoft\Log\LogRuntimeException;
use InvalidArgumentException;
use RuntimeException;
use Yiisoft\Log\Target;
use Yiisoft\Mailer\MailerInterface;
use Yiisoft\Mailer\MessageInterface;
Expand Down Expand Up @@ -54,7 +55,7 @@ class EmailTarget extends Target
* @param \Yiisoft\Mailer\MailerInterface $mailer
* @param array $message
*
* @throws \InvalidArgumentException
* @throws InvalidArgumentException
*/
public function __construct(MailerInterface $mailer, array $message)
{
Expand All @@ -63,15 +64,15 @@ public function __construct(MailerInterface $mailer, array $message)
parent::__construct();

if (empty($this->message['to'])) {
throw new \InvalidArgumentException('The "to" option must be set for EmailTarget::message.');
throw new InvalidArgumentException('The "to" option must be set for EmailTarget::message.');
}
}

/**
* Sends log messages to specified email addresses.
* Starting from version 2.0.14, this method throws LogRuntimeException in case the log can not be exported.
* Starting from version 2.0.14, this method throws RuntimeException in case the log can not be exported.
*
* @throws \Yiisoft\Log\LogRuntimeException
* @throws RuntimeException
*/
public function export(): void
{
Expand All @@ -80,14 +81,14 @@ public function export(): void
if (empty($this->message['subject'])) {
$this->message['subject'] = 'Application Log';
}
$messages = array_map([$this, 'formatMessage'], $this->getMessages());
$body = wordwrap(implode("\n", $messages), 70);

$body = wordwrap($this->formatMessages("\n"), 70);
$message = $this->composeMessage($body);

try {
$message->setMailer($this->mailer)->send();
} catch (\Throwable $e) {
throw new LogRuntimeException('Unable to export log through email!');
throw new RuntimeException('Unable to export log through email!');
}
}

Expand Down
59 changes: 31 additions & 28 deletions tests/EmailTargetTest.php
Expand Up @@ -5,7 +5,7 @@
namespace Yiisoft\Log\Target\Email\Tests;

use PHPUnit\Framework\TestCase;
use Yiisoft\Log\LogRuntimeException;
use RuntimeException;
use Yiisoft\Log\Target\Email\EmailTarget;
use Yiisoft\Mailer\BaseMailer;
use Yiisoft\Mailer\BaseMessage;
Expand Down Expand Up @@ -58,10 +58,10 @@ public function testConstructWithoutOptionTo(): void
*/
public function testExportWithSubject()
{
$message1 = ['A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 1'];
$message2 = ['A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 2'];
$message1 = ['info', 'A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 1', []];
$message2 = ['info', 'A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 2', []];
$messages = [$message1, $message2];
$textBody = wordwrap(implode("\n", [$message1[0], $message2[0]]), 70);
$textBody = wordwrap(implode("\n", [$message1[1], $message2[1]]), 70);

$message = $this->getMockBuilder(BaseMessage::class)
->setMethods(['setTextBody', 'setMailer', 'send', 'setSubject'])
Expand All @@ -74,7 +74,7 @@ public function testExportWithSubject()
$message->expects($this->once())->method('setSubject')->with($this->equalTo('Hello world'));

$mailTarget = $this->getMockBuilder(EmailTarget::class)
->setMethods(['formatMessage'])
->setMethods(['formatMessages'])
->setConstructorArgs([
'mailer' => $this->mailer,
'message' => [
Expand All @@ -84,14 +84,15 @@ public function testExportWithSubject()
])
->getMock();

$mailTarget->setMessages($messages);
$mailTarget->expects($this->exactly(2))->method('formatMessage')->willReturnMap(
[
[$message1, $message1[0]],
[$message2, $message2[0]],
]
);
$mailTarget->export();
$mailTarget
->expects($this->once())
->method('formatMessages')
->willReturn(
"A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\nmessage 1\n"
. "A very\nlooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\nmessage 2"
)
;
$mailTarget->collect($messages, true);
}

/**
Expand All @@ -100,10 +101,11 @@ public function testExportWithSubject()
*/
public function testExportWithoutSubject(): void
{
$message1 = ['A veeeeery loooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 3'];
$message2 = ['Message 4'];
$message1 = ['info', 'A veeeeery loooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 3', []];
$message2 = ['info', 'Message 4', []];

$messages = [$message1, $message2];
$textBody = wordwrap(implode("\n", [$message1[0], $message2[0]]), 70);
$textBody = wordwrap(implode("\n", [$message1[1], $message2[1]]), 70);

$message = $this->getMockBuilder(BaseMessage::class)
->setMethods(['setTextBody', 'setMailer', 'send', 'setSubject'])
Expand All @@ -116,7 +118,7 @@ public function testExportWithoutSubject(): void
$message->expects($this->once())->method('setSubject')->with($this->equalTo('Application Log'));

$mailTarget = $this->getMockBuilder(EmailTarget::class)
->setMethods(['formatMessage'])
->setMethods(['formatMessages'])
->setConstructorArgs([
'mailer' => $this->mailer,
'message' => [
Expand All @@ -125,14 +127,15 @@ public function testExportWithoutSubject(): void
])
->getMock();

$mailTarget->setMessages($messages);
$mailTarget->expects($this->exactly(2))->method('formatMessage')->willReturnMap(
[
[$message1, $message1[0]],
[$message2, $message2[0]],
]
);
$mailTarget->export();
$mailTarget
->expects($this->once())
->method('formatMessages')
->willReturn(
"A veeeeery loooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 3\n"
. "Message 4"
)
;
$mailTarget->collect($messages, true);
}

/**
Expand All @@ -145,18 +148,18 @@ public function testExportWithSendFailure(): void
$message = $this->getMockBuilder(BaseMessage::class)
->setMethods(['send'])
->getMockForAbstractClass();
$message->method('send')->willThrowException(new LogRuntimeException());
$message->method('send')->willThrowException(new RuntimeException());
$this->mailer->expects($this->once())->method('compose')->willReturn($message);
$mailTarget = $this->getMockBuilder(EmailTarget::class)
->setMethods(['formatMessage'])
->setMethods(['formatMessages'])
->setConstructorArgs([
'mailer' => $this->mailer,
'message' => [
'to' => 'developer@example.com',
],
])
->getMock();
$this->expectException(LogRuntimeException::class);
$this->expectException(RuntimeException::class);
$mailTarget->export();
}
}

0 comments on commit f4b675d

Please sign in to comment.