Files
many-notes/tests/Feature/Vault/ShowTest.php

414 lines
14 KiB
PHP

<?php
declare(strict_types=1);
use App\Actions\CreateVault;
use App\Actions\CreateVaultNode;
use App\Actions\GetPathFromVaultNode;
use App\Actions\GetUrlFromVaultNode;
use App\Actions\ProcessVaultNodeLinks;
use App\Actions\ProcessVaultNodeTags;
use App\Livewire\Vault\Show;
use App\Models\User;
use Illuminate\Support\Facades\Storage;
use Livewire\Livewire;
it('opens a file', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
'content' => fake()->paragraph(),
]);
Livewire::actingAs($user)
->withQueryParams(['file' => $node->id])
->test(Show::class, ['vault' => $vault])
->assertSet('nodeForm.node.name', $node->name);
});
it('does not open a non-existing file', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
Livewire::actingAs($user)
->withQueryParams(['file' => 500])
->test(Show::class, ['vault' => $vault])
->assertSet('selectedFile', null);
});
it('does not open a folder', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => false,
'name' => fake()->words(3, true),
]);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->call('openFile', $node)
->assertSet('selectedFile', null);
});
it('resets edit mode when opening a file that is not a note', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'jpg',
]);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->call('openFile', $node)
->assertSet('isEditMode', true);
});
it('opens a file from the path', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->call('openFilePath', $node->name)
->assertSet('selectedFile', $node->id);
});
it('opens a file from the path with an open file', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$folderNode = new CreateVaultNode()->handle($vault, [
'is_file' => false,
'name' => fake()->words(3, true),
]);
$firstNode = new CreateVaultNode()->handle($vault, [
'parent_id' => $folderNode->id,
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
$secondNode = new CreateVaultNode()->handle($vault, [
'parent_id' => $folderNode->id,
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
Livewire::actingAs($user)
->withQueryParams(['file' => $firstNode->id])
->test(Show::class, ['vault' => $vault])
->call('openFilePath', $secondNode->name)
->assertSet('selectedFile', $secondNode->id);
});
it('does not open a file from a non-existent path', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->call('openFilePath', fake()->words(4, true))
->assertSet('selectedFile', null);
});
it('refreshes an open file', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
$url = new GetUrlFromVaultNode()->handle($node);
$name = $node->name;
$newName = fake()->words(4, true);
Livewire::actingAs($user)
->withQueryParams(['file' => $node->id])
->test(Show::class, ['vault' => $vault])
->assertSet('selectedFileUrl', $url)
->set('nodeForm.name', $newName)
->call('refreshFile', $node->refresh())
->assertSet('selectedFileUrl', str_replace($name, $newName, $url));
});
it('does not refresh a file that is not open', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$firstNode = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
$secondNode = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
Livewire::actingAs($user)
->withQueryParams(['file' => $firstNode->id])
->test(Show::class, ['vault' => $vault])
->call('refreshFile', $secondNode)
->assertSet('selectedFile', $firstNode->id);
});
it('closes an open file', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
Livewire::actingAs($user)
->withQueryParams(['file' => $node->id])
->test(Show::class, ['vault' => $vault])
->assertSet('selectedFile', $node->id)
->call('closeFile')
->assertSet('selectedFile', null);
});
it('sets the template folder', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => false,
'name' => fake()->words(3, true),
]);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->assertSet('vault.templates_node_id', null)
->call('setTemplateFolder', $node)
->assertSet('vault.templates_node_id', $node->id);
});
it('does not set the template folder if it is a file', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->assertSet('vault.templates_node_id', null)
->call('setTemplateFolder', $node)
->assertSet('vault.templates_node_id', null);
});
it('updates the node', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
'content' => fake()->paragraph(),
]);
$newContent = fake()->paragraph();
Livewire::actingAs($user)
->withQueryParams(['file' => $node->id])
->test(Show::class, ['vault' => $vault])
->set('nodeForm.content', $newContent);
expect($vault->nodes()->first()->content)->toBe($newContent);
$path = new GetPathFromVaultNode()->handle($node);
expect(Storage::disk('local')->get($path))->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('process the tags when updating a node', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
]);
$content = '#tag1 ' . fake()->paragraph() . ' #tag2';
expect($node->tags()->count())->toBe(0);
Livewire::actingAs($user)
->withQueryParams(['file' => $node->id])
->test(Show::class, ['vault' => $vault])
->set('nodeForm.content', $content);
expect($node->tags->count())->toBe(2);
expect($node->tags->get(0)->name)->toBe('tag1');
expect($node->tags->get(1)->name)->toBe('tag2');
});
it('deletes a node', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$folderNode = new CreateVaultNode()->handle($vault, [
'is_file' => false,
'name' => fake()->words(3, true),
]);
new CreateVaultNode()->handle($vault, [
'is_file' => true,
'parent_id' => $folderNode->id,
'name' => fake()->words(3, true),
'extension' => 'md',
'content' => fake()->paragraph(),
]);
expect($vault->nodes()->count())->toBe(2);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->call('deleteNode', $folderNode)
->assertDispatched('toast');
expect($vault->nodes()->count())->toBe(0);
$path = new GetPathFromVaultNode()->handle($folderNode);
expect(Storage::disk('local')->path($path))->not->toBeDirectory();
});
it('closes an open file when it is deleted', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
'content' => fake()->paragraph(),
]);
Livewire::actingAs($user)
->withQueryParams(['file' => $node->id])
->test(Show::class, ['vault' => $vault])
->assertSet('selectedFile', $node->id)
->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);
});
it('deletes the tags when deleting a node', function (): void {
$user = User::factory()->create()->first();
$vault = new CreateVault()->handle($user, [
'name' => fake()->words(3, true),
]);
$node = new CreateVaultNode()->handle($vault, [
'is_file' => true,
'name' => fake()->words(3, true),
'extension' => 'md',
'content' => '#tag1 ' . fake()->paragraph() . ' #tag2',
]);
new ProcessVaultNodeTags()->handle($node);
expect($node->tags->count())->toBe(2);
Livewire::actingAs($user)
->test(Show::class, ['vault' => $vault])
->call('deleteNode', $node)
->assertDispatched('toast');
expect($node->refresh()->tags()->count())->toBe(0);
});