gruene-seele/tests/Feature/ProductWpNumberTest.php
Kevin Adametz c171aa269a Warenwirtschaft: WP-Nummer aus Artikelnummer ableiten, wenn leer
Beim Produkt-Speichern wird eine leere wp_number aus der Artikelnummer
(number) befüllt, reduziert auf reine Ziffern (Integer-Spalte). Die
Ableitung passiert vor der Validierung, damit die Unique-Regel greift.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 09:17:53 +00:00

96 lines
2.6 KiB
PHP

<?php
use App\Models\Product;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
function wpnMakeUser(): User
{
$user = User::query()->create([
'email' => uniqid('wpn_', true).'@test.example',
'password' => bcrypt('password'),
]);
$user->forceFill([
'admin' => 1,
'confirmed' => true,
'active' => true,
'wizard' => 100,
'blocked' => false,
])->save();
return $user->fresh();
}
test('leere wp_number wird aus der artikelnummer abgeleitet (nur ziffern)', function () {
$this->actingAs(wpnMakeUser(), 'user');
$response = $this->post(route('admin_product_store'), [
'id' => 'new',
'name' => 'WPN-Ableitung',
'number' => 'GS-10 234',
'wp_number' => '',
]);
$response->assertRedirect();
$product = Product::query()->where('name', 'WPN-Ableitung')->firstOrFail();
expect($product->wp_number)->toBe(10234);
});
test('gesetzte wp_number bleibt unangetastet', function () {
$this->actingAs(wpnMakeUser(), 'user');
$response = $this->post(route('admin_product_store'), [
'id' => 'new',
'name' => 'WPN-Gesetzt',
'number' => 'GS-10234',
'wp_number' => '555',
]);
$response->assertRedirect();
$product = Product::query()->where('name', 'WPN-Gesetzt')->firstOrFail();
expect($product->wp_number)->toBe(555);
});
test('artikelnummer ohne ziffern setzt keine wp_number', function () {
$this->actingAs(wpnMakeUser(), 'user');
$response = $this->post(route('admin_product_store'), [
'id' => 'new',
'name' => 'WPN-OhneZiffern',
'number' => 'GS-XL',
'wp_number' => '',
]);
$response->assertRedirect();
$product = Product::query()->where('name', 'WPN-OhneZiffern')->firstOrFail();
expect($product->wp_number)->toBeNull();
});
test('abgeleitete wp_number unterliegt der unique-pruefung', function () {
$this->actingAs(wpnMakeUser(), 'user');
Product::query()->create([
'name' => 'WPN-Bestand',
'title' => 'WPN-Bestand',
'active' => true,
'wp_number' => 10234,
]);
$response = $this->post(route('admin_product_store'), [
'id' => 'new',
'name' => 'WPN-Kollision',
'number' => 'GS-10234',
'wp_number' => '',
]);
// Bei Validierungsfehlern rendert der Controller die Edit-View direkt (kein Redirect).
$response->assertOk();
$response->assertViewHas('errors', fn ($errors) => $errors->has('wp_number'));
expect(Product::query()->where('name', 'WPN-Kollision')->exists())->toBeFalse();
});