ORIENT/tests/unit/system/classes/ImageResizerTest.php

382 lines
11 KiB
PHP
Raw Normal View History

<?php
use Cms\Classes\Theme;
use System\Classes\ImageResizer;
use System\Classes\MediaLibrary;
use System\Models\File as FileModel;
use Cms\Classes\Controller as CmsController;
2020-08-17 04:06:10 +00:00
use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
use October\Rain\Exception\SystemException;
class ImageResizerTest extends PluginTestCase
{
2020-08-17 04:06:10 +00:00
use ArraySubsetAsserts;
public function setUp(): void
{
parent::setUp();
Config::set('cms.activeTheme', 'test');
Event::flush('cms.theme.getActiveTheme');
Theme::resetCache();
}
2020-08-17 04:06:10 +00:00
public function tearDown(): void
{
2020-08-17 04:06:10 +00:00
$this->removeMedia();
ImageResizer::flushAvailableSources();
2020-08-17 04:06:10 +00:00
parent::tearDown();
}
2020-08-19 03:02:00 +00:00
/**
* Tests configuration through the constructor as well as events.
*
* @return void
*/
2020-08-17 04:06:10 +00:00
public function testConfiguration()
{
// Resize with default options
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
100,
100
2020-08-17 04:06:10 +00:00
);
self::assertArraySubset([
'width' => 100,
'height' => 100,
'options' => [
'mode' => 'auto',
'offset' => [0, 0],
'sharpen' => 0,
'interlace' => false,
'quality' => 90,
'extension' => 'png',
],
2020-08-17 04:06:10 +00:00
], $imageResizer->getConfig());
// Resize with customised options
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
150,
120,
[
'mode' => 'fit',
'offset' => [2, 2],
'sharpen' => 23,
'interlace' => true,
'quality' => 73,
'extension' => 'jpg'
]
);
self::assertArraySubset([
'width' => 150,
'height' => 120,
'options' => [
'mode' => 'fit',
'offset' => [2, 2],
'sharpen' => 23,
'interlace' => true,
'quality' => 73,
'extension' => 'jpg'
],
2020-08-17 04:06:10 +00:00
], $imageResizer->getConfig());
// Resize with an customised defaults
Event::listen('system.resizer.getDefaultOptions', function (&$options) {
$options = array_merge($options, [
'mode' => 'fit',
'offset' => [2, 2],
'sharpen' => 23,
'interlace' => true,
'quality' => 73,
]);
});
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
100,
100,
[]
2020-08-17 04:06:10 +00:00
);
self::assertArraySubset([
'width' => 100,
'height' => 100,
'options' => [
'mode' => 'fit',
'offset' => [2, 2],
'sharpen' => 23,
'interlace' => true,
'quality' => 73,
'extension' => 'png',
],
2020-08-17 04:06:10 +00:00
], $imageResizer->getConfig());
Event::forget('system.resizer.getDefaultOptions');
2020-08-19 02:11:42 +00:00
// Resize with a falsey height specified
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
100,
false
);
self::assertArraySubset([
'width' => 100,
'height' => 0,
], $imageResizer->getConfig());
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
100,
null
);
self::assertArraySubset([
'width' => 100,
'height' => 0,
], $imageResizer->getConfig());
// Resize with a falsey width specified
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
'',
100
);
self::assertArraySubset([
'width' => 0,
'height' => 100,
], $imageResizer->getConfig());
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
"0",
100
);
self::assertArraySubset([
'width' => 0,
'height' => 100,
], $imageResizer->getConfig());
2020-08-17 04:06:10 +00:00
}
2020-08-19 03:02:00 +00:00
/**
* Tests URLs for sources that can be accessed via URL.
*
* @return void
*/
public function testURLSources()
2020-08-17 04:06:10 +00:00
{
2020-08-19 03:02:00 +00:00
// Theme URL (absolute URL)
$this->setUpStorage();
$this->copyMedia();
$imageResizer = new ImageResizer(
(new CmsController())->themeUrl('assets/images/october.png'),
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Theme URL (relative URL)
$this->setUpStorage();
$this->copyMedia();
$imageResizer = new ImageResizer(
'/themes/test/assets/images/october.png',
2020-08-19 03:02:00 +00:00
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Media URL (absolute URL)
$this->setUpStorage();
$this->copyMedia();
$imageResizer = new ImageResizer(
URL::to(MediaLibrary::url('october.png')),
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Media URL (relative URL)
2020-08-17 04:06:10 +00:00
$this->setUpStorage();
$this->copyMedia();
$imageResizer = new ImageResizer(
MediaLibrary::url('october.png'),
100,
100
2020-08-17 04:06:10 +00:00
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
2020-08-19 03:02:00 +00:00
// Media URL (absolute URL)
$this->setUpStorage();
$this->copyMedia();
$imageResizer = new ImageResizer(
URL::to(MediaLibrary::url('october.png')),
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Plugin URL (relative URL)
$imageResizer = new ImageResizer(
'/plugins/database/tester/assets/images/avatar.png',
2020-08-19 03:02:00 +00:00
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Plugin URL (absolute URL)
2020-08-17 04:06:10 +00:00
$imageResizer = new ImageResizer(
URL::to('plugins/database/tester/assets/images/avatar.png'),
100,
100
2020-08-17 04:06:10 +00:00
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
2020-08-19 03:02:00 +00:00
// Module URL (relative URL)
2020-08-17 04:06:10 +00:00
$imageResizer = new ImageResizer(
'/modules/backend/assets/images/favicon.png',
2020-08-17 04:06:10 +00:00
100,
100
2020-08-17 04:06:10 +00:00
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
2020-08-19 03:02:00 +00:00
// Module URL (absolute URL)
2020-08-17 04:06:10 +00:00
$imageResizer = new ImageResizer(
Backend::skinAsset('assets/images/favicon.png'),
100,
100
2020-08-17 04:06:10 +00:00
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
2020-08-19 03:02:00 +00:00
// URL for a FileModel instance (absolute URL)
$fileModel = new FileModel();
$fileModel->fromFile(base_path('tests/fixtures/plugins/database/tester/assets/images/avatar.png'));
$fileModel->save();
$imageResizer = new ImageResizer(
FileModel::first()->getPath(),
2020-08-19 03:02:00 +00:00
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Remove FileModel instance
$fileModel->delete();
// URL of a FileModel instance (relative URL)
2020-08-19 03:02:00 +00:00
$fileModel = new FileModel();
$fileModel->fromFile(base_path('tests/fixtures/plugins/database/tester/assets/images/avatar.png'));
$fileModel->save();
$imageResizer = new ImageResizer(
str_replace(url('') . '/', '/', FileModel::first()->getPath()),
2020-08-19 03:02:00 +00:00
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
}
public function testDirectSources()
{
// FileModel instance itself
2020-08-19 03:02:00 +00:00
$fileModel = new FileModel();
$fileModel->fromFile(base_path('tests/fixtures/plugins/database/tester/assets/images/avatar.png'));
$fileModel->save();
$imageResizer = new ImageResizer(
$fileModel,
100,
100
);
$this->assertEquals('png', $imageResizer->getConfig()['options']['extension']);
// Remove FileModel instance
$fileModel->delete();
}
public function testInvalidInputPath()
{
$this->expectException(SystemException::class);
$this->expectExceptionMessageMatches('/^Unable to process the provided image/');
2020-08-17 04:06:10 +00:00
$imageResizer = new ImageResizer(
'/plugins/database/tester/assets/images/MISSING.png',
100,
100
);
}
public function testInvalidInputFileModel()
{
$this->expectException(SystemException::class);
$this->expectExceptionMessageMatches('/^Unable to process the provided image/');
$imageResizer = new ImageResizer(
FileModel::first(),
100,
100
);
}
2020-08-17 04:06:10 +00:00
public function testSpaceInFilename()
{
// Media URL with space
$this->setUpStorage();
$this->copyMedia();
$imageResizer = new ImageResizer(
URL::to(MediaLibrary::url('october space.png')),
100,
100
);
$this->assertStringContainsString('october%20space', $imageResizer->getResizedUrl(), 'Resized URLs are not properly URL encoded');
}
2020-08-17 04:06:10 +00:00
protected function setUpStorage()
{
$this->app->useStoragePath(base_path('storage/temp'));
Config::set('filesystems.disks.test_local', [
2020-08-17 04:06:10 +00:00
'driver' => 'local',
'root' => storage_path('app'),
]);
2020-08-17 04:06:10 +00:00
Config::set('cms.storage.media', [
2020-08-17 04:06:10 +00:00
'disk' => 'test_local',
'folder' => 'media',
'path' => '/storage/temp/app/media',
]);
2020-08-17 04:06:10 +00:00
}
protected function copyMedia()
{
$mediaPath = storage_path('app/media');
if (!is_dir($mediaPath)) {
mkdir($mediaPath, 0777, true);
}
foreach (glob(base_path('tests/fixtures/media/*')) as $file) {
$path = pathinfo($file);
copy($file, $mediaPath . DIRECTORY_SEPARATOR . $path['basename']);
}
}
protected function removeMedia()
{
if ($this->app->storagePath() !== base_path('storage/temp')) {
return;
}
foreach (glob(storage_path('app/media/*')) as $file) {
unlink($file);
}
rmdir(storage_path('app/media'));
rmdir(storage_path('app'));
}
}