<?php



/*

 * This file is part of the Monolog package.

 *

 * (c) Jordi Boggiano <j.boggiano@seld.be>

 *

 * For the full copyright and license information, please view the LICENSE

 * file that was distributed with this source code.

 */



namespace Monolog\Handler;



use Exception;

use Monolog\TestCase;

use Monolog\Logger;

use PHPUnit_Framework_MockObject_MockObject as MockObject;



/**

 * @author Erik Johansson <erik.pm.johansson@gmail.com>

 * @see    https://rollbar.com/docs/notifier/rollbar-php/

 *

 * @coversDefaultClass Monolog\Handler\RollbarHandler

 */

class RollbarHandlerTest extends TestCase

{

    /**

     * @var MockObject

     */

    private $rollbarNotifier;



    /**

     * @var array

     */

    public $reportedExceptionArguments = null;



    protected function setUp()

    {

        parent::setUp();



        $this->setupRollbarNotifierMock();

    }



    /**

     * When reporting exceptions to Rollbar the

     * level has to be set in the payload data

     */

    public function testExceptionLogLevel()

    {

        $handler = $this->createHandler();



        $handler->handle($this->createExceptionRecord(Logger::DEBUG));



        $this->assertEquals('debug', $this->reportedExceptionArguments['payload']['level']);

    }



    private function setupRollbarNotifierMock()

    {

        $this->rollbarNotifier = $this->getMockBuilder('RollbarNotifier')

            ->setMethods(array('report_message', 'report_exception', 'flush'))

            ->getMock();



        $that = $this;



        $this->rollbarNotifier

            ->expects($this->any())

            ->method('report_exception')

            ->willReturnCallback(function ($exception, $context, $payload) use ($that) {

                $that->reportedExceptionArguments = compact('exception', 'context', 'payload');

            });

    }



    private function createHandler()

    {

        return new RollbarHandler($this->rollbarNotifier, Logger::DEBUG);

    }



    private function createExceptionRecord($level = Logger::DEBUG, $message = 'test', $exception = null)

    {

        return $this->getRecord($level, $message, array(

            'exception' => $exception ?: new Exception()

        ));

    }

}

