Add tests for links/backlinks feature

This commit is contained in:
brufdev
2025-02-09 17:01:18 +00:00
parent c709f7d52c
commit 82596a47fb
4 changed files with 153 additions and 0 deletions
+22
View File
@@ -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);
});
+25
View File
@@ -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);
});
+62
View File
@@ -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);
});
+44
View File
@@ -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);
});