5 - Add buffer multiplier parameter to CreateBucketAction
This commit is contained in:
parent
50b7caf1f9
commit
ad55a38c90
2 changed files with 79 additions and 1 deletions
|
|
@ -18,6 +18,7 @@ public function execute(
|
||||||
BucketTypeEnum $type = BucketTypeEnum::NEED,
|
BucketTypeEnum $type = BucketTypeEnum::NEED,
|
||||||
?float $allocationValue = null,
|
?float $allocationValue = null,
|
||||||
?int $priority = null,
|
?int $priority = null,
|
||||||
|
?float $bufferMultiplier = null,
|
||||||
): Bucket {
|
): Bucket {
|
||||||
// Validate type + allocation type constraints
|
// Validate type + allocation type constraints
|
||||||
$this->validateTypeConstraints($type, $allocationType);
|
$this->validateTypeConstraints($type, $allocationType);
|
||||||
|
|
@ -30,12 +31,23 @@ public function execute(
|
||||||
// Validate allocation value based on type
|
// Validate allocation value based on type
|
||||||
$this->validateAllocationValue($allocationType, $allocationValue);
|
$this->validateAllocationValue($allocationType, $allocationValue);
|
||||||
|
|
||||||
|
// Validate and normalize buffer multiplier
|
||||||
|
$bufferMultiplier = $bufferMultiplier ?? 0.0;
|
||||||
|
if ($bufferMultiplier < 0) {
|
||||||
|
throw new InvalidArgumentException('Buffer multiplier must be non-negative');
|
||||||
|
}
|
||||||
|
|
||||||
// Set allocation_value to null for unlimited buckets
|
// Set allocation_value to null for unlimited buckets
|
||||||
if ($allocationType === BucketAllocationTypeEnum::UNLIMITED) {
|
if ($allocationType === BucketAllocationTypeEnum::UNLIMITED) {
|
||||||
$allocationValue = null;
|
$allocationValue = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DB::transaction(function () use ($scenario, $name, $allocationType, $allocationValue, $priority, $type) {
|
// Buffer only applies to fixed_limit buckets
|
||||||
|
if ($allocationType !== BucketAllocationTypeEnum::FIXED_LIMIT) {
|
||||||
|
$bufferMultiplier = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DB::transaction(function () use ($scenario, $name, $allocationType, $allocationValue, $priority, $type, $bufferMultiplier) {
|
||||||
// Determine priority (append to end if not specified)
|
// Determine priority (append to end if not specified)
|
||||||
if ($priority === null) {
|
if ($priority === null) {
|
||||||
$maxPriority = $scenario->buckets()->max('priority') ?? 0;
|
$maxPriority = $scenario->buckets()->max('priority') ?? 0;
|
||||||
|
|
@ -68,6 +80,7 @@ public function execute(
|
||||||
'sort_order' => $priority, // Start with sort_order matching priority
|
'sort_order' => $priority, // Start with sort_order matching priority
|
||||||
'allocation_type' => $allocationType,
|
'allocation_type' => $allocationType,
|
||||||
'allocation_value' => $allocationValue,
|
'allocation_value' => $allocationValue,
|
||||||
|
'buffer_multiplier' => $bufferMultiplier,
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -359,4 +359,69 @@ public function test_creates_buckets_in_database_transaction(): void
|
||||||
$this->assertEquals('Bucket 2', $buckets[0]->name); // New bucket at priority 1
|
$this->assertEquals('Bucket 2', $buckets[0]->name); // New bucket at priority 1
|
||||||
$this->assertEquals('Bucket 1', $buckets[1]->name); // Original bucket shifted to priority 2
|
$this->assertEquals('Bucket 1', $buckets[1]->name); // Original bucket shifted to priority 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_can_create_fixed_limit_bucket_with_buffer_multiplier(): void
|
||||||
|
{
|
||||||
|
$bucket = $this->action->execute(
|
||||||
|
$this->scenario,
|
||||||
|
'Buffered Bucket',
|
||||||
|
BucketAllocationTypeEnum::FIXED_LIMIT,
|
||||||
|
allocationValue: 50000,
|
||||||
|
bufferMultiplier: 1.5,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals('1.50', $bucket->buffer_multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_buffer_multiplier_defaults_to_zero(): void
|
||||||
|
{
|
||||||
|
$bucket = $this->action->execute(
|
||||||
|
$this->scenario,
|
||||||
|
'No Buffer Bucket',
|
||||||
|
BucketAllocationTypeEnum::FIXED_LIMIT,
|
||||||
|
allocationValue: 50000,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals('0.00', $bucket->buffer_multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_buffer_multiplier_forced_to_zero_for_percentage_bucket(): void
|
||||||
|
{
|
||||||
|
$bucket = $this->action->execute(
|
||||||
|
$this->scenario,
|
||||||
|
'Percentage Bucket',
|
||||||
|
BucketAllocationTypeEnum::PERCENTAGE,
|
||||||
|
allocationValue: 25.0,
|
||||||
|
bufferMultiplier: 1.0,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals('0.00', $bucket->buffer_multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_buffer_multiplier_forced_to_zero_for_unlimited_bucket(): void
|
||||||
|
{
|
||||||
|
$bucket = $this->action->execute(
|
||||||
|
$this->scenario,
|
||||||
|
'Unlimited Bucket',
|
||||||
|
BucketAllocationTypeEnum::UNLIMITED,
|
||||||
|
BucketTypeEnum::OVERFLOW,
|
||||||
|
bufferMultiplier: 1.0,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals('0.00', $bucket->buffer_multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_throws_exception_for_negative_buffer_multiplier(): void
|
||||||
|
{
|
||||||
|
$this->expectException(InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('Buffer multiplier must be non-negative');
|
||||||
|
|
||||||
|
$this->action->execute(
|
||||||
|
$this->scenario,
|
||||||
|
'Bad Buffer',
|
||||||
|
BucketAllocationTypeEnum::FIXED_LIMIT,
|
||||||
|
allocationValue: 50000,
|
||||||
|
bufferMultiplier: -0.5,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue