Files
SGF/tests/Unit/PurchasingPackageTest.php
T
2026-11-02 08:06:45 +02:00

46 lines
2.2 KiB
PHP

<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
use Tempo\Distribution\Release;
use Tempo\Purchasing\Supply\ReplenishmentProjection;
require_once __DIR__.'/../../packages/purchasing/bootstrap.php';
final class PurchasingPackageTest extends TestCase
{
private function policy(): array
{
return ['daily_milli' => 10000, 'safety_milli' => 20000, 'target_milli' => 100000, 'maximum_milli' => 120000,
'lead_days' => 4, 'approval_days' => 1, 'minimum_milli' => 24000, 'pack_milli' => 12000, 'horizon_days' => 30];
}
public function test_sgf_executes_the_transferred_purchasing_engine_without_a_source_checkout(): void
{
$release = Release::current(dirname(__DIR__, 2));
self::assertNotNull($release);
self::assertContains('inventory.replenishment_projection', $release['capabilities']);
$class = new \ReflectionClass(ReplenishmentProjection::class);
self::assertStringStartsWith(realpath(dirname(__DIR__, 2).'/packages/purchasing/releases'), $class->getFileName());
$result = (new ReplenishmentProjection)->calculate($this->policy(), 120000, '2026-11-01');
self::assertSame('2026-11-10', $result['risk_date']);
self::assertSame('2026-11-06', $result['order_date']);
self::assertSame('2026-11-05', $result['request_date']);
self::assertSame(84000, $result['quantity_milli']);
}
public function test_sgf_preserves_exact_historical_rate_and_lot_expiry_results(): void
{
$engine = new ReplenishmentProjection;
$policy = [...$this->policy(), 'horizon_days' => 3, 'daily_rate' => ['numerator_milli' => 1000, 'denominator_days' => 3]];
$rate = $engine->calculate($policy, 10000, '2026-11-01');
self::assertSame([334, 333, 333], array_column($rate['series'], 'demand_milli'));
self::assertSame(9000, $rate['series'][2]['balance_milli']);
$lots = $engine->calculate([...$this->policy(), 'horizon_days' => 2], 10000, '2026-11-01', [], [], 0, [], [['quantity' => 10000, 'last_usable_on' => '2026-11-01']]);
self::assertSame(0, $lots['series'][1]['expired_milli']);
self::assertSame(-10000, $lots['series'][1]['balance_milli']);
}
}