Skip to content

Commit

Permalink
fix: Tenant profile policy method
Browse files Browse the repository at this point in the history
  • Loading branch information
danharrin committed Aug 14, 2023
1 parent fa3366d commit fe8fb2c
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 2 deletions.
2 changes: 1 addition & 1 deletion packages/panels/src/Pages/Tenancy/EditTenantProfile.php
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ public static function getSlug(): string
public static function canView(Model $tenant): bool
{
try {
return authorize('edit', $tenant)->allowed();
return authorize('update', $tenant)->allowed();
} catch (AuthorizationException $exception) {
return $exception->toResponse()->allowed();
}
Expand Down
20 changes: 20 additions & 0 deletions tests/database/factories/TeamFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Filament\Tests\Database\Factories;

use Filament\Tests\Models\Team;
use Filament\Tests\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class TeamFactory extends Factory
{
protected $model = Team::class;

public function definition(): array
{
return [
'name' => $this->faker->company(),
];
}
}
22 changes: 22 additions & 0 deletions tests/database/migrations/create_teams_table.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class() extends Migration
{
public function up(): void
{
Schema::create('teams', function (Blueprint $table): void {
$table->id();
$table->string('name');
$table->timestamps();
});
}

public function down(): void
{
Schema::dropIfExists('teams');
}
};
26 changes: 26 additions & 0 deletions tests/src/Models/Team.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace Filament\Tests\Models;

use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Filament\Tests\Database\Factories\TeamFactory;
use Filament\Tests\Database\Factories\UserFactory;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Team extends Model
{
use HasFactory;

protected $guarded = [];

protected static function newFactory()
{
return TeamFactory::new();
}
}
15 changes: 14 additions & 1 deletion tests/src/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@
namespace Filament\Tests\Models;

use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasTenants;
use Filament\Panel;
use Filament\Tests\Database\Factories\UserFactory;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Collection;

class User extends Authenticatable implements FilamentUser, MustVerifyEmail
class User extends Authenticatable implements FilamentUser, HasTenants, MustVerifyEmail
{
use HasFactory;
use Notifiable;
Expand All @@ -37,4 +40,14 @@ protected static function newFactory()
{
return UserFactory::new();
}

public function canAccessTenant(Model $tenant): bool
{
return true;
}

public function getTenants(Panel $panel): array | Collection
{
return Team::all();
}
}
53 changes: 53 additions & 0 deletions tests/src/Panels/Pages/Tenancy/EditTenantProfileTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

use Filament\Facades\Filament;
use Filament\Pages\Tenancy\EditTenantProfile;
use Filament\Tests\Models\Team;
use Filament\Tests\Models\User;
use Filament\Tests\Panels\Pages\TestCase;
use Illuminate\Support\Facades\Gate;
use function Filament\Tests\livewire;

uses(TestCase::class);

it('allows the user access to the tenant profile page if the user is authorized', function () {
Filament::setTenant(Team::factory()->create());

Gate::policy(Team::class, TeamPolicyWithAccess::class);

livewire(EditTeamProfile::class)
->assertSuccessful();
});

it('denies the user access to the tenant profile page if the user is unauthorized', function () {
Filament::setTenant(Team::factory()->create());

Gate::policy(Team::class, TeamPolicyWithoutAccess::class);

livewire(EditTeamProfile::class)
->assertNotFound();
});

class EditTeamProfile extends EditTenantProfile
{
public static function getLabel(): string
{
return 'Edit team';
}
}

class TeamPolicyWithAccess
{
public function update(User $user, Team $team): bool
{
return true;
}
}

class TeamPolicyWithoutAccess
{
public function update(User $user, Team $team): bool
{
return false;
}
}

0 comments on commit fe8fb2c

Please sign in to comment.