Add Resync test

This commit is contained in:
philipp lang 2023-02-08 00:14:59 +01:00
parent ecffc258df
commit 50bfa59c11
8 changed files with 103 additions and 26 deletions

View File

@ -28,7 +28,7 @@ class PullMemberAction
return Member::updateOrCreate(['nami_id' => $member->id], [
'firstname' => $member->firstname,
'lastname' => $member->lastname,
'joined_at' => $member->joinedAt ?: now(),
'joined_at' => $member->joinedAt,
'birthday' => $member->birthday,
'send_newspaper' => $member->sendNewspaper,
'address' => $member->address,

View File

@ -0,0 +1,10 @@
<?php
namespace App\Exceptions;
use Exception;
class MemberNotInNamiException extends Exception
{
//
}

View File

@ -15,7 +15,7 @@ class InitializeAction
{
use AsAction;
public $commandSignature = 'initialize {--mglnr=} {--password=} {--group=}';
public string $commandSignature = 'initialize {--mglnr=} {--password=} {--group=}';
public function handle(int $mglnr, string $password, int $groupId): void
{

View File

@ -16,7 +16,7 @@ class InitializeMembers
{
use AsAction;
public $commandSignature = 'member:pull';
public string $commandSignature = 'member:pull';
public function handle(Api $api): void
{

View File

@ -0,0 +1,45 @@
<?php
namespace App\Member\Actions;
use App\Actions\PullMemberAction;
use App\Actions\PullMembershipsAction;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Response;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\LaravelNami\Exceptions\Skippable;
class MemberResyncAction
{
use AsAction;
public function handle(Member $member, NamiSettings $settings): void
{
$api = $settings->login();
if (!$member->hasNami || !$member->group->hasNami) {
return;
}
try {
$localMember = app(PullMemberAction::class)->handle($member->group->nami_id, $member->nami_id);
} catch (Skippable $e) {
return;
}
app(PullMembershipsAction::class)->handle($localMember);
}
public function asController(ActionRequest $request, Member $member): RedirectResponse|Response
{
$this->handle(
$member,
app(NamiSettings::class),
);
return redirect()->back();
}
}

View File

@ -1,21 +0,0 @@
<?php
namespace App\Member\Controllers;
use App\Actions\PullMemberAction;
use App\Http\Controllers\Controller;
use App\Member\Member;
use App\Setting\NamiSettings;
use Illuminate\Http\RedirectResponse;
class MemberResyncController extends Controller
{
public function __invoke(Member $member, NamiSettings $settings): RedirectResponse
{
if ($member->hasNami) {
app(PullMemberAction::class)->api($settings->login())->member($member->group->nami_id, $member->nami_id)->execute();
}
return redirect()->route('member.edit', ['member' => $member])->success('Mitglied aktualisiert');
}
}

View File

@ -7,8 +7,8 @@ use App\Efz\ShowEfzDocumentAction;
use App\Home\Actions\IndexAction as HomeIndexAction;
use App\Initialize\Actions\InitializeAction;
use App\Initialize\Actions\InitializeFormAction;
use App\Member\Actions\MemberResyncAction;
use App\Member\Actions\MemberShowAction;
use App\Member\Controllers\MemberResyncController;
use App\Member\MemberController;
use App\Membership\Actions\MembershipDestroyAction;
use App\Membership\Actions\MembershipStoreAction;
@ -43,7 +43,7 @@ Route::group(['middleware' => 'auth:web'], function (): void {
Route::delete('/member/{member}/membership/{membership}', MembershipDestroyAction::class)->name('membership.destroy');
Route::resource('member.course', CourseController::class);
Route::get('/member/{member}/efz', ShowEfzDocumentAction::class)->name('efz');
Route::get('/member/{member}/resync', MemberResyncController::class)->name('member.resync');
Route::get('/member/{member}/resync', MemberResyncAction::class)->name('member.resync');
Route::get('/contribution', ContributionFormAction::class)->name('contribution.form');
Route::get('/contribution/generate', [ContributionController::class, 'generate'])->name('contribution.generate');
});

View File

@ -0,0 +1,43 @@
<?php
namespace Tests\Feature\Member;
use App\Actions\PullCoursesAction;
use App\Actions\PullMemberAction;
use App\Actions\PullMembershipsAction;
use App\Group;
use App\Member\Member;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
class ResyncTest extends TestCase
{
use DatabaseTransactions;
public function testItCanResyncAMember(): void
{
$this->login()->loginNami();
$member = Member::factory()->defaults()->for(Group::factory()->inNami(32))->inNami(33)->create();
PullMemberAction::shouldRun()->once()->with(32, 33)->andReturn($member);
PullMembershipsAction::shouldRun()->once()->with($member);
PullCoursesAction::shouldRun()->never();
$response = $this->from('/member')->get(route('member.resync', ['member' => $member]));
$response->assertRedirect('/member');
}
public function testItReturnsErrorWhenMemberIsNotInNami(): void
{
$this->login()->loginNami();
$member = Member::factory()->defaults()->create();
PullMemberAction::shouldRun()->never();
PullMembershipsAction::shouldRun()->never();
PullCoursesAction::shouldRun()->never();
$response = $this->from('/member')->get(route('member.resync', ['member' => $member]));
$response->assertRedirect('/member');
}
}