Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/code/Magento/Sales/Model/Order/Pdf/AbstractPdf.php
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,7 @@ protected function _initRenderer($type)
*/
protected function _getRenderer($type)
{
if (!isset($this->_renderers[$type])) {
if ($type === null || !isset($this->_renderers[$type])) {
$type = 'default';
}

Expand Down
76 changes: 76 additions & 0 deletions app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/AbstractTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use Magento\Sales\Model\Order\Invoice;
use Magento\Sales\Model\Order\Pdf\AbstractPdf;
use Magento\Sales\Model\Order\Pdf\Config;
use Magento\Sales\Model\Order\Pdf\Items\AbstractItems;
use Magento\Sales\Model\Order\Pdf\ItemsFactory;
use Magento\Sales\Model\Order\Pdf\Total\DefaultTotal;
use Magento\Sales\Model\Order\Pdf\Total\Factory;
Expand Down Expand Up @@ -288,6 +289,81 @@ public function testDrawLineBlocksPropagatesNewPageToSiblingColumns(): void
$this->assertSame(['name-line-2', 'sku-line'], $drawnOnPageTwo);
}

/**
* A null renderer type must fall back to the 'default' renderer without emitting a
* "Using null as an array offset is deprecated" notice (PHP 8.5), which in production
* mode is promoted to an exception and breaks PDF generation.
*
* @return void
* @throws \ReflectionException
*/
public function testGetRendererFallsBackToDefaultForNullType(): void
{
$paymentData = $this->createMock(Data::class);
$string = $this->createMock(StringUtils::class);
$scopeConfig = $this->createMock(ScopeConfigInterface::class);
$filesystem = $this->createMock(Filesystem::class);
$pdfConfig = $this->createMock(Config::class);
$pdfTotalFactory = $this->createMock(Factory::class);
$pdfItemsFactory = $this->createMock(ItemsFactory::class);
$localeMock = $this->createMock(TimezoneInterface::class);
$translate = $this->createMock(StateInterface::class);
$addressRenderer = $this->createMock(Renderer::class);
$taxHelper = $this->createMock(TaxHelper::class);
$fileStorageDatabase = $this->createMock(Database::class);
$rtlTextHandler = $this->createMock(RtlTextHandler::class);
$image = $this->createMock(Image::class);

$model = $this->getMockBuilder(AbstractPdf::class)
->setConstructorArgs([
$paymentData,
$string,
$scopeConfig,
$filesystem,
$pdfConfig,
$pdfTotalFactory,
$pdfItemsFactory,
$localeMock,
$translate,
$addressRenderer,
[],
$fileStorageDatabase,
$rtlTextHandler,
$image,
$taxHelper
])
->onlyMethods(['getPdf'])
->getMock();

$defaultRenderer = $this->createMock(AbstractItems::class);
$pdfItemsFactory->expects($this->once())
->method('get')
->with('default_renderer_model')
->willReturn($defaultRenderer);

$renderersProperty = new \ReflectionProperty(AbstractPdf::class, '_renderers');
$renderersProperty->setValue(
$model,
['default' => ['model' => 'default_renderer_model', 'renderer' => null]]
);

// Promote deprecations to exceptions so a null array offset regression fails the test.
set_error_handler(
static function (int $errno, string $errstr): bool {
throw new \RuntimeException($errstr);
},
E_DEPRECATED
);
try {
$reflectionMethod = new \ReflectionMethod(AbstractPdf::class, '_getRenderer');
$actual = $reflectionMethod->invoke($model, null);
} finally {
restore_error_handler();
}
Comment thread
Bashev marked this conversation as resolved.
Outdated

$this->assertSame($defaultRenderer, $actual);
}

/**
* Generate the array for multiline block
*
Expand Down