mirror of
https://github.com/brufdev/many-notes.git
synced 2026-05-20 09:19:15 -05:00
Add tests for links/backlinks feature
This commit is contained in:
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user