mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-10-29 03:28:53 -04:00
* fix(appconfig): refresh cached settings once and avoid stale same-request reads Addresses issue #3693, which has two related problems: 1. Repeated cache refreshes. Appconfig::batch_save() called save() per key, and save() unconditionally deleted + reloaded + re-cached the settings after every single write. A settings page with dozens of keys therefore refreshed the cache dozens of times in one request. batch_save() now persists all keys in the transaction and refreshes the cached settings exactly once after it commits successfully. save() keeps refreshing so direct single saves still work. 2. Stale same-request reads. Controllers copy config(OSPOS::class)->settings at construction time, so after a save in the same request the local copy is out of date. Config::postSaveInvoice() read the stale invoice_enable / default_register_mode values and sent the user to the wrong screen (e.g. opening a new sale instead of the invoice form after saving an enabled invoice). It now reads the freshly refreshed settings. Adds tests/Models/AppconfigTest.php covering batch_save() and save() refreshing the cached settings after a successful write. * test(3693): adopt test{Method}_{Purpose} naming convention Align AppconfigTest method names with the convention from #4730 (testBatchSave_PersistsAllKeysAndRefreshesCachedSettings, etc.), per review. * style(config): remove inline comments per review feedback --------- Co-authored-by: objecttothis <17935339+objecttothis@users.noreply.github.com>
74 lines
2.2 KiB
PHP
74 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace Tests\Models;
|
|
|
|
use App\Models\Appconfig;
|
|
use CodeIgniter\Test\CIUnitTestCase;
|
|
use CodeIgniter\Test\DatabaseTestTrait;
|
|
use Config\Database;
|
|
use Config\OSPOS;
|
|
|
|
class AppconfigTest extends CIUnitTestCase
|
|
{
|
|
use DatabaseTestTrait;
|
|
|
|
protected $migrate = true;
|
|
protected $migrateOnce = true;
|
|
protected $seed = '';
|
|
protected $seedOnce = true;
|
|
protected $refresh = true;
|
|
protected $namespace = null;
|
|
|
|
public static function setUpBeforeClass(): void
|
|
{
|
|
$seeder = Database::seeder('tests');
|
|
$seeder->call('TestDatabaseBootstrapSeeder');
|
|
}
|
|
|
|
private function appconfig(): Appconfig
|
|
{
|
|
return model(Appconfig::class);
|
|
}
|
|
|
|
public function testBatchSave_PersistsAllKeysAndRefreshesCachedSettings(): void
|
|
{
|
|
$appconfig = $this->appconfig();
|
|
$prefix = uniqid('ospos_batch_');
|
|
$keyA = $prefix . 'alpha';
|
|
$keyB = $prefix . 'beta';
|
|
$keyC = $prefix . 'gamma';
|
|
|
|
$success = $appconfig->batch_save([
|
|
$keyA => 'value-a',
|
|
$keyB => 'value-b',
|
|
$keyC => 'value-c',
|
|
]);
|
|
|
|
$this->assertTrue($success);
|
|
|
|
// Every key was written to the database.
|
|
$this->assertSame('value-a', $appconfig->get_value($keyA));
|
|
$this->assertSame('value-b', $appconfig->get_value($keyB));
|
|
$this->assertSame('value-c', $appconfig->get_value($keyC));
|
|
|
|
// The cached settings were refreshed after the transaction, so a
|
|
// consumer reading config(OSPOS::class)->settings sees the new values.
|
|
$settings = config(OSPOS::class)->settings;
|
|
$this->assertSame('value-a', $settings[$keyA]);
|
|
$this->assertSame('value-b', $settings[$keyB]);
|
|
$this->assertSame('value-c', $settings[$keyC]);
|
|
}
|
|
|
|
public function testSave_RefreshesCachedSettings(): void
|
|
{
|
|
$appconfig = $this->appconfig();
|
|
$key = uniqid('ospos_single_');
|
|
|
|
$success = $appconfig->save([$key => 'single-value']);
|
|
|
|
$this->assertTrue($success);
|
|
$this->assertSame('single-value', $appconfig->get_value($key));
|
|
$this->assertSame('single-value', config(OSPOS::class)->settings[$key]);
|
|
}
|
|
}
|