From 4a6683f3358df4c142a7e0e297503e9ba712b491 Mon Sep 17 00:00:00 2001 From: Panfilov Konstantin Date: Wed, 28 Oct 2026 05:34:19 +0300 Subject: [PATCH] =?UTF-8?q?test:=20=D1=83=D1=87=D0=B8=D1=82=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B8=D0=B5?= =?UTF-8?q?=20UTM=20defaults=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D1=86=D0=B0=20=D0=B2=20stage=20CI=20#347?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/check-numeric-utm.php | 22 +++++++++++++++++++--- tests/check-utm-redirect-contract.php | 5 ++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/tests/check-numeric-utm.php b/tests/check-numeric-utm.php index 9d4d497..e79d44e 100644 --- a/tests/check-numeric-utm.php +++ b/tests/check-numeric-utm.php @@ -17,13 +17,29 @@ foreach(['2','rnd','dark','abcdx','abc',[],null,'abcd0'] as $value) { if(prelandResolveUtm(["theme"=>"абвг2"],$config)["digits"]["theme"]!=="2")throw new RuntimeException("Unicode fifth symbol"); for($i=0;$i<50;$i++) if(prelandResolveUtm(['indpic'=>'abcd0'],$config)['digits']['indpic']!=='2')throw new RuntimeException('0 нарушил веса'); $settings=json_decode(file_get_contents(dirname(__DIR__).'/config.json'),true); -$defaults=['indpic'=>'1','theme'=>'1','degr'=>'1','reg'=>'2','banch'=>'2','tp'=>'2','cons'=>'2','focus'=>'1','part'=>'1']; +// Ожидаем настройки владельца, а не прежний Git-снимок. Отсутствующая группа использует продуктовый fallback. +$defaults=['indpic'=>'1','theme'=>'2','degr'=>'1','reg'=>'2','banch'=>'2','tp'=>'1','cons'=>'2','focus'=>'1','part'=>'1']; +foreach ($defaults as $key=>$fallback) $defaults[$key]=(string)($settings['utm'][$key]['default']??$fallback); +// Контрольные конфиги независимо закрепляют оба default и не зависят от текущего host config. +foreach (['1','2'] as $default) { + foreach (array_keys($defaults) as $key) { + $fixture=['utm'=>[$key=>['default'=>$default,'weights'=>['1'=>0,'2'=>100]]]]; + foreach (['1','2','rnd','abcdx','abc',[],null,"\xffabcd2"] as $invalid) { + if(prelandResolveUtm([$key=>$invalid],$fixture)['digits'][$key]!==$default)throw new RuntimeException('Контрольный invalid URL изменил default '.$key.'='.$default); + } + foreach (['1','2'] as $digit) if(prelandResolveUtm([$key=>'abcd'.$digit],$fixture)['digits'][$key]!==$digit)throw new RuntimeException('Контрольный concrete URL изменил '.$key.'='.$digit); + } + foreach (['abcd1','1','b',[]] as $legacy) { + $resolved=prelandResolveUtm(['chob'=>$legacy,'bchoice'=>'b','chb'=>'a'],['utm'=>['banch'=>['default'=>$default,'weights'=>['1'=>0,'2'=>100]]]]); + if($resolved['digits']['banch']!==$default||isset($resolved['context']['chob'])||isset($resolved['context']['chb']))throw new RuntimeException('Legacy URL изменил контрольный banch default '.$default); + } +} foreach(array_keys($defaults) as $key) foreach(['1','rnd','abcdx','abc',[],null,"\xffabcd2"] as $invalid) { $resolved=prelandResolveUtm([$key=>$invalid,'registration'=>'before','bchoice'=>'b','chb'=>'a'],$settings); if($resolved['digits'][$key]!==$defaults[$key])throw new RuntimeException('Открытый/invalid URL изменил '.$key); if(isset($resolved['context']['chb']))throw new RuntimeException('Legacy chb прошёл как foreign'); } -if(prelandResolveUtm(['tp'=>'abcd9'],$settings)['digits']['tp']!=='2')throw new RuntimeException('Ненастроенная группа tp должна fallback'); +if(prelandResolveUtm(['tp'=>'abcd9'],['utm'=>['tp'=>['default'=>'2','weights'=>['1'=>100,'2'=>0]]]])['digits']['tp']!=='2')throw new RuntimeException('Ненастроенная группа tp должна fallback'); if(prelandResolveUtm(['cons'=>'abcd9'],$settings)['digits']['cons']!=='9')throw new RuntimeException('Cons concrete не зависит от random weights'); $zero=['utm'=>['theme'=>['weights'=>['2'=>0,'1'=>0],'default'=>'1'],'cons'=>['weights'=>['1'=>0,'2'=>0],'default'=>'2']]]; if(prelandResolveUtm(['theme'=>'abcd0'],$zero)['digits']['theme']!=='2')throw new RuntimeException('Generic zero weights обязаны выбрать первый ключ, как до #326'); @@ -31,7 +47,7 @@ if(prelandResolveUtm(['cons'=>'abcd0'],$zero)['digits']['cons']!=='2')throw new echo "OK: numeric public boundary, defaults, weighted0, foreign values\n"; foreach (['abcd1','1','b',[]] as $old) { $resolved=prelandResolveUtm(['chob'=>$old,'bchoice'=>'b','chb'=>'a'],$settings); - if($resolved['digits']['banch']!=='2'||isset($resolved['context']['chob']))throw new RuntimeException('api#327: внешний chob должен игнорироваться и удаляться'); + if($resolved['digits']['banch']!==$defaults['banch']||isset($resolved['context']['chob']))throw new RuntimeException('api#327: внешний chob должен игнорироваться и удаляться'); } $oldConfig=['utm'=>['chob'=>['weights'=>['1'=>5,'2'=>0],'default'=>'1']]]; if(prelandResolveUtm([],$oldConfig)['digits']['banch']!=='1')throw new RuntimeException('api#327: старый host config обязан работать до миграции'); diff --git a/tests/check-utm-redirect-contract.php b/tests/check-utm-redirect-contract.php index 94da22b..cf48664 100644 --- a/tests/check-utm-redirect-contract.php +++ b/tests/check-utm-redirect-contract.php @@ -45,7 +45,10 @@ if ($params !== $expected) { exit(1); } -if ($redirect_digits !== ['indpic'=>'1','theme'=>'1','degr'=>'1','reg'=>'2','banch'=>'2','tp'=>'2','cons'=>'2','focus'=>'1','part'=>'1']) { +// Type-in следует текущим default владельца; фиксируем полный состав, не исторический набор значений. +$expectedDigits=['indpic'=>'1','theme'=>'2','degr'=>'1','reg'=>'2','banch'=>'2','tp'=>'1','cons'=>'2','focus'=>'1','part'=>'1']; +foreach ($expectedDigits as $key=>$fallback) $expectedDigits[$key]=(string)($config['utm'][$key]['default']??$fallback); +if ($redirect_digits !== $expectedDigits) { throw new RuntimeException('Type-in обязан сохранить полный resolved numeric snapshot для handoff/recovery.'); }