--wip-- [skip ci]

This commit is contained in:
philipp lang 2023-02-15 01:36:59 +01:00
parent 73fb79cd1a
commit 8462a572ac
5 changed files with 209 additions and 0 deletions

View File

@ -0,0 +1,43 @@
<?php
namespace App\Activity\Actions;
use App\Activity;
use Illuminate\Http\RedirectResponse;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
class ActivityStoreAction
{
use AsAction;
/**
* @param array<string, mixed> $payload
*/
public function handle(array $payload): Activity
{
$activity = Activity::create($payload);
$activity->subactivities()->sync($payload['subactivities']);
return $activity;
}
/**
* @return array<string, string>
*/
public function rules(): array
{
return [
'name' => 'required|max:255',
'subactivities' => 'present|array',
];
}
public function asController(ActionRequest $request): RedirectResponse
{
$this->handle($request->validated());
return redirect()->back();
}
}

View File

@ -193,5 +193,6 @@ return [
'event_name' => 'Veranstaltung',
'organizer' => 'Veranstalter',
'subscription_id' => 'Beitragsart',
'subactivities' => 'Untergliederungen',
],
];

View File

@ -1,5 +1,6 @@
<?php
use App\Activity\Actions\ActivityStoreAction;
use App\Activity\Actions\IndexAction as ActivityIndexAction;
use App\Contribution\Actions\FormAction as ContributionFormAction;
use App\Contribution\ContributionController;
@ -48,4 +49,5 @@ Route::group(['middleware' => 'auth:web'], function (): void {
Route::get('/contribution', ContributionFormAction::class)->name('contribution.form');
Route::get('/contribution/generate', [ContributionController::class, 'generate'])->name('contribution.generate');
Route::get('/activity', ActivityIndexAction::class)->name('activity.index');
Route::post('/activity', ActivityStoreAction::class)->name('activity.store');
});

View File

@ -0,0 +1,74 @@
<?php
namespace Tests\Feature\Activity;
use App\Activity;
use App\Subactivity;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
class StoreTest extends TestCase
{
use DatabaseTransactions;
public function testItStoresAnActivity(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$response = $this->from('/activity')->post(route('activity.store'), [
'name' => 'Lorem',
'subactivities' => [],
]);
$response->assertRedirect('/activity');
$this->assertDatabaseHas('activities', [
'name' => 'Lorem',
'nami_id' => null,
]);
$this->assertDatabaseCount('activity_subactivity', 0);
}
public function testNameIsRequired(): void
{
$this->login()->loginNami();
$response = $this->post(route('activity.store'), []);
$response->assertSessionHasErrors([
'name' => 'Name ist erforderlich.',
'subactivities' => 'Untergliederungen muss vorhanden sein.',
]);
}
public function testNamiIdIsNotSet(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$response = $this->post(route('activity.store'), [
'name' => 'Lorem',
'nami_id' => 556,
'subactivities' => [],
]);
$this->assertDatabaseHas('activities', [
'nami_id' => null,
]);
}
public function testItCanStoreASubactivityWithTheActivity(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$subactivity = Subactivity::factory()->create();
$response = $this->from('/activity')->post(route('activity.store'), [
'name' => 'Lorem',
'subactivities' => [$subactivity->id],
]);
$this->assertDatabaseCount('activity_subactivity', 1);
$this->assertDatabaseHas('activity_subactivity', [
'activity_id' => Activity::firstWhere('name', 'Lorem')->id,
'subactivity_id' => $subactivity->id,
]);
}
}

View File

@ -0,0 +1,89 @@
<?php
namespace Tests\Feature\Activity;
use App\Activity;
use App\Subactivity;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
class UpdateTest extends TestCase
{
use DatabaseTransactions;
public function testItCannotUpdateAnActivityFromNami(): void
{
$this->login()->loginNami();
$activity = Activity::factory()->inNami(67)->create();
$response = $this->patch(route('activity.update', ['activity' => $activity]), [
'name' => 'Lorem',
'subactivities' => [],
]);
$response->assertStatus(403);
}
public function testItUpdatesName(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$activity = Activity::factory()->name('before')->create();
$response = $this->from("/activity/{$activity->id}")->patch(route('activity.update', ['activity' => $activity]), [
'name' => 'after',
'subactivities' => [],
]);
$response->assertRedirect('/activity');
$this->assertDatabaseHas('activities', [
'name' => 'Lorem',
'nami_id' => null,
]);
$this->assertDatabaseCount('activity_subactivity', 0);
}
public function testNameIsRequired(): void
{
$this->login()->loginNami();
$activity = Activity::factory()->name('before')->create();
$response = $this->post(route('activity.store'), []);
$response->assertSessionHasErrors([
'name' => 'Name ist erforderlich.',
'subactivities' => 'Untergliederungen muss vorhanden sein.',
]);
}
public function testNamiIdIsNotSet(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$response = $this->post(route('activity.store'), [
'name' => 'Lorem',
'nami_id' => 556,
'subactivities' => [],
]);
$this->assertDatabaseHas('activities', [
'nami_id' => null,
]);
}
public function testItCanStoreASubactivityWithTheActivity(): void
{
$this->login()->loginNami()->withoutExceptionHandling();
$subactivity = Subactivity::factory()->create();
$response = $this->from('/activity')->post(route('activity.store'), [
'name' => 'Lorem',
'subactivities' => [$subactivity->id],
]);
$this->assertDatabaseCount('activity_subactivity', 1);
$this->assertDatabaseHas('activity_subactivity', [
'activity_id' => Activity::firstWhere('name', 'Lorem')->id,
'subactivity_id' => $subactivity->id,
]);
}
}