Add default value to Settings extender (#2495)

This commit is contained in:
Sami Mazouz 2021-01-05 07:28:25 +01:00 committed by GitHub
parent 7a6284c760
commit 111f615c60
2 changed files with 54 additions and 3 deletions

View File

@ -26,11 +26,12 @@ class Settings implements ExtenderInterface
* @param string $attributeName: The attribute name to be used in the ForumSerializer attributes array. * @param string $attributeName: The attribute name to be used in the ForumSerializer attributes array.
* @param string $key: The key of the setting. * @param string $key: The key of the setting.
* @param string|callable|null $callback: Optional callback to modify the value before serialization. * @param string|callable|null $callback: Optional callback to modify the value before serialization.
* @param mixed $default: Optional default serialized value. Will be run through the optional callback.
* @return $this * @return $this
*/ */
public function serializeToForum(string $attributeName, string $key, $callback = null) public function serializeToForum(string $attributeName, string $key, $callback = null, $default = null)
{ {
$this->settings[$key] = compact('attributeName', 'callback'); $this->settings[$key] = compact('attributeName', 'callback', 'default');
return $this; return $this;
} }
@ -45,7 +46,7 @@ class Settings implements ExtenderInterface
$attributes = []; $attributes = [];
foreach ($this->settings as $key => $setting) { foreach ($this->settings as $key => $setting) {
$value = $settings->get($key, null); $value = $settings->get($key, $setting['default']);
if (isset($setting['callback'])) { if (isset($setting['callback'])) {
$callback = ContainerUtil::wrapCallback($setting['callback'], $container); $callback = ContainerUtil::wrapCallback($setting['callback'], $container);

View File

@ -122,6 +122,56 @@ class SettingsTest extends TestCase
$this->assertArrayHasKey('customPrefix.customSetting2', $payload['data']['attributes']); $this->assertArrayHasKey('customPrefix.customSetting2', $payload['data']['attributes']);
$this->assertEquals('customValueModifiedByInvokable', $payload['data']['attributes']['customPrefix.customSetting2']); $this->assertEquals('customValueModifiedByInvokable', $payload['data']['attributes']['customPrefix.customSetting2']);
} }
/**
* @test
*/
public function custom_setting_falls_back_to_default()
{
$this->extend(
(new Extend\Settings())
->serializeToForum('customPrefix.noCustomSetting', 'custom-prefix.no_custom_setting', null, 'customDefault')
);
$this->prepDb();
$response = $this->send(
$this->request('GET', '/api', [
'authenticatedAs' => 1,
])
);
$payload = json_decode($response->getBody(), true);
$this->assertArrayHasKey('customPrefix.noCustomSetting', $payload['data']['attributes']);
$this->assertEquals('customDefault', $payload['data']['attributes']['customPrefix.noCustomSetting']);
}
/**
* @test
*/
public function custom_setting_default_passed_to_callback()
{
$this->extend(
(new Extend\Settings())
->serializeToForum('customPrefix.noCustomSetting', 'custom-prefix.no_custom_setting', function ($value) {
return $value.'Modified2';
}, 'customDefault')
);
$this->prepDb();
$response = $this->send(
$this->request('GET', '/api', [
'authenticatedAs' => 1,
])
);
$payload = json_decode($response->getBody(), true);
$this->assertArrayHasKey('customPrefix.noCustomSetting', $payload['data']['attributes']);
$this->assertEquals('customDefaultModified2', $payload['data']['attributes']['customPrefix.noCustomSetting']);
}
} }
class CustomInvokableClass class CustomInvokableClass