d2d.emegrendeles.hu/tests/Feature/PricelistUnitValidationTest.php
E98Developer 67d2f73eee ADD EV3-465 méter ("m") mértékegység a Legkisebb eladási egységhez és a Mennyiségi egységhez
Bunzl árlistájához szükséges egy eddig hiányzó mértékegység. A "Legkisebb
eladási egység" / "Mennyiségi egység" mezőt két párhuzamos árlista-import
validálja külön-külön (a régi PriceListService.php ProductUnitEnum-mal, az új
PricelistFileProcessService.php saját PricelistSellerUnitEnum-mal), mindkettő
végül ugyanabba a products.sellerUnit / products.amountUnit DB enum oszlopba
ír. A puszta enum-bővítés önmagában nem lett volna elég: a DB oszlop
korlátozta volna a végrehajtást, csak ott, a legkésőbbi ponton bukva el.

- ProductUnitEnum: új 'm' case (régi pipeline validációja + a DB oszlopokat
  generáló forrás).
- PricelistSellerUnitEnum: új 'm' case (új pipeline validációja).
- Migráció: products.sellerUnit/amountUnit és order_archives_items ugyanezen
  oszlopainak DB enum bővítése 'm'-mel, ProductUnitEnum::getKeys()-ből
  generálva, hogy a PHP enum és a DB oszlop ne csúszhasson el egymástól. A
  down() az 'm' értékű sorokat NULL-ra állítja visszagörgetéskor, különben a
  szűkített enum miatt az ALTER hibára futna. A "Mértékegység" (productUnit)
  oszlopot szándékosan nem bővítettem, a jegy csak a másik két mezőt említi.
- schema:dump frissítve.

5 új teszt mindkét pipeline validációjára és a DB enum oszlopra.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 17:28:01 +02:00

64 lines
2.1 KiB
PHP

<?php
use App\Enums\PricelistSellerUnitEnum;
use App\Enums\ProductUnitEnum;
use App\Models\ProfitCenter;
use App\Models\Supplier;
use App\Services\PriceListService;
use App\Services\PricelistFileProcessService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
/**
* A validateSellerUnit()/validateAmountUnit() protected metódusok meghívása reflectionnel
* (lásd PricelistColumnMappingTest.php hasonló mintáját a buildColumnMap()-hoz).
*/
function invokeUnitValidator(string $method, string $unitValue): ?string
{
$service = app(PricelistFileProcessService::class);
$reflection = new ReflectionMethod($service, $method);
$reflection->setAccessible(true);
$header = match ($method) {
'validateSellerUnit' => PriceListService::EXPECTED_HEADERS[9],
'validateAmountUnit' => PriceListService::EXPECTED_HEADERS[11],
};
return $reflection->invoke($service, [$header => $unitValue]);
}
it('accepts "m" as a valid seller unit in the new pricelist pipeline (EV3-465)', function () {
expect(invokeUnitValidator('validateSellerUnit', 'm'))->toBeNull();
});
it('accepts "m" as a valid amount unit in the new pricelist pipeline (EV3-465)', function () {
expect(invokeUnitValidator('validateAmountUnit', 'm'))->toBeNull();
});
it('still rejects an unknown seller unit', function () {
expect(invokeUnitValidator('validateSellerUnit', 'nincs-ilyen'))->not->toBeNull();
});
it('accepts "m" as a valid ProductUnitEnum value, used by the legacy pricelist pipeline', function () {
expect(ProductUnitEnum::hasValue('m'))->toBeTrue();
});
it('persists a product with "m" seller and amount unit (DB enum column check)', function () {
$supplier = Supplier::factory()->create();
$product = App\Models\Product::create([
'name' => 'Bunzl teszttermék',
'supplier_id' => $supplier->id,
'sellerUnit' => 'm',
'amountUnit' => 'm',
'status' => App\Enums\DbStatusFieldEnum::active,
]);
$product->refresh();
expect($product->sellerUnit)->toBe('m');
expect($product->amountUnit)->toBe('m');
});