api#347: сохранить part в именованных наборах и процентных контрактах

This commit is contained in:
Panfilov Konstantin committed 2026-10-28 05:06:11 +03:00
1 parent 1993f7b4b1
commit f7d1792e23
10 files changed
+17 -13

No files matched your search

+4 -4
View File
@@ -5,17 +5,17 @@ require dirname(__DIR__).'/bootstrap.php';
use PrelandAdmin\{Config,Copy,LinkBuilder,Notes,Store,Problem};
function partCheck(bool $ok,string $message): void {if(!$ok)throw new RuntimeException($message);echo "PASS $message\n";}
$valid=Config::decode('{"host":"keep.example","metadata":{"keep":true},"utm":{"part":{"default":"2","weights":{"1":0,"2":100}},"unknown":{"keep":true}}}');
Config::validate($valid,static fn()=>true);
foreach (['{"default":"3","weights":{}}','{"default":"1","weights":{"9":1}}','{"default":"1","weights":{"2":-1}}'] as $group) {
Config::validate($valid);
foreach (['{"default":"3","weights":{}}','{"default":"1","weights":{"9":1}}','{"default":"1","weights":{"2":-1}}','{"default":"1","weights":{"1":1}}'] as $group) {
$invalid=Config::decode('{"utm":{"part":'.$group.'}}');$rejected=false;
try {Config::validate($invalid,static fn()=>true);}catch(Problem){$rejected=true;}
try {Config::validate($invalid);}catch(Problem){$rejected=true;}
partCheck($rejected,'invalid part enum/weights rejected');
}
$project=new ReflectionMethod(Copy::class,'project');$changes=$project->invoke(null,$valid);
$target=Config::decode('{"host":"before.example","notes":"keep","utm":{"part":{"default":"1","weights":{"1":1},"metadata":"keep"},"unknown":{"keep":true}}}');
$patched=Config::patch($target,$changes);
partCheck($patched->utm->part->default==='2'&&$patched->utm->part->weights->{'2'}===100,'copy includes part default and weights');
partCheck($patched->notes==='keep'&&$patched->utm->part->metadata==='keep'&&$patched->utm->unknown->keep===true,'copy preserves metadata and unknown groups');
partCheck($patched->host==='before.example'&&$patched->notes==='keep'&&$patched->utm->part->metadata==='keep'&&$patched->utm->unknown->keep===true,'copy preserves metadata and unknown groups');
$root=sys_get_temp_dir().'/part347-'.bin2hex(random_bytes(6));$store=new Store($root);
$notes=new Notes($store);$old=$notes->all();unset($old['part']);$store->write('utm-notes.json',$old);
$loaded=$notes->all();partCheck(isset($loaded['part'])&&array_diff_key($loaded,['part'=>true])===$old,'old notes gain empty part without losing notes/versions');