trypost/tests/Unit/MediaPolymorphTest.php
Paulo Castellano 6ae48f014f fix: persist morph map alias on AI-generated Media rows
Both PostAiCreateController::createMediaItem and
PostTemplateController::createMediaItem were doing:

    $media = new Media([...]);
    $media->mediable_type = Workspace::class;   // ← FQCN literal
    $media->mediable_id = $workspace->id;
    $media->save();

Assigning Workspace::class directly bypasses the morphMap configured in
AppServiceProvider, so rows ended up with mediable_type =
'App\\Models\\Workspace' instead of the alias 'workspace'. Other queries
that pivot through the morphMap (e.g. $workspace->media) lose those
records on hosts where the FQCN doesn't match the alias.

Switch both to the relationship form:

    $media = $workspace->media()->create([...]);

Laravel fills mediable_type via the morphMap, producing 'workspace'.
This is the same pattern AssetController and the HasMedia trait already
use; these two AI controllers were the only outliers (`grep -rn
'mediable_type =' app/` confirms).

Added tests/Unit/MediaPolymorphTest as a regression — asserts the
created row's mediable_type is the alias and that the relationship
resolves back to the workspace.
2026-05-04 14:14:14 -03:00

32 lines
1.1 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\Workspace;
/**
* Regression test for a bug where Media rows ended up with
* `mediable_type = "App\Models\Workspace"` (FQCN) instead of the
* morphMap alias `"workspace"`. The bug source was code that did
* `$media->mediable_type = Workspace::class;`
* which bypasses the morph map. Using the relationship
* (`$workspace->media()->create([...])` or
* `$media->mediable()->associate($workspace)`) is the correct path.
*/
test('Workspace::media()->create persists the morphMap alias, not the FQCN', function () {
$workspace = Workspace::factory()->create();
$media = $workspace->media()->create([
'collection' => 'ai-generated',
'type' => 'image',
'path' => 'test/dummy.webp',
'original_filename' => 'dummy.webp',
'mime_type' => 'image/webp',
'size' => 100,
'order' => 0,
]);
expect($media->mediable_type)->toBe('workspace');
expect($media->mediable_type)->not->toBe(Workspace::class);
expect($media->mediable->is($workspace))->toBeTrue();
});