diff --git a/tests/Feature/Modals/ImportFileTest.php b/tests/Feature/Modals/ImportFileTest.php index 79f22b7..5cd317f 100644 --- a/tests/Feature/Modals/ImportFileTest.php +++ b/tests/Feature/Modals/ImportFileTest.php @@ -133,3 +133,25 @@ it('does not import a file with a non-allowed extension', function (): void { ->set('file', $file) ->assertHasErrors('file'); }); + +it('creates links when importing a file', function (): void { + $user = User::factory()->create()->first(); + $vault = new CreateVault()->handle($user, [ + 'name' => fake()->words(3, true), + ]); + $nodeName = fake()->words(3, true); + $node = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'name' => $nodeName, + 'extension' => 'md', + 'content' => fake()->paragraph(), + ]); + $file = UploadedFile::fake()->createWithContent('note.md', '[link](/' . $nodeName . '.md)'); + + Livewire::actingAs($user) + ->test(ImportFile::class, ['vault' => $vault]) + ->call('open') + ->set('file', $file); + + expect($vault->nodes()->get()->get(1)->links()->count())->toBe(1); +}); diff --git a/tests/Feature/Modals/ImportVaultTest.php b/tests/Feature/Modals/ImportVaultTest.php index 838a9a4..4f86cfd 100644 --- a/tests/Feature/Modals/ImportVaultTest.php +++ b/tests/Feature/Modals/ImportVaultTest.php @@ -92,3 +92,28 @@ it('imports a zip file with files and folders', function (): void { expect($user->vaults()->count())->toBe(1); }); + +it('creates links when importing a vault', function (): void { + $user = User::factory()->create()->first(); + $zip = new ZipArchive(); + $relativePath = 'public/' . Str::random(16) . '.zip'; + Storage::disk('local')->put($relativePath, ''); + $path = Storage::disk('local')->path($relativePath); + $zip->open($path, ZipArchive::CREATE | ZipArchive::OVERWRITE); + $firstNodeName = fake()->words(3, true); + $secondNodeName = fake()->words(3, true); + $zip->addFromString($firstNodeName . '.md', '[link](/' . $secondNodeName . '.md)'); + $zip->addFromString($secondNodeName . '.md', '[link](/' . $firstNodeName . '.md)'); + $zip->close(); + $file = UploadedFile::fake()->createWithContent('vault.zip', file_get_contents($path)); + + Livewire::actingAs($user) + ->test(ImportVault::class) + ->call('open') + ->set('file', $file); + + expect($user->vaults()->count())->toBe(1) + ->and($user->vaults()->first()->nodes()->count())->toBe(2) + ->and($user->vaults()->first()->nodes()->get()->get(0)->links()->count())->toBe(1) + ->and($user->vaults()->first()->nodes()->get()->get(1)->links()->count())->toBe(1); +}); diff --git a/tests/Feature/Vault/ShowTest.php b/tests/Feature/Vault/ShowTest.php index 8950d3a..0393f90 100644 --- a/tests/Feature/Vault/ShowTest.php +++ b/tests/Feature/Vault/ShowTest.php @@ -7,6 +7,7 @@ use App\Actions\CreateVaultNode; use App\Actions\GetPathFromUser; use App\Actions\GetPathFromVaultNode; use App\Actions\GetUrlFromVaultNode; +use App\Actions\ProcessVaultNodeLinks; use App\Livewire\Vault\Show; use App\Models\User; use Illuminate\Support\Facades\Storage; @@ -348,6 +349,35 @@ it('updates the node', function (): void { expect($vault->nodes()->first()->content)->toBe($newContent); }); +it('process the links when updating a node', function (): void { + $user = User::factory()->create()->first(); + $vault = new CreateVault()->handle($user, [ + 'name' => fake()->words(3, true), + ]); + $firstNodeName = fake()->words(3, true); + $firstNode = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'name' => $firstNodeName, + 'extension' => 'md', + ]); + $secondNodeName = fake()->words(3, true); + $secondNode = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'name' => $secondNodeName, + 'extension' => 'md', + ]); + $content = '[link](/' . $secondNodeName . '.md)'; + expect($firstNode->links()->count())->toBe(0); + + Livewire::actingAs($user) + ->withQueryParams(['file' => $firstNode->id]) + ->test(Show::class, ['vault' => $vault]) + ->set('nodeForm.content', $content); + + expect($firstNode->links()->count())->toBe(1); + expect($firstNode->links()->first()->is($secondNode))->toBeTrue(); +}); + it('updates the vault', function (): void { $user = User::factory()->create()->first(); $vault = new CreateVault()->handle($user, [ @@ -414,3 +444,35 @@ it('closes an open file when it is deleted', function (): void { ->call('deleteNode', $node) ->assertSet('selectedFile', null); }); + +it('deletes the links and backlinks when deleting a node', function (): void { + $user = User::factory()->create()->first(); + $vault = new CreateVault()->handle($user, [ + 'name' => fake()->words(3, true), + ]); + $firstNodeName = fake()->words(3, true); + $secondNodeName = fake()->words(3, true); + $firstNode = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'name' => $firstNodeName, + 'extension' => 'md', + 'content' => '[link](/' . $secondNodeName . '.md)', + ]); + $secondNode = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'name' => $secondNodeName, + 'extension' => 'md', + 'content' => '[link](/' . $firstNodeName . '.md)', + ]); + new ProcessVaultNodeLinks()->handle($firstNode); + new ProcessVaultNodeLinks()->handle($secondNode); + expect($firstNode->links()->count())->toBe(1); + expect($secondNode->links()->count())->toBe(1); + + Livewire::actingAs($user) + ->test(Show::class, ['vault' => $vault]) + ->call('deleteNode', $firstNode) + ->assertDispatched('toast'); + expect($firstNode->links()->count())->toBe(0); + expect($secondNode->links()->count())->toBe(0); +}); diff --git a/tests/Unit/Models/VaultNodeTest.php b/tests/Unit/Models/VaultNodeTest.php index 14026a5..e770292 100644 --- a/tests/Unit/Models/VaultNodeTest.php +++ b/tests/Unit/Models/VaultNodeTest.php @@ -2,6 +2,10 @@ declare(strict_types=1); +use App\Actions\CreateVault; +use App\Actions\CreateVaultNode; +use App\Actions\ProcessVaultNodeLinks; +use App\Models\User; use App\Models\Vault; use App\Models\VaultNode; @@ -34,3 +38,43 @@ it('may have childs', function (): void { expect($node->childs)->toHaveCount(3) ->each->toBeInstanceOf(VaultNode::class); }); + +it('may have links', function (): void { + $user = User::factory()->create()->first(); + $vault = new CreateVault()->handle($user, [ + 'name' => fake()->words(3, true), + ]); + $folderName = fake()->words(3, true); + $firstNodeName = fake()->words(3, true); + $secondNodeName = fake()->words(3, true); + $folderNode = new CreateVaultNode()->handle($vault, [ + 'name' => $folderName, + 'is_file' => false, + ]); + $firstNode = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'name' => $firstNodeName, + 'extension' => 'md', + 'content' => '[link](/' . $folderName . '/' . $secondNodeName . '.md)' + . ' [link](' . $folderName . '/' . $secondNodeName . '.md)', + ]); + $secondNode = new CreateVaultNode()->handle($vault, [ + 'is_file' => true, + 'parent_id' => $folderNode->id, + 'name' => $secondNodeName, + 'extension' => 'md', + 'content' => fake()->paragraph(), + ]); + + // Parse links in content + new ProcessVaultNodeLinks()->handle($firstNode); + + expect($firstNode->links()->get())->toHaveCount(2) + ->each->toBeInstanceOf(VaultNode::class); + expect($firstNode->backlinks()->get())->toHaveCount(0) + ->each->toBeInstanceOf(VaultNode::class); + expect($secondNode->backlinks()->get())->toHaveCount(2) + ->each->toBeInstanceOf(VaultNode::class); + expect($secondNode->links()->get())->toHaveCount(0) + ->each->toBeInstanceOf(VaultNode::class); +});