feat(KAN-47): redesign teams and membership management
# Conflicts: # resources/js/locales/en.ts
This commit is contained in:
@@ -214,4 +214,89 @@ class TeamControllerTest extends TestCase
|
||||
'scope_type' => $team->getMorphClass(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_team_managers_only_see_their_manageable_teams(): void
|
||||
{
|
||||
$manager = User::factory()->create();
|
||||
$managed = Team::factory()->create();
|
||||
$other = Team::factory()->create();
|
||||
$other->users()->attach($manager);
|
||||
$this->syncTeamPermissions($managed, $manager, ['team:manage']);
|
||||
|
||||
$this->actingAs($manager)->get(route('teams.index'))
|
||||
->assertInertia(fn (Assert $page) => $page
|
||||
->has('teams', 1)
|
||||
->where('teams.0.id', $managed->id)
|
||||
->where('canCreateTeams', false)
|
||||
);
|
||||
|
||||
$this->actingAs($manager)->patch(route('teams.members.update', $other), ['user_ids' => []])
|
||||
->assertForbidden();
|
||||
$this->actingAs($manager)->patch(route('teams.permissions.users.update', [$other, $manager]), ['permissions' => ['team:admin']])
|
||||
->assertForbidden();
|
||||
$this->assertDatabaseHas('team_user', ['team_id' => $other->id, 'user_id' => $manager->id]);
|
||||
$this->assertDatabaseMissing('permission_assignments', ['scope_id' => $other->id, 'scope_type' => $other->getMorphClass()]);
|
||||
}
|
||||
|
||||
public function test_invalid_team_names_are_rejected(): void
|
||||
{
|
||||
$admin = User::factory()->admin()->create();
|
||||
$team = Team::factory()->create();
|
||||
|
||||
foreach (['', $team->name, str_repeat('a', 256)] as $name) {
|
||||
$this->actingAs($admin)->from(route('teams.index'))->post(route('teams.store'), ['name' => $name])
|
||||
->assertRedirect(route('teams.index'))->assertSessionHasErrors('name');
|
||||
}
|
||||
$this->assertDatabaseCount('teams', 1);
|
||||
}
|
||||
|
||||
public function test_invalid_members_preserve_existing_membership(): void
|
||||
{
|
||||
$admin = User::factory()->admin()->create();
|
||||
$member = User::factory()->create();
|
||||
$team = Team::factory()->create();
|
||||
$team->users()->attach($member);
|
||||
|
||||
foreach ([[$member->id, $member->id], [999999], ['invalid']] as $ids) {
|
||||
$this->actingAs($admin)->patch(route('teams.members.update', $team), ['user_ids' => $ids])
|
||||
->assertSessionHasErrors('user_ids.0');
|
||||
$this->assertSame([$member->id], $team->users()->pluck('users.id')->all());
|
||||
}
|
||||
}
|
||||
|
||||
public function test_membership_and_direct_permissions_can_be_cleared_independently(): void
|
||||
{
|
||||
$manager = User::factory()->create();
|
||||
$member = User::factory()->create();
|
||||
$team = Team::factory()->create();
|
||||
$team->users()->attach($member);
|
||||
$this->syncTeamPermissions($team, $manager, ['team:manage']);
|
||||
$this->syncTeamPermissions($team, $member, ['team:invite']);
|
||||
|
||||
$this->actingAs($manager)->patch(route('teams.members.update', $team), ['user_ids' => []])
|
||||
->assertRedirect(route('teams.index'))->assertSessionHasNoErrors();
|
||||
$this->assertDatabaseMissing('team_user', ['team_id' => $team->id]);
|
||||
$this->assertDatabaseHas('permission_assignments', ['assignee_id' => $member->id, 'scope_id' => $team->id, 'permission' => 'team:invite']);
|
||||
|
||||
$team->users()->attach($member);
|
||||
$this->actingAs($manager)->patch(route('teams.permissions.users.update', [$team, $member]), ['permissions' => []])
|
||||
->assertRedirect(route('teams.index'))->assertSessionHasNoErrors();
|
||||
$this->assertDatabaseHas('team_user', ['team_id' => $team->id, 'user_id' => $member->id]);
|
||||
$this->assertDatabaseMissing('permission_assignments', ['assignee_id' => $member->id, 'scope_id' => $team->id, 'scope_type' => $team->getMorphClass()]);
|
||||
}
|
||||
|
||||
public function test_invalid_permissions_preserve_existing_assignments(): void
|
||||
{
|
||||
$admin = User::factory()->admin()->create();
|
||||
$member = User::factory()->create();
|
||||
$team = Team::factory()->create();
|
||||
$this->syncTeamPermissions($team, $member, ['team:invite']);
|
||||
|
||||
foreach ([['global:admin'], ['team:manage', 'team:manage'], ['unknown']] as $permissions) {
|
||||
$this->actingAs($admin)->patch(route('teams.permissions.users.update', [$team, $member]), ['permissions' => $permissions])
|
||||
->assertSessionHasErrors('permissions.0');
|
||||
$this->assertDatabaseHas('permission_assignments', ['assignee_id' => $member->id, 'scope_id' => $team->id, 'permission' => 'team:invite']);
|
||||
$this->assertDatabaseMissing('permission_assignments', ['assignee_id' => $member->id, 'permission' => 'global:admin']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user