create() verknuepft // keinen User (user_id bleibt NULL, siehe CustomerFactory) — jeder bestehende // Test, der einen Kunden anmeldet, ruft dafuer ensureUser() (Muster: // tests/Feature/CustomerTwoFactorTest.php::portalUser()). Der RUECKGABEWERT // wird gebraucht, nicht $customer->user danach: ensureUser() selbst liest // $this->user als ersten Schritt ("if ($this->user) return $this->user;"), // bevor user_id gesetzt ist — das cacht die Beziehung als null, und ein // spaeteres update() raeumt einen bereits geladenen Beziehungs-Cache nicht // weg. $customer->user bliebe also null, obwohl user_id laengst gesetzt ist. it('zeigt dem Inhaber die Sperren seiner eigenen Instanz', function () { $customer = Customer::factory()->create(); $user = $customer->ensureUser(); $instance = Instance::factory()->for($customer)->create(); $block = SecurityBlock::factory()->for($instance)->create(['ip' => '203.0.113.7']); Livewire::actingAs($user)->test(Security::class)->assertSee('203.0.113.7'); }); it('zeigt einem Inhaber die Sperren eines FREMDEN Kunden nicht', function () { $meine = Customer::factory()->create(); $user = $meine->ensureUser(); $fremde = Instance::factory()->create(); SecurityBlock::factory()->for($fremde)->create(['ip' => '198.51.100.9']); Livewire::actingAs($user)->test(Security::class)->assertDontSee('198.51.100.9'); }); it('laesst einen Inhaber eine fremde Sperre nicht aufheben', function () { $meine = Customer::factory()->create(); $user = $meine->ensureUser(); $fremd = SecurityBlock::factory()->for(Instance::factory()->create())->create(); Livewire::actingAs($user)->test(Security::class) ->call('onReleaseConfirmed', $fremd->uuid) ->assertForbidden(); expect($fremd->fresh()->released_at)->toBeNull(); }); it('hebt eine eigene Sperre auf und traegt ein, wer es war', function () { $customer = Customer::factory()->create(); $user = $customer->ensureUser(); $instance = Instance::factory()->for($customer)->create(); $block = SecurityBlock::factory()->for($instance)->create(); Livewire::actingAs($user)->test(Security::class) ->call('onReleaseConfirmed', $block->uuid); expect($block->fresh()->released_at)->not->toBeNull() ->and($block->fresh()->released_by_id)->toBe($user->id); });