From 4251b5fe56c786dd55f1a3e385acf34f6a175122 Mon Sep 17 00:00:00 2001 From: Artur Kyryliuk Date: Mon, 14 Sep 2026 13:18:38 +0200 Subject: [PATCH] fix(installer): artefacts in CLI-installed Evo 3.0 through 3.5.7 --- core/tests/Feature/SiteUpdateE2ETest.php | 23 +++++++++++-- .../update/SystemSettingsTableSeeder.php | 33 +++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 install/stubs/seeds/update/SystemSettingsTableSeeder.php diff --git a/core/tests/Feature/SiteUpdateE2ETest.php b/core/tests/Feature/SiteUpdateE2ETest.php index c5d737ab30..65d993b17f 100644 --- a/core/tests/Feature/SiteUpdateE2ETest.php +++ b/core/tests/Feature/SiteUpdateE2ETest.php @@ -68,7 +68,8 @@ class_alias(\Illuminate\Support\Facades\Schema::class, 'Schema'); /** * Create and seed a database that mirrors a site installed at "version N": * a healthy ACL baseline, legacy permission keys that the update seeder renames, - * and an existing (outdated) bundled Extras module — but no system task tables. + * and an existing (outdated) bundled Extras module — but no system task tables + * or settings that older CLI installers omitted. */ function seedVersionNDatabase(Capsule $capsule): void { @@ -139,6 +140,10 @@ function seedVersionNDatabase(Capsule $capsule): void $table->increments('id'); $table->string('name')->nullable(); }); + $schema->create('system_settings', function (Blueprint $table) { + $table->string('setting_name', 50)->primary(); + $table->text('setting_value')->nullable(); + }); $db = $capsule->getConnection(); @@ -209,7 +214,9 @@ public function applyExtrasModule(): void // Pre-state sanity: version "N" has no system task tables and legacy permission keys. expect($db->getSchemaBuilder()->hasTable('system_cli_tasks'))->toBeFalse() - ->and($db->table('permissions')->where('key', 'logout')->exists())->toBeTrue(); + ->and($db->table('permissions')->where('key', 'logout')->exists())->toBeTrue() + ->and($db->table('system_settings')->where('setting_name', 'site_id')->exists())->toBeFalse() + ->and($db->table('system_settings')->where('setting_name', 'manager_theme')->exists())->toBeFalse(); runSiteUpdateDatabaseSteps(); @@ -233,6 +240,18 @@ public function applyExtrasModule(): void ->and($db->table('role_permissions')->where('permission', 'widget_recent_info')->exists())->toBeTrue() ->and($db->table('role_permissions')->where('permission', 'manage_groups')->exists())->toBeTrue(); + // Older CLI installers omitted these settings. The update repairs them, + // and subsequent updates preserve the site's established values. + $siteId = $db->table('system_settings')->where('setting_name', 'site_id')->value('setting_value'); + expect($siteId)->toBeString()->not->toBe('') + ->and($db->table('system_settings')->where('setting_name', 'manager_theme')->value('setting_value'))->toBe('default'); + + $db->table('system_settings')->where('setting_name', 'manager_theme')->update(['setting_value' => 'custom']); + (new \EvolutionCMS\Installer\Update\SystemSettingsTableSeeder())->run(); + + expect($db->table('system_settings')->where('setting_name', 'site_id')->value('setting_value'))->toBe($siteId) + ->and($db->table('system_settings')->where('setting_name', 'manager_theme')->value('setting_value'))->toBe('custom'); + // Bundled Extras module refreshed from install/assets/modules/store.tpl. $extras = $db->table('site_modules')->where('name', 'Extras')->first(); expect($extras->description)->toContain('0.2.0') diff --git a/install/stubs/seeds/update/SystemSettingsTableSeeder.php b/install/stubs/seeds/update/SystemSettingsTableSeeder.php new file mode 100644 index 0000000000..ed3a1cca05 --- /dev/null +++ b/install/stubs/seeds/update/SystemSettingsTableSeeder.php @@ -0,0 +1,33 @@ +setWhenEmpty('site_id', uniqid('')); + $this->setWhenEmpty('manager_theme', 'default'); + } + + private function setWhenEmpty(string $name, string $value): void + { + $current = DB::table('system_settings') + ->where('setting_name', $name) + ->value('setting_value'); + + if (is_string($current) && $current !== '') { + return; + } + + DB::table('system_settings')->updateOrInsert( + ['setting_name' => $name], + ['setting_value' => $value] + ); + } +}