TestLoggingUtil.php 2.92 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace tests\unit\Util;

use AspectMock\Test as AspectMock;
use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil;
use Magento\FunctionalTestingFramework\Util\Logger\MftfLogger;
use Monolog\Handler\TestHandler;
use Monolog\Logger;
use PHPUnit\Framework\Assert;

class TestLoggingUtil extends Assert
{
    /**
     * @var TestLoggingUtil
     */
    private static $instance;

    /**
     * @var TestHandler
     */
    private $testLogHandler;

    /**
     * TestLoggingUtil constructor.
     */
    private function __construct()
    {
        // private constructor
    }

    /**
     * Static singleton get function
     *
     * @return TestLoggingUtil
     */
    public static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new TestLoggingUtil();
        }

        return self::$instance;
    }

    /**
     * Function which sets a mock instance of the logger for testing purposes.
     *
     * @return void
     */
    public function setMockLoggingUtil()
    {
        $this->testLogHandler = new TestHandler();
        $testLogger = new MftfLogger('testLogger');
        $testLogger->pushHandler($this->testLogHandler);
        $mockLoggingUtil = AspectMock::double(
            LoggingUtil::class,
            ['getLogger' => $testLogger]
        )->make();
        $property = new \ReflectionProperty(LoggingUtil::class, 'instance');
        $property->setAccessible(true);
        $property->setValue($mockLoggingUtil);
    }

    /**
     * Function which validates messages have been logged as intended during test execution.
     *
     * @param string $type
     * @param string $message
     * @param array $context
     * @return void
     */
    public function validateMockLogStatement($type, $message, $context)
    {
        $records = $this->testLogHandler->getRecords();
        $record = $records[count($records)-1]; // we assume the latest record is what requires validation
        $this->assertEquals(strtoupper($type), $record['level_name']);
        $this->assertEquals($message, $record['message']);
        $this->assertEquals($context, $record['context']);
    }

    public function validateMockLogStatmentRegex($type, $regex, $context)
    {
        $records = $this->testLogHandler->getRecords();
        $record = $records[count($records)-1]; // we assume the latest record is what requires validation
        $this->assertEquals(strtoupper($type), $record['level_name']);
        $this->assertRegExp($regex, $record['message']);
        $this->assertEquals($context, $record['context']);
    }

    /**
     * Function which clears the test logger context from the LogginUtil class. Should be run after a test class has
     * executed.
     *
     * @return void
     */
    public function clearMockLoggingUtil()
    {
        AspectMock::clean(LoggingUtil::class);
    }
}