feat(admin): скрытие доменов и сохраняемый порядок колонок (#26)

This commit is contained in:
Panfilov Konstantin committed 2026-10-26 04:11:44 +03:00
1 parent dd6d221dd7
commit 00fbef9ede
12 files changed
+252 -33

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
require __DIR__.'/backend.php';
function targetProblem(callable $action,int $status,string $message): void {
try {$action();throw new RuntimeException($message.': accepted');}
catch(PrelandAdmin\Problem $e){check($e->status===$status,$message);}
}
$legacy=$store->read('targets.json');
unset($legacy['test']['hidden']);$store->write('targets.json',$legacy);
check($store->targets()[0]['hidden']===false,'legacy target is visible by default');
check($store->target('test')===$legacy['test'],'legacy raw target identity remains unchanged');
foreach(['b','c','d'] as $id)$store->saveTarget(['id'=>$id,'domain'=>$id.'.invalid','type'=>'local','root'=>$root.'/site']);
$store->setTargetVisibility('b',true);
$before=$store->target('b');
check($before['hidden']===true,'visibility persists independently of transport');
$unchanged=$legacy['test'];$store->setTargetVisibility('test',true);$afterVisibility=$store->target('test');unset($afterVisibility['hidden']);
check($afterVisibility===$unchanged,'visibility changes no credentials enabled verified or transport fields');
$store->setTargetVisibility('test',false);
$store->saveTarget(['id'=>'b','hidden'=>false]);
check($store->target('b')['hidden']===true,'editing connection cannot override hidden state');
$store->saveTarget(['id'=>'new','domain'=>'new.invalid','type'=>'local','root'=>$root.'/site','hidden'=>true]);
check($store->target('new')['hidden']===false,'new connection is visible and appended');
$store->orderTargets(['d','test','new','c']);
check(array_column((new PrelandAdmin\Store($root.'/state'))->targets(),'id')===['d','b','test','new','c'],'reorder persists while preserving hidden slot');
$store->setTargetVisibility('b',false);
check(array_column($store->targets(),'id')===['d','b','test','new','c'],'restore returns target to preserved slot');
$unchanged=$store->read('targets.json');
foreach([['d','b','test','new'],['d','b','test','new','new'],['d','b','test','new','missing']] as $ids)targetProblem(fn()=>$store->orderTargets($ids),409,'stale incomplete duplicate or unknown order is rejected');
check($store->read('targets.json')===$unchanged,'rejected reorder does not alter persisted state');
targetProblem(fn()=>$store->orderTargets(['d',1,'test','new','c']),422,'order requires string IDs');
targetProblem(fn()=>$store->setTargetVisibility('missing',true),404,'visibility missing target returns 404');
targetProblem(fn()=>$store->deleteTarget('missing'),404,'delete missing target returns 404');
targetProblem(fn()=>$store->deleteTarget('b'),409,'visible target cannot be deleted');
$store->setTargetVisibility('b',true);
$job=$jobs->create('check',['targets'=>['b'],'number'=>1]);
targetProblem(fn()=>$store->deleteTarget('b'),409,'queued target cannot be deleted');
$rawJob=$store->read('jobs/'.$job['id'].'.json');$rawJob['status']='running';$store->write('jobs/'.$job['id'].'.json',$rawJob);
targetProblem(fn()=>$store->deleteTarget('b'),409,'running target cannot be deleted');
check($store->target('b')['root']===$before['root'],'hiding and rejected deletion retain usable target transport');
$rawJob['status']='completed';$store->write('jobs/'.$job['id'].'.json',$rawJob);
$job=$jobs->create('copy',['source'=>['id'=>'b'],'targets'=>[['id'=>'test']]]);
targetProblem(fn()=>$store->deleteTarget('b'),409,'queued copy source cannot be deleted');
$rawJob=$store->read('jobs/'.$job['id'].'.json');$rawJob['status']='completed';$store->write('jobs/'.$job['id'].'.json',$rawJob);
$store->deleteTarget('b');
check(array_column($store->targets(),'id')===['d','test','new','c'],'hidden idle target deletes only its connection');
check(is_file($root.'/site/config.json'),'connection deletion keeps site files');
foreach(['d','test','new','c'] as $id)$store->setTargetVisibility($id,true);
$store->orderTargets([]);
check(array_column($store->targets(),'id')===['d','test','new','c'],'empty visible order preserves all hidden connections');
echo "Targets Store contract complete\n";