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>
96 lines
2.6 KiB
PHP
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();
|
|
});
|