'']); check('账号传空 → 保留原账号(防止陷入未配置死循环)', $r['config']['username'] === 'admin', $r['config']['username']); check('账号传空 → 不算连接信息变化', $r['conn_changed'] === false); $r = ny_apply_config_input($old, ['username' => null]); check('账号传 null → 保留原账号', $r['config']['username'] === 'admin', var_export($r['config']['username'], true)); $r = ny_apply_config_input($old, ['password' => '******']); check('密码占位符 ****** → 不修改', $r['config']['password'] === 'secret'); $r = ny_apply_config_input($old, ['password' => '']); check('密码传空 → 不修改', $r['config']['password'] === 'secret'); $r = ny_apply_config_input($old, ['password' => 'newpwd']); check('密码传新值 → 更新', $r['config']['password'] === 'newpwd'); check('密码变化 → 标记连接信息已变', $r['conn_changed'] === true); $r = ny_apply_config_input($old, ['username' => 'admin2']); check('账号变化 → 标记连接信息已变', $r['conn_changed'] === true); $r = ny_apply_config_input($old, ['full_score' => 90, 'page_size' => 50]); check('仅改满分/分页 → 不触发重连', $r['conn_changed'] === false); check('满分已写入', (int)$r['config']['full_score'] === 90); check('未传的字段保持原值', (int)$r['config']['page_size'] === 50 && $r['config']['username'] === 'admin'); $r = ny_apply_config_input($old, ['refresh_interval' => 1]); check('刷新间隔最小值收敛到 3', (int)$r['config']['refresh_interval'] === 3); $r = ny_apply_config_input($old, ['base_url' => 'https://exam.nxxy335.top/']); check('base_url 去掉末尾斜杠', $r['config']['base_url'] === 'https://exam.nxxy335.top', $r['config']['base_url']); echo "\n== 4) 落盘诊断 ==\n"; $d = ny_config_diag(); check('诊断含 storage', isset($d['storage'])); check('诊断含目录可写标记', array_key_exists('dir_writable', $d)); check('诊断含配置文件可写标记', array_key_exists('cfg_writable', $d)); check('诊断含数据库可写标记', array_key_exists('db_writable', $d)); check('诊断含是否已存账号', array_key_exists('has_username', $d)); check('临时目录可写时 cfg_writable=true', $d['cfg_writable'] === true, json_encode($d, JSON_UNESCAPED_UNICODE)); echo "\n== 5) 数据库写入回读校验 ==\n"; if (class_exists('Db') && Db::pdo() !== null) { check('Db::settingsSet 成功返回 true', Db::settingsSet('__ny_test_key', 'hello') === true); check('Db::settingsGet 读回一致', Db::settingsGet('__ny_test_key', '') === 'hello'); Db::settingsDelete('__ny_test_key'); check('Db::settingsDelete 生效', Db::settingsGet('__ny_test_key', 'x') === 'x'); } else { echo " ⚠️ 无 pdo_sqlite,跳过数据库回读用例\n"; } echo "\n----------------------------------------\n"; echo "通过 {$pass} 项,失败 {$fail} 项\n"; exit($fail === 0 ? 0 : 1);