feat: add routes, lang, tests, stubs, docs, and docker configurations

This commit is contained in:
2026-05-21 16:05:16 +07:00
parent fad70d096b
commit 28a06315b8
3385 changed files with 177070 additions and 0 deletions
@@ -0,0 +1,78 @@
<?php
use App\Services\System\BackupManagementService;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\UnableToCreateDirectory;
beforeEach(function () {
Cache::flush();
$this->service = app(BackupManagementService::class);
});
test('checkRequirements returns ok shape with binary status', function () {
$result = $this->service->checkRequirements();
expect($result)->toHaveKey('status');
expect($result['status'])->toBeBool();
if (isset($result['binary'])) {
expect($result['binary'])->toBeIn(['pg_dump', 'mysqldump']);
}
});
test('testConnection on local disk succeeds', function () {
// Storage::fake may fail in Docker containers with restricted permissions
try {
Storage::fake('local');
} catch (UnableToCreateDirectory $e) {
$this->markTestSkipped('Cannot create fake disk in this environment: '.$e->getMessage());
}
Config::set('backup.backup.destination.disks', ['local']);
$result = $this->service->testConnection();
expect($result['success'])->toBeTrue();
expect($result['message'])->toContain('Successfully');
});
test('parseBytes round-trips through formatBytes for whole units', function () {
$ref = new ReflectionMethod(BackupManagementService::class, 'parseBytes');
$ref->setAccessible(true);
expect($ref->invoke($this->service, '1 KB'))->toBe(1024.0);
expect($ref->invoke($this->service, '1 MB'))->toBe(1048576.0);
expect($ref->invoke($this->service, '2 GB'))->toBe(2.0 * 1024 * 1024 * 1024);
expect($ref->invoke($this->service, '512 B'))->toBe(512.0);
});
test('parseBytes returns raw float when no unit suffix', function () {
$ref = new ReflectionMethod(BackupManagementService::class, 'parseBytes');
$ref->setAccessible(true);
expect($ref->invoke($this->service, '4096'))->toBe(4096.0);
});
test('parseBytes ignores unknown units', function () {
$ref = new ReflectionMethod(BackupManagementService::class, 'parseBytes');
$ref->setAccessible(true);
expect($ref->invoke($this->service, '10 XB'))->toBe(10.0);
});
test('parseBytes handles fractional values', function () {
$ref = new ReflectionMethod(BackupManagementService::class, 'parseBytes');
$ref->setAccessible(true);
expect($ref->invoke($this->service, '1.5 KB'))->toBe(1536.0);
});
test('formatBytes private helper renders KB/MB/GB units', function () {
$ref = new ReflectionMethod(BackupManagementService::class, 'formatBytes');
$ref->setAccessible(true);
expect($ref->invoke($this->service, 1024))->toBe('1 KB');
expect($ref->invoke($this->service, 1024 * 1024))->toBe('1 MB');
expect($ref->invoke($this->service, 1024 * 1024 * 1024))->toBe('1 GB');
});