117 lines
4.5 KiB
PHP
117 lines
4.5 KiB
PHP
<?php
|
|
|
|
use App\Enums\OrganisationRole;
|
|
use App\Models\Organisation;
|
|
use App\Models\OrganisationInvitation;
|
|
use App\Models\User;
|
|
use Inertia\Testing\AssertableInertia;
|
|
|
|
it('lists organisation members', function () {
|
|
$owner = User::factory()->create();
|
|
$organisation = Organisation::factory()->create(['owner_id' => $owner->id]);
|
|
$member = User::factory()->create();
|
|
$organisation->members()->attach($member, ['role' => OrganisationRole::MEMBER]);
|
|
|
|
$this->actingAs($owner)
|
|
->get(route('organisation-members.index', $organisation))
|
|
->assertOk()
|
|
->assertInertia(fn (AssertableInertia $page) => $page
|
|
->component('organisation-members/Index', false)
|
|
->has('organisation.members', 1)
|
|
->has('organisation.invitations', 0));
|
|
});
|
|
|
|
it('adds updates and removes organisation members', function () {
|
|
$owner = User::factory()->create();
|
|
$organisation = Organisation::factory()->create(['owner_id' => $owner->id]);
|
|
$member = User::factory()->create(['email' => 'member@example.com']);
|
|
|
|
$this->actingAs($owner)
|
|
->post(route('organisation-members.store', $organisation), [
|
|
'email' => 'member@example.com',
|
|
'role' => OrganisationRole::MEMBER->value,
|
|
])
|
|
->assertRedirect(route('organisation-members.index', $organisation));
|
|
|
|
expect($organisation->members()->whereKey($member->id)->exists())->toBeTrue();
|
|
|
|
$this->actingAs($owner)
|
|
->put(route('organisation-members.update', [
|
|
'organisation' => $organisation->id,
|
|
'member' => $member->id,
|
|
]), [
|
|
'role' => OrganisationRole::ADMIN->value,
|
|
])
|
|
->assertRedirect(route('organisation-members.index', $organisation));
|
|
|
|
expect($organisation->members()->whereKey($member->id)->first()->membership->role)
|
|
->toBe(OrganisationRole::ADMIN);
|
|
|
|
$this->actingAs($owner)
|
|
->delete(route('organisation-members.destroy', [
|
|
'organisation' => $organisation->id,
|
|
'member' => $member->id,
|
|
]))
|
|
->assertRedirect(route('organisation-members.index', $organisation));
|
|
|
|
expect($organisation->members()->whereKey($member->id)->exists())->toBeFalse();
|
|
});
|
|
|
|
it('creates updates and cancels pending organisation invitations', function () {
|
|
$owner = User::factory()->create();
|
|
$organisation = Organisation::factory()->create(['owner_id' => $owner->id]);
|
|
|
|
$this->actingAs($owner)
|
|
->post(route('organisation-members.store', $organisation), [
|
|
'email' => 'pending@example.com',
|
|
'role' => OrganisationRole::MEMBER->value,
|
|
])
|
|
->assertRedirect(route('organisation-members.index', $organisation));
|
|
|
|
$invitation = $organisation->invitations()->where('email', 'pending@example.com')->firstOrFail();
|
|
|
|
expect($invitation->role)->toBe(OrganisationRole::MEMBER)
|
|
->and($invitation->token)->not->toBeEmpty()
|
|
->and($invitation->invited_by_user_id)->toBe($owner->id);
|
|
|
|
$this->actingAs($owner)
|
|
->get(route('organisation-members.index', $organisation))
|
|
->assertOk()
|
|
->assertInertia(fn (AssertableInertia $page) => $page
|
|
->component('organisation-members/Index', false)
|
|
->where('organisation.invitations.0.email', 'pending@example.com'));
|
|
|
|
$this->actingAs($owner)
|
|
->put(route('organisation-invitations.update', [
|
|
'organisation' => $organisation->id,
|
|
'invitation' => $invitation->id,
|
|
]), [
|
|
'role' => OrganisationRole::ADMIN->value,
|
|
])
|
|
->assertRedirect(route('organisation-members.index', $organisation));
|
|
|
|
expect($invitation->refresh()->role)->toBe(OrganisationRole::ADMIN);
|
|
|
|
$this->actingAs($owner)
|
|
->delete(route('organisation-invitations.destroy', [
|
|
'organisation' => $organisation->id,
|
|
'invitation' => $invitation->id,
|
|
]))
|
|
->assertRedirect(route('organisation-members.index', $organisation));
|
|
|
|
expect(OrganisationInvitation::query()->whereKey($invitation->id)->exists())->toBeFalse();
|
|
});
|
|
|
|
it('does not remove the organisation owner', function () {
|
|
$owner = User::factory()->create();
|
|
$organisation = Organisation::factory()->create(['owner_id' => $owner->id]);
|
|
$organisation->members()->attach($owner, ['role' => OrganisationRole::ADMIN]);
|
|
|
|
$this->actingAs($owner)
|
|
->delete(route('organisation-members.destroy', [
|
|
'organisation' => $organisation->id,
|
|
'member' => $owner->id,
|
|
]))
|
|
->assertUnprocessable();
|
|
});
|