mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-12-13 22:43:39 +08:00
59cfc087e1
Images were missing their extension after import since it was (potentially) not part of the import data. This adds validation via mime sniffing (to match normal image upload checks) and also uses the same logic to sniff out a correct extension. Added tests to cover. Also fixed some existing tests around zip functionality.
94 lines
3.4 KiB
PHP
94 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Tests\Exports;
|
|
|
|
use BookStack\Entities\Models\Book;
|
|
use BookStack\Entities\Models\Chapter;
|
|
use BookStack\Entities\Models\Page;
|
|
use BookStack\Exports\ZipExports\ZipExportReader;
|
|
use BookStack\Exports\ZipExports\ZipExportValidator;
|
|
use BookStack\Exports\ZipExports\ZipImportRunner;
|
|
use BookStack\Uploads\Image;
|
|
use Tests\TestCase;
|
|
|
|
class ZipExportValidatorTest extends TestCase
|
|
{
|
|
protected array $filesToRemove = [];
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
foreach ($this->filesToRemove as $file) {
|
|
unlink($file);
|
|
}
|
|
|
|
parent::tearDown();
|
|
}
|
|
|
|
protected function getValidatorForData(array $zipData, array $files = []): ZipExportValidator
|
|
{
|
|
$upload = ZipTestHelper::zipUploadFromData($zipData, $files);
|
|
$path = $upload->getRealPath();
|
|
$this->filesToRemove[] = $path;
|
|
$reader = new ZipExportReader($path);
|
|
return new ZipExportValidator($reader);
|
|
}
|
|
|
|
public function test_ids_have_to_be_unique()
|
|
{
|
|
$validator = $this->getValidatorForData([
|
|
'book' => [
|
|
'id' => 4,
|
|
'name' => 'My book',
|
|
'pages' => [
|
|
[
|
|
'id' => 4,
|
|
'name' => 'My page',
|
|
'markdown' => 'hello',
|
|
'attachments' => [
|
|
['id' => 4, 'name' => 'Attachment A', 'link' => 'https://example.com'],
|
|
['id' => 4, 'name' => 'Attachment B', 'link' => 'https://example.com']
|
|
],
|
|
'images' => [
|
|
['id' => 4, 'name' => 'Image A', 'type' => 'gallery', 'file' => 'cat'],
|
|
['id' => 4, 'name' => 'Image b', 'type' => 'gallery', 'file' => 'cat'],
|
|
],
|
|
],
|
|
['id' => 4, 'name' => 'My page', 'markdown' => 'hello'],
|
|
],
|
|
'chapters' => [
|
|
['id' => 4, 'name' => 'Chapter 1'],
|
|
['id' => 4, 'name' => 'Chapter 2']
|
|
]
|
|
]
|
|
], ['cat' => $this->files->testFilePath('test-image.png')]);
|
|
|
|
$results = $validator->validate();
|
|
$this->assertCount(4, $results);
|
|
|
|
$expectedMessage = 'The id must be unique for the object type within the ZIP.';
|
|
$this->assertEquals($expectedMessage, $results['book.pages.0.attachments.1.id']);
|
|
$this->assertEquals($expectedMessage, $results['book.pages.0.images.1.id']);
|
|
$this->assertEquals($expectedMessage, $results['book.pages.1.id']);
|
|
$this->assertEquals($expectedMessage, $results['book.chapters.1.id']);
|
|
}
|
|
|
|
public function test_image_files_need_to_be_a_valid_detected_image_file()
|
|
{
|
|
$validator = $this->getValidatorForData([
|
|
'page' => [
|
|
'id' => 4,
|
|
'name' => 'My page',
|
|
'markdown' => 'hello',
|
|
'images' => [
|
|
['id' => 4, 'name' => 'Image A', 'type' => 'gallery', 'file' => 'cat'],
|
|
],
|
|
]
|
|
], ['cat' => $this->files->testFilePath('test-file.txt')]);
|
|
|
|
$results = $validator->validate();
|
|
$this->assertCount(1, $results);
|
|
|
|
$this->assertEquals('The file needs to reference a file of type image/png,image/jpeg,image/gif,image/webp, found text/plain.', $results['page.images.0.file']);
|
|
}
|
|
}
|