mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-08-07 23:03:00 +03:00
ZIP Exports: Added entity cross refs, Started export tests
This commit is contained in:
@@ -2,14 +2,95 @@
|
||||
|
||||
namespace Tests\Exports;
|
||||
|
||||
use BookStack\Entities\Models\Book;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Testing\TestResponse;
|
||||
use Tests\TestCase;
|
||||
use ZipArchive;
|
||||
|
||||
class ZipExportTest extends TestCase
|
||||
{
|
||||
public function test_page_export()
|
||||
public function test_export_results_in_zip_format()
|
||||
{
|
||||
$page = $this->entities->page();
|
||||
$response = $this->asEditor()->get($page->getUrl("/export/zip"));
|
||||
|
||||
$zipData = $response->streamedContent();
|
||||
$zipFile = tempnam(sys_get_temp_dir(), 'bstesta-');
|
||||
file_put_contents($zipFile, $zipData);
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($zipFile, ZipArchive::RDONLY);
|
||||
|
||||
$this->assertNotFalse($zip->locateName('data.json'));
|
||||
$this->assertNotFalse($zip->locateName('files/'));
|
||||
|
||||
$data = json_decode($zip->getFromName('data.json'), true);
|
||||
$this->assertIsArray($data);
|
||||
$this->assertGreaterThan(0, count($data));
|
||||
|
||||
$zip->close();
|
||||
unlink($zipFile);
|
||||
}
|
||||
|
||||
public function test_export_metadata()
|
||||
{
|
||||
$page = $this->entities->page();
|
||||
$zipResp = $this->asEditor()->get($page->getUrl("/export/zip"));
|
||||
$zip = $this->extractZipResponse($zipResp);
|
||||
|
||||
$this->assertEquals($page->id, $zip->data['page']['id'] ?? null);
|
||||
$this->assertArrayNotHasKey('book', $zip->data);
|
||||
$this->assertArrayNotHasKey('chapter', $zip->data);
|
||||
|
||||
$now = time();
|
||||
$date = Carbon::parse($zip->data['exported_at'])->unix();
|
||||
$this->assertLessThan($now + 2, $date);
|
||||
$this->assertGreaterThan($now - 2, $date);
|
||||
|
||||
$version = trim(file_get_contents(base_path('version')));
|
||||
$this->assertEquals($version, $zip->data['instance']['version']);
|
||||
|
||||
$instanceId = decrypt($zip->data['instance']['id_ciphertext']);
|
||||
$this->assertEquals('bookstack', $instanceId);
|
||||
}
|
||||
|
||||
public function test_page_export()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
public function test_book_export()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
public function test_chapter_export()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
protected function extractZipResponse(TestResponse $response): ZipResultData
|
||||
{
|
||||
$zipData = $response->streamedContent();
|
||||
$zipFile = tempnam(sys_get_temp_dir(), 'bstest-');
|
||||
|
||||
file_put_contents($zipFile, $zipData);
|
||||
$extractDir = tempnam(sys_get_temp_dir(), 'bstestextracted-');
|
||||
if (file_exists($extractDir)) {
|
||||
unlink($extractDir);
|
||||
}
|
||||
mkdir($extractDir);
|
||||
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($zipFile, ZipArchive::RDONLY);
|
||||
$zip->extractTo($extractDir);
|
||||
|
||||
$dataJson = file_get_contents($extractDir . DIRECTORY_SEPARATOR . "data.json");
|
||||
$data = json_decode($dataJson, true);
|
||||
|
||||
return new ZipResultData(
|
||||
$zipFile,
|
||||
$extractDir,
|
||||
$data,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
13
tests/Exports/ZipResultData.php
Normal file
13
tests/Exports/ZipResultData.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Exports;
|
||||
|
||||
class ZipResultData
|
||||
{
|
||||
public function __construct(
|
||||
public string $zipPath,
|
||||
public string $extractedDirPath,
|
||||
public array $data,
|
||||
) {
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user