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(); });