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'); });