chore: complete update

This commit is contained in:
2025-07-17 16:24:20 +02:00
parent 899227b0a4
commit 64a7051137
1300 changed files with 85570 additions and 2756 deletions

View File

@@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace Tests\Framework\Filesystem;
use App\Framework\Filesystem\Exceptions\FileNotFoundException;
use App\Framework\Filesystem\FileStorage;
use App\Framework\Filesystem\InMemoryStorage;
test('speichert und lädt Dateien', function () {
$tempFile = tempnam(sys_get_temp_dir(), 'test_');
$content = 'Testinhalt ' . uniqid();
$storage = new FileStorage();
$storage->put($tempFile, $content);
expect($storage->exists($tempFile))->toBeTrue();
expect($storage->get($tempFile))->toBe($content);
expect($storage->size($tempFile))->toBe(strlen($content));
// Aufräumen
$storage->delete($tempFile);
expect($storage->exists($tempFile))->toBeFalse();
});
test('wirft Exception bei nicht existierender Datei', function () {
$storage = new FileStorage();
$nonExistingFile = '/tmp/doesnt_exist_' . uniqid();
expect(fn() => $storage->get($nonExistingFile))
->toThrow(FileNotFoundException::class);
});
test('kopiert Dateien', function () {
$tempFile = tempnam(sys_get_temp_dir(), 'src_');
$destFile = tempnam(sys_get_temp_dir(), 'dest_');
unlink($destFile); // Löschen, damit copy funktioniert
$content = 'Kopierinhalt ' . uniqid();
$storage = new FileStorage();
$storage->put($tempFile, $content);
$storage->copy($tempFile, $destFile);
expect($storage->exists($destFile))->toBeTrue();
expect($storage->get($destFile))->toBe($content);
// Aufräumen
$storage->delete($tempFile);
$storage->delete($destFile);
});
test('InMemoryStorage funktioniert wie FileStorage', function () {
$storage = new InMemoryStorage();
$path = '/virtual/test.txt';
$content = 'Virtueller Inhalt';
$storage->put($path, $content);
expect($storage->exists($path))->toBeTrue();
expect($storage->get($path))->toBe($content);
expect($storage->size($path))->toBe(strlen($content));
$copyPath = '/virtual/copy.txt';
$storage->copy($path, $copyPath);
expect($storage->get($copyPath))->toBe($content);
$storage->delete($path);
expect($storage->exists($path))->toBeFalse();
});

View File

@@ -0,0 +1,121 @@
<?php
declare(strict_types=1);
namespace Tests\Framework\Filesystem;
use App\Framework\Filesystem\File;
use App\Framework\Filesystem\Directory;
use App\Framework\Filesystem\FilesystemFactory;
use App\Framework\Filesystem\InMemoryStorage;
use App\Framework\Filesystem\FileStorage;
it('lädt File-Properties erst bei Bedarf', function() {
// Test-Storage mit Instrumentierung
$storage = new class extends InMemoryStorage {
public array $accessed = [];
public function get(string $path): string {
$this->accessed[] = "get:{$path}";
return parent::get($path);
}
public function size(string $path): int {
$this->accessed[] = "size:{$path}";
return parent::size($path);
}
};
// Testdatei hinzufügen
$storage->addFile('/test.txt', 'Testinhalt');
// Lazy File erstellen
$file = $storage->file('/test.txt');
// Sollte noch keine Storage-Methoden aufgerufen haben
expect($storage->accessed)->toBeEmpty();
// Zugriff auf path sollte kein Laden auslösen
$path = $file->path;
expect($storage->accessed)->toBeEmpty();
// Zugriff auf contents sollte get() auslösen
$contents = $file->contents;
expect($storage->accessed)->toContain('get:/test.txt');
expect($contents)->toBe('Testinhalt');
// Zugriff auf size sollte size() auslösen
$size = $file->size;
expect($storage->accessed)->toContain('size:/test.txt');
expect($size)->toBe(10); // Länge von 'Testinhalt'
});
it('lädt Directory-Properties erst bei Bedarf', function() {
// Test-Storage mit Instrumentierung
$storage = new class extends InMemoryStorage {
public array $accessed = [];
public function listDirectory(string $directory): array {
$this->accessed[] = "list:{$directory}";
return parent::listDirectory($directory);
}
};
// Testverzeichnis erstellen
$storage->createDirectory('/test-dir');
$storage->addFile('/test-dir/file1.txt', 'Datei 1');
$storage->addFile('/test-dir/file2.txt', 'Datei 2');
// Lazy Directory erstellen
$dir = $storage->directory('/test-dir');
// Sollte noch keine Storage-Methoden aufgerufen haben
expect($storage->accessed)->toBeEmpty();
// Zugriff auf path sollte kein Laden auslösen
$path = $dir->path;
expect($storage->accessed)->toBeEmpty();
// Zugriff auf contents sollte listDirectory() auslösen
$contents = $dir->contents;
expect($storage->accessed)->toContain('list:/test-dir');
expect($contents)->toHaveCount(2);
});
it('kann mit echtem FileStorage arbeiten', function() {
// Dieser Test kann übersprungen werden, wenn keine Schreibrechte im Temp-Verzeichnis vorhanden sind
$tempDir = sys_get_temp_dir() . '/php-lazy-test-' . uniqid();
@mkdir($tempDir, 0777, true);
if (!is_dir($tempDir) || !is_writable($tempDir)) {
$this->markTestSkipped('Kein Schreibzugriff im Temp-Verzeichnis');
}
try {
// Echten FileStorage verwenden
$storage = new FileStorage();
// Testdatei erstellen
$testFile = $tempDir . '/test.txt';
file_put_contents($testFile, 'Lazy Loading Test');
// Lazy File erstellen
$file = $storage->file($testFile);
// Properties testen
expect($file->path)->toBe($testFile);
expect($file->contents)->toBe('Lazy Loading Test');
expect($file->size)->toBe(17); // Länge von 'Lazy Loading Test'
expect($file->lastModified)->toBeGreaterThan(time() - 10);
// Directory testen
$dir = $storage->directory($tempDir);
expect($dir->exists())->toBeTrue();
$files = $dir->getFiles();
expect($files)->toHaveCount(1);
expect($files[0]->path)->toEndWith('/test.txt');
} finally {
// Aufräumen
@unlink($testFile);
@rmdir($tempDir);
}
});