Files
duckbrain-toolbox/tests/group9_absorb_test.php
2026-10-05 15:08:39 -03:00

124 lines
4.9 KiB
PHP

<?php
use Toolbox\Catalog;
use Toolbox\Commands\AdoptCommand;
use Toolbox\Console;
use Toolbox\Installer;
use Toolbox\Lock;
Harness::suite('group9');
$GLOBALS['g9_repo'] = dirname(__DIR__);
Harness::it('el catálogo lista todos los paquetes absorbidos', function () {
$catalog = Catalog::fromRoot($GLOBALS['g9_repo']);
$names = array_keys($catalog->packages());
foreach (['http', 'crypto', 'text', 'cache', 'id', 'htmx', 'commands', 'test'] as $pkg) {
ok(in_array($pkg, $names, true), "paquete '{$pkg}' presente en el catálogo");
}
});
Harness::it('http instala su familia y resuelve compreFace -> curlRequest', function () {
$repo = $GLOBALS['g9_repo'];
$proj = tmpdir('proj');
$inst = new Installer($proj, $repo, new Console(), $proj . '/src');
$result = $inst->add(['http'], ['yes' => true]);
ok(is_file($proj . '/src/Libs/CurlRequest.php'));
ok(is_file($proj . '/src/Libs/CompreFace.php'));
$lock = Lock::load($proj);
ok($lock->has('http:compreFace') && $lock->has('http:curlRequest'), 'resuelve la dependencia');
rrmdir($proj);
});
Harness::it('htmx instala htmlComponent con su Sanitizer via dependencia', function () {
$repo = $GLOBALS['g9_repo'];
$proj = tmpdir('proj');
$inst = new Installer($proj, $repo, new Console(), $proj . '/src');
$inst->add(['htmx:htmx'], ['yes' => true]);
ok(is_file($proj . '/src/Libs/HTMX.php'));
ok(is_file($proj . '/src/Libs/HTMLComponent.php'), 'dependencia htmlComponent');
ok(is_file($proj . '/src/Libs/Sanitizer/SanitizerProxy.php'), 'directorio Sanitizer expandido');
rrmdir($proj);
});
Harness::it('test trae commands:cli y ejecuta post-install', function () {
$repo = $GLOBALS['g9_repo'];
$proj = tmpdir('proj');
$inst = new Installer($proj, $repo, new Console(), $proj . '/src');
$ran = [];
$result = $inst->add(['test'], ['yes' => true, 'postRunner' => function (string $c) use (&$ran) { $ran[] = $c; }]);
ok(is_file($proj . '/phpunit.xml'), 'phpunit.xml en ROOT_DIR');
ok(is_file($proj . '/tests/TestCase.php'), 'directorio tests expandido');
ok(Lock::load($proj)->has('commands:cli'), 'dependencia commands:cli instalada');
eq(2, count($ran), 'se ejecutaron los dos comandos de post-install');
rrmdir($proj);
});
Harness::it('no queda el Migration.php duplicado; sólo el de commands', function () {
$repo = $GLOBALS['g9_repo'];
ok(is_file($repo . '/packages/commands/src/Libs/Migration.php'), 'existe el de commands');
foreach (['http', 'crypto', 'text', 'cache', 'id'] as $pkg) {
ok(!is_file($repo . "/packages/{$pkg}/src/Libs/Migration.php"), "extras no filtró Migration.php a {$pkg}");
}
});
Harness::it('adopt registra copias idénticas y divergentes sin modificar archivos', function () {
$repo = $GLOBALS['g9_repo'];
$core = g7_core('0.1.0');
$proj = tmpdir('proj');
$projDiv = tmpdir('projdiv');
$aria2 = (string) file_get_contents($repo . '/packages/http/src/Libs/Aria2.php');
write_file($proj . '/src/Libs/Aria2.php', $aria2);
write_file($projDiv . '/src/Libs/Aria2.php', $aria2 . "\n// edicion local\n");
$before = (string) file_get_contents($projDiv . '/src/Libs/Aria2.php');
(new AdoptCommand(new Console()))->run(['--root=' . $proj, '--toolbox=' . $repo, '--core-dir=' . $core]);
$lock = Lock::load($proj);
ok($lock->has('http:aria2'), 'adopta la copia idéntica');
eq('adopted', $lock->component('http:aria2')['origin']);
(new AdoptCommand(new Console()))->run(['--root=' . $projDiv, '--toolbox=' . $repo, '--core-dir=' . $core]);
$lockD = Lock::load($projDiv);
ok($lockD->has('http:aria2'), 'adopta la copia divergente');
eq('local', $lockD->component('http:aria2')['origin'], 'la marca como edición local');
eq($before, file_get_contents($projDiv . '/src/Libs/Aria2.php'), 'no modifica el archivo');
ok(\Toolbox\Drift::isDrifted($projDiv . '/src/Libs/Aria2.php', $lockD->component('http:aria2')['files']['src/Libs/Aria2.php']), 'el drift queda detectado');
rrmdir($proj);
rrmdir($projDiv);
rrmdir($core);
});
Harness::it('adopt registra el core existente con sus hashes', function () {
$repo = $GLOBALS['g9_repo'];
$core = g7_core('0.1.0');
$proj = tmpdir('proj');
// Simula un proyecto heredado con el core copiado a mano.
foreach (['autoload.php', 'config.php', 'src/Libs/Router.php'] as $file) {
write_file($proj . '/' . $file, (string) file_get_contents($core . '/' . $file));
}
(new AdoptCommand(new Console()))->run(['--root=' . $proj, '--toolbox=' . $repo, '--core-dir=' . $core]);
$lock = Lock::load($proj);
ok($lock->core() !== null, 'core registrado en el lock');
ok(isset($lock->core()['files']['src/Libs/Router.php']), 'archivo del core con hash');
ok(!isset($lock->core()['files']['src/Libs/Aria2.php']), 'no adopta archivos ajenos');
rrmdir($proj);
rrmdir($core);
});