![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/framework/App/Test/Unit/PageCache/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Framework\App\Test\Unit\PageCache; use Laminas\Http\Header\CacheControl; use Laminas\Http\Headers; use Magento\Framework\App\Http\Context; use Magento\Framework\App\Http\ContextFactory; use Magento\Framework\App\PageCache\Cache; use Magento\Framework\App\PageCache\Identifier; use Magento\Framework\App\PageCache\Kernel; use Magento\Framework\App\Request\Http; use Magento\Framework\App\Response\HttpFactory; use Magento\Framework\Serialize\SerializerInterface; use Magento\PageCache\Model\Cache\Type; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class KernelTest extends TestCase { /** * @var Kernel */ protected $kernel; /** * @var Cache|MockObject */ protected $cacheMock; /** * @var Identifier|MockObject */ protected $identifierMock; /** * @var Http|MockObject */ protected $requestMock; /** * @var \Magento\Framework\App\Response\Http|MockObject */ protected $responseMock; /** * @var MockObject|Type */ private $fullPageCacheMock; /** * @var \Magento\Framework\App\Response\Http|MockObject */ private $httpResponseMock; /** * @var ContextFactory|MockObject */ private $contextFactoryMock; /** * @var HttpFactory|MockObject */ private $httpFactoryMock; /** * @var SerializerInterface|MockObject */ private $serializer; /** * @var Context|MockObject */ private $contextMock; /** * @inheritDoc */ protected function setUp(): void { $headersMock = $this->createMock(Headers::class); $this->cacheMock = $this->createMock(Cache::class); $this->fullPageCacheMock = $this->createMock(Type::class); $this->contextMock = $this->createMock(Context::class); $this->httpResponseMock = $this->createMock(\Magento\Framework\App\Response\Http::class); $this->identifierMock = $this->createMock(Identifier::class); $this->requestMock = $this->createMock(Http::class); $this->serializer = $this->getMockForAbstractClass(SerializerInterface::class); $this->responseMock = $this->createMock(\Magento\Framework\App\Response\Http::class); $this->contextFactoryMock = $this->createPartialMock(ContextFactory::class, ['create']); $this->httpFactoryMock = $this->createPartialMock(HttpFactory::class, ['create']); $this->responseMock->expects($this->any())->method('getHeaders')->willReturn($headersMock); $this->kernel = new Kernel( $this->cacheMock, $this->identifierMock, $this->requestMock, $this->contextMock, $this->contextFactoryMock, $this->httpFactoryMock, $this->serializer ); $reflection = new \ReflectionClass(Kernel::class); $reflectionProperty = $reflection->getProperty('fullPageCache'); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($this->kernel, $this->fullPageCacheMock); } /** * @param string $id * @param mixed $cache * @param bool $isGet * @param bool $isHead * * @return void * @dataProvider dataProviderForResultWithCachedData */ public function testLoadWithCachedData($id, $cache, $isGet, $isHead): void { $this->serializer->expects($this->once()) ->method('unserialize') ->willReturnCallback( function ($value) { return json_decode($value, true); } ); $this->contextFactoryMock ->expects($this->once()) ->method('create') ->with( [ 'data' => ['context_data'], 'default' => ['context_default_data'] ] ) ->willReturn($this->contextMock); $this->httpFactoryMock ->expects($this->once()) ->method('create') ->with(['context' => $this->contextMock]) ->willReturn($this->httpResponseMock); $this->requestMock->expects($this->once())->method('isGet')->willReturn($isGet); $this->requestMock->expects($this->any())->method('isHead')->willReturn($isHead); $this->fullPageCacheMock->expects( $this->any() )->method( 'load' )->with( $id )->willReturn( json_encode($cache) ); $this->httpResponseMock->expects($this->once())->method('setStatusCode')->with($cache['status_code']); $this->httpResponseMock->expects($this->once())->method('setContent')->with($cache['content']); $this->httpResponseMock->expects($this->once())->method('setHeader')->with(0, 'header', true); $this->identifierMock->expects($this->any())->method('getValue')->willReturn($id); $this->assertEquals($this->httpResponseMock, $this->kernel->load()); } /** * @return array */ public function dataProviderForResultWithCachedData(): array { $data = [ 'context' => [ 'data' => ['context_data'], 'default' => ['context_default_data'] ], 'status_code' => 'status_code', 'content' => 'content', 'headers' => ['header'] ]; return [ ['existing key', $data, true, false], ['existing key', $data, false, true] ]; } /** * @param string $id * @param mixed $cache * @param bool $isGet * @param bool $isHead * * @return void * @dataProvider dataProviderForResultWithoutCachedData */ public function testLoadWithoutCachedData($id, $cache, $isGet, $isHead): void { $this->requestMock->expects($this->once())->method('isGet')->willReturn($isGet); $this->requestMock->expects($this->any())->method('isHead')->willReturn($isHead); $this->fullPageCacheMock->expects( $this->any() )->method( 'load' )->with( $id )->willReturn( json_encode($cache) ); $this->identifierMock->expects($this->any())->method('getValue')->willReturn($id); $this->assertFalse($this->kernel->load()); } /** * @return array */ public function dataProviderForResultWithoutCachedData(): array { return [ ['existing key', [], false, false], ['non existing key', false, true, false], ['non existing key', false, false, false] ]; } /** * @param $httpCode * * @return void * @dataProvider testProcessSaveCacheDataProvider */ public function testProcessSaveCache($httpCode): void { $this->serializer->expects($this->once()) ->method('serialize') ->willReturnCallback( function ($value) { return json_encode($value); } ); $cacheControlHeader = CacheControl::fromString( 'Cache-Control: public, max-age=100, s-maxage=100' ); $this->responseMock ->method('getHeader') ->withConsecutive(['Cache-Control'], ['X-Magento-Tags']) ->willReturn($cacheControlHeader, null); $this->responseMock->expects( $this->any() )->method( 'getHttpResponseCode' )->willReturn($httpCode); $this->requestMock->expects($this->once()) ->method('isGet') ->willReturn(true); $this->responseMock->expects($this->once()) ->method('setNoCacheHeaders'); $this->responseMock ->method('clearHeader') ->withConsecutive(['Set-Cookie'], ['X-Magento-Tags']); $this->fullPageCacheMock->expects($this->once()) ->method('save'); $this->kernel->process($this->responseMock); } /** * @return array */ public function testProcessSaveCacheDataProvider(): array { return [ [200], [404] ]; } /** * @param string $cacheControlHeader * @param int $httpCode * @param bool $isGet * @param bool $overrideHeaders * * @return void * @dataProvider processNotSaveCacheProvider */ public function testProcessNotSaveCache($cacheControlHeader, $httpCode, $isGet, $overrideHeaders): void { $header = CacheControl::fromString("Cache-Control: $cacheControlHeader"); $this->responseMock->expects( $this->once() )->method( 'getHeader' )->with( 'Cache-Control' )->willReturn( $header ); $this->responseMock->expects($this->any())->method('getHttpResponseCode')->willReturn($httpCode); $this->requestMock->expects($this->any())->method('isGet')->willReturn($isGet); if ($overrideHeaders) { $this->responseMock->expects($this->once())->method('setNoCacheHeaders'); } $this->fullPageCacheMock->expects($this->never())->method('save'); $this->kernel->process($this->responseMock); } /** * @return array */ public function processNotSaveCacheProvider(): array { return [ ['private, max-age=100', 200, true, false], ['private, max-age=100', 200, false, false], ['private, max-age=100', 500, true, false], ['no-store, no-cache, must-revalidate, max-age=0', 200, true, false], ['no-store, no-cache, must-revalidate, max-age=0', 200, false, false], ['no-store, no-cache, must-revalidate, max-age=0', 404, true, false], ['no-store, no-cache, must-revalidate, max-age=0', 500, true, false], ['public, max-age=100, s-maxage=100', 500, true, true], ['public, max-age=100, s-maxage=100', 200, false, true] ]; } }