Add architecture tests and code fixes

This commit is contained in:
brufdev
2025-01-27 19:51:06 +00:00
parent f5e3718f56
commit 9859dc6105
15 changed files with 86 additions and 23 deletions

View File

@@ -6,7 +6,7 @@ namespace App\Actions;
use App\Enums\OAuthProviders;
final class GetAvailableOAuthProviders
final readonly class GetAvailableOAuthProviders
{
/** @return array<int, OAuthProviders> */
public function handle(): array

View File

@@ -6,7 +6,7 @@ namespace App\Actions;
use App\Models\User;
final class GetPathFromUser
final readonly class GetPathFromUser
{
public function handle(): string
{

View File

@@ -7,7 +7,7 @@ namespace App\Actions;
use App\Models\User;
use App\Models\Vault;
final class GetPathFromVault
final readonly class GetPathFromVault
{
public function handle(Vault $vault): string
{

View File

@@ -8,7 +8,7 @@ use App\Models\User;
use App\Models\Vault;
use App\Models\VaultNode;
final class GetPathFromVaultNode
final readonly class GetPathFromVaultNode
{
public function handle(VaultNode $node, bool $includeSelf = true): string
{

View File

@@ -6,7 +6,7 @@ namespace App\Actions;
use App\Models\VaultNode;
final class GetUrlFromVaultNode
final readonly class GetUrlFromVaultNode
{
public function handle(VaultNode $node): string
{

View File

@@ -7,7 +7,7 @@ namespace App\Actions;
use App\Models\VaultNode;
use Illuminate\Support\Str;
final class GetVaultNodeFromPath
final readonly class GetVaultNodeFromPath
{
public function handle(int $vaultId, string $path, ?int $parentId = null): ?VaultNode
{

View File

@@ -11,7 +11,7 @@ use App\Services\VaultFiles\Note;
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
final class ProcessImportedFile
final readonly class ProcessImportedFile
{
public function handle(Vault $vault, VaultNode $parent, string $fileName, string $filePath): void
{

View File

@@ -10,7 +10,7 @@ use App\Services\VaultFiles\Note;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
final class ProcessImportedVault
final readonly class ProcessImportedVault
{
public function handle(string $fileName, string $filePath): void
{

View File

@@ -7,7 +7,7 @@ namespace App\Actions;
use GuzzleHttp\Psr7\UriResolver;
use GuzzleHttp\Psr7\Utils;
final class ResolveTwoPaths
final readonly class ResolveTwoPaths
{
public function handle(string $currentPath, string $path): string
{

View File

@@ -1,10 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
abstract class Controller
{
//
}

View File

@@ -14,7 +14,7 @@ use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
final class FileController extends Controller
final readonly class FileController
{
/**
* Show the file for a given user.

View File

@@ -8,7 +8,7 @@ use App\Actions\GetPathFromVaultNode;
use App\Models\VaultNode;
use Illuminate\Support\Facades\Storage;
final class VaultNodeObserver
final readonly class VaultNodeObserver
{
/**
* Handle the VaultNode "creating" event.

View File

@@ -8,7 +8,7 @@ use App\Actions\GetPathFromUser;
use App\Models\Vault;
use Illuminate\Support\Facades\Storage;
final class VaultObserver
final readonly class VaultObserver
{
/**
* Handle the Vault "creating" event.

View File

@@ -7,7 +7,7 @@ namespace App\Policies;
use App\Models\User;
use App\Models\Vault;
final class VaultPolicy
final readonly class VaultPolicy
{
/**
* Determine whether the user can view the model.

View File

@@ -2,6 +2,79 @@
declare(strict_types=1);
use Illuminate\Database\Eloquent\Factories\Factory;
arch()->preset()->php();
arch()->preset()->laravel();
arch()->preset()->security();
arch('controllers')
->expect('App\Http\Controllers')
->not->toBeUsed();
arch('avoid mutation')
->expect('App')
->classes()
->toBeReadonly()
->ignoring([
'App\Exceptions',
'App\Jobs',
'App\Livewire',
'App\Models',
'App\Providers',
'App\Services',
]);
arch('avoid inheritance')
->expect('App')
->classes()
->toExtendNothing()
->ignoring([
'App\Exceptions',
'App\Jobs',
'App\Livewire',
'App\Models',
'App\Providers',
'App\Services',
]);
arch('avoid open for extension')
->expect('App')
->classes()
->toBeFinal()
->ignoring([
'App\Livewire',
]);
arch('avoid abstraction')
->expect('App')
->not->toBeAbstract();
arch('factories')
->expect('Database\Factories')
->toExtend(Factory::class)
->toHaveMethod('definition')
->toOnlyBeUsedIn([
'App\Models',
]);
arch('models')
->expect('App\Models')
->toHaveMethod('casts')
->toOnlyBeUsedIn([
'App\Actions',
'App\Http',
'App\Jobs',
'App\Livewire',
'App\Models',
'App\Observers',
'App\Policies',
'App\Providers',
'App\Services',
'Database\Factories',
'Database\Seeders',
]);
arch('actions')
->expect('App\Actions')
->toHaveMethod('handle');