Files
coolify/tests/Feature/AtomicFilesystemTest.php
6b07f03107 feat(terminal): interactive console mode for containers (docker attach) (#11538)
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: rosslh <ross@rosshill.ca>
2026-10-14 14:32:02 +02:00

54 lines
1.7 KiB
PHP

<?php
use App\Support\AtomicFilesystem;
use Illuminate\Foundation\Console\ConfigCacheCommand;
use Illuminate\Foundation\Console\RouteCacheCommand;
beforeEach(function () {
$this->directory = sys_get_temp_dir().'/atomic-filesystem-'.bin2hex(random_bytes(4));
mkdir($this->directory);
});
afterEach(function () {
array_map('unlink', glob($this->directory.'/*'));
rmdir($this->directory);
});
it('writes the config and route caches with the atomic filesystem', function (string $command) {
$files = (fn () => $this->files)->call(app($command));
expect($files)->toBeInstanceOf(AtomicFilesystem::class);
})->with([
'config:cache' => ConfigCacheCommand::class,
'route:cache' => RouteCacheCommand::class,
]);
it('replaces the file with a new complete file and leaves no temporary file', function () {
$path = $this->directory.'/config.php';
file_put_contents($path, '<?php return [];');
$oldInode = fileinode($path);
$previousUmask = umask(0022);
try {
$bytes = (new AtomicFilesystem)->put($path, "<?php return ['app' => ['name' => 'Coolify']];");
} finally {
umask($previousUmask);
}
clearstatcache();
expect($bytes)->toBe(46)
->and(require $path)->toBe(['app' => ['name' => 'Coolify']])
->and(fileinode($path))->not->toBe($oldInode)
->and(fileperms($path) & 0777)->toBe(0644)
->and(glob($this->directory.'/*'))->toBe([$path]);
});
it('does not write the file outside its directory', function () {
$path = $this->directory.'/missing/config.php';
expect(fn () => (new AtomicFilesystem)->put($path, '<?php return [];'))
->toThrow(RuntimeException::class, 'Could not create a temporary file');
expect(file_exists($path))->toBeFalse();
});