Files
GSB-Construction/tests/Feature/DocumentMediaPreviewTest.php

152 lines
5.8 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Modules\DocumentManagement\Models\Document;
use Modules\DocumentManagement\Models\DocumentCategory;
use Spatie\Permission\Models\Permission;
use Tests\TestCase;
class DocumentMediaPreviewTest extends TestCase
{
use RefreshDatabase;
protected User $user;
protected DocumentCategory $category;
protected function setUp(): void
{
parent::setUp();
Storage::fake('local');
$this->user = User::factory()->create(['status' => 'active']);
Permission::firstOrCreate(['name' => 'documents.access', 'guard_name' => 'web']);
$this->user->givePermissionTo('documents.access');
$this->category = DocumentCategory::create(['name' => 'Test Documents']);
}
public function test_pdf_upload_is_stored_and_available_as_inline_preview(): void
{
$document = $this->upload('plan.pdf', 'application/pdf');
$response = $this->actingAs($this->user)->get(route('documents.preview', $document));
$response->assertOk();
$response->assertHeader('Content-Type', 'application/pdf');
$response->assertHeader('Content-Disposition', 'inline; filename="plan.pdf"');
Storage::disk('local')->assertExists($document->current_file_path);
}
public function test_image_upload_is_stored_and_available_as_inline_preview(): void
{
$file = UploadedFile::fake()->image('site-photo.jpg', 640, 480);
$document = $this->uploadFile($file);
$response = $this->actingAs($this->user)->get(route('documents.preview', $document));
$response->assertOk();
$response->assertHeader('Content-Type', 'image/jpeg');
$response->assertHeader('Content-Disposition', 'inline; filename="site-photo.jpg"');
Storage::disk('local')->assertExists($document->current_file_path);
}
public function test_docx_upload_is_stored_and_downloadable(): void
{
$document = $this->upload(
'specification.docx',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
);
$this->actingAs($this->user)
->get(route('documents.download', $document))
->assertOk()
->assertHeader('Content-Disposition', 'attachment; filename=specification.docx');
Storage::disk('local')->assertExists($document->current_file_path);
}
public function test_valid_docx_is_rendered_as_html_preview(): void
{
$path = tempnam(sys_get_temp_dir(), 'document-preview-');
$archive = new \ZipArchive();
$archive->open($path, \ZipArchive::CREATE);
$archive->addFromString('word/document.xml', '<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:p><w:r><w:t>Previewable document content</w:t></w:r></w:p><w:tbl><w:tr><w:tc><w:p><w:r><w:t>Header</w:t></w:r></w:p></w:tc><w:tc><w:p><w:r><w:t>Value</w:t></w:r></w:p></w:tc></w:tr></w:tbl></w:body></w:document>');
$archive->close();
$storedPath = 'documents/contracts/previewable.docx';
Storage::disk('local')->put($storedPath, file_get_contents($path));
unlink($path);
$document = Document::create([
'title' => 'Previewable DOCX',
'category_id' => $this->category->id,
'status' => 'Approved',
'uploaded_by' => $this->user->id,
'current_file_path' => $storedPath,
'current_file_name' => 'previewable.docx',
'mime_type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'file_size' => Storage::disk('local')->size($storedPath),
'version_count' => 1,
]);
$this->actingAs($this->user)
->get(route('documents.preview', $document))
->assertOk()
->assertHeader('Content-Type', 'text/html; charset=UTF-8')
->assertSee('Previewable document content')
->assertSee('<table>', false)
->assertSee('Header')
->assertSee('Value')
->assertSee('width:8.5in');
}
public function test_existing_public_disk_pdf_is_available_as_inline_preview(): void
{
Storage::fake('public');
$path = 'bid-submissions/legacy-submission.pdf';
Storage::disk('public')->put($path, '%PDF-1.4 legacy test file');
$document = Document::create([
'title' => 'Legacy Bid Submission',
'category_id' => $this->category->id,
'status' => 'Approved',
'uploaded_by' => $this->user->id,
'current_file_path' => $path,
'current_file_name' => 'legacy-submission.pdf',
'mime_type' => 'application/pdf',
'file_size' => 24,
'version_count' => 1,
]);
$this->actingAs($this->user)
->get(route('documents.preview', $document))
->assertOk()
->assertHeader('Content-Type', 'application/pdf');
}
private function upload(string $name, string $mimeType): Document
{
return $this->uploadFile(UploadedFile::fake()->create($name, 10, $mimeType));
}
private function uploadFile(UploadedFile $file): Document
{
$this->actingAs($this->user)
->from(route('documents.index'))
->post(route('documents.upload'), [
'title' => pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME),
'category_id' => $this->category->id,
'description' => 'Media preview test file',
'file' => $file,
])
->assertRedirect(route('documents.index'));
return Document::query()->latest('id')->firstOrFail();
}
}