Skip to content

Commit d6edea3

Browse files
Add test that a user with references cannot be deleted
1 parent 7195ede commit d6edea3

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

lang/de.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
":name cannot be deleted because (s)he is responsible for :count events.": "{1} :name kann nicht gelöscht werden, weil er\/sie für :count Veranstaltung verantwortlich ist. |[2,*] :name kann nicht gelöscht werden, weil er\/sie für :count Veranstaltungen verantwortlich ist.",
1717
":name cannot be deleted because (s)he is responsible for :count organizations.": "{1} :name kann nicht gelöscht werden, weil er\/sie für :count Organisation verantwortlich ist. |[2,*] :name kann nicht gelöscht werden, weil er\/sie für :count Organisationen verantwortlich ist.",
1818
":name cannot be deleted because (s)he uploaded :count documents.": "{1} :name kann nicht gelöscht werden, weil er\/sie :count Dokument hochgeladen hat. |[2,*] :name kann nicht gelöscht werden, weil er\/sie :count Dokumente hochgeladen hat.",
19-
":name cannot be deleted because it is your own account.": ":name kann nicht gelöscht werden, da es sich um das eigene Konto handelt",
19+
":name cannot be deleted because it is your own account.": ":name kann nicht gelöscht werden, da es sich um das eigene Konto handelt.",
2020
":name commented at :created_at.": ":name kommentierte am :created_at.",
2121
":name created successfully.": ":name erfolgreich erstellt.",
2222
":name deleted successfully.": ":name erfolgreich gelöscht.",

tests/Feature/Http/UserControllerTest.php

+36
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
use App\Models\UserRole;
1313
use App\Notifications\AccountCreatedNotification;
1414
use App\Policies\UserPolicy;
15+
use Closure;
1516
use Illuminate\Foundation\Testing\RefreshDatabase;
1617
use Illuminate\Support\Facades\Notification;
1718
use PHPUnit\Framework\Attributes\CoversClass;
19+
use PHPUnit\Framework\Attributes\DataProvider;
1820
use Tests\TestCase;
1921

2022
#[CoversClass(AccountCreatedNotification::class)]
@@ -121,6 +123,40 @@ public function testUserCanDeleteUsersOnlyWithCorrectAbility(): void
121123
$this->assertDatabaseMissing('users', ['id' => $user->id]);
122124
}
123125

126+
public function testUserCannotDeleteHimself(): void
127+
{
128+
$user = $this->actingAsUserWithAbility(Ability::DestroyUsers);
129+
130+
$this->delete("/users/{$user->id}")
131+
->assertForbidden()
132+
->assertSee('kann nicht gelöscht werden, da es sich um das eigene Konto handelt.');
133+
}
134+
135+
/**
136+
* @param Closure(): User $userProvider
137+
*/
138+
#[DataProvider('usersWithReferences')]
139+
public function testUserCannotBeDeletedBecauseOfReferences(Closure $userProvider, string $message): void
140+
{
141+
$user = $userProvider();
142+
143+
$this->assertUserCannotDeleteDespiteAbility("/users/{$user->id}", [Ability::ViewUsers, Ability::DestroyUsers], $message);
144+
}
145+
146+
/**
147+
* @return array<int, array{Closure(): User, string}>
148+
*/
149+
public static function usersWithReferences(): array
150+
{
151+
return [
152+
[fn () => self::createBooking()->bookedByUser, 'kann nicht gelöscht werden, weil er/sie 1 Anmeldung hat.'],
153+
[fn () => self::createDocument(static fn () => self::createEvent())->uploadedByUser, 'kann nicht gelöscht werden, weil er/sie 1 Dokument hochgeladen hat.'],
154+
[fn () => self::createUserResponsibleFor(self::createEvent()), 'kann nicht gelöscht werden, weil er/sie für 1 Veranstaltung verantwortlich ist.'],
155+
[fn () => self::createUserResponsibleFor(self::createEventSeries()), 'kann nicht gelöscht werden, weil er/sie für 1 Veranstaltungsreihe verantwortlich ist.'],
156+
[fn () => self::createUserResponsibleFor(self::createOrganization()), 'kann nicht gelöscht werden, weil er/sie für 1 Organisation verantwortlich ist. '],
157+
];
158+
}
159+
124160
private function createRandomUser(): User
125161
{
126162
return User::factory()->create();

tests/Traits/ActsAsUser.php

+8
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,14 @@ protected function assertUserCanPutWithAbility(string $route, array $data, Abili
184184
->assertRedirect($redirectRoute);
185185
}
186186

187+
protected function assertUserCannotDeleteDespiteAbility(string $route, Ability|array $ability, ?string $message): void
188+
{
189+
$this->actingAsUserWithAbility($ability);
190+
$this->delete($route)
191+
->assertForbidden()
192+
->assertSee($message);
193+
}
194+
187195
protected function createUserRoleWithAbility(Ability|array $ability): UserRole
188196
{
189197
if (is_array($ability)) {

tests/Traits/GeneratesTestData.php

+11
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,17 @@ protected static function createOrganization(): Organization
267267
->create();
268268
}
269269

270+
public static function createUserResponsibleFor(Event|EventSeries|Organization $responsibleFor): User
271+
{
272+
return User::factory()
273+
->hasAttached($responsibleFor, ['publicly_visible' => true], match ($responsibleFor::class) {
274+
Event::class => 'responsibleForEvents',
275+
EventSeries::class => 'responsibleForEventSeries',
276+
Organization::class => 'responsibleForOrganizations',
277+
})
278+
->create();
279+
}
280+
270281
protected static function createUsersWithBookings(BookingOption $bookingOption): Collection
271282
{
272283
return User::factory()

0 commit comments

Comments
 (0)