|
1 | 1 | <?php |
2 | 2 |
|
3 | 3 | use Illuminate\Database\Eloquent\Model; |
| 4 | +use Illuminate\Database\Eloquent\Relations\BelongsToMany; |
| 5 | +use Illuminate\Database\Eloquent\Relations\MorphPivot; |
4 | 6 | use Illuminate\Support\Facades\Event; |
5 | 7 | use Spatie\Permission\Contracts\Permission; |
6 | 8 | use Spatie\Permission\Contracts\Role; |
|
11 | 13 | use Spatie\Permission\Tests\TestSupport\TestModels\SoftDeletingUser; |
12 | 14 | use Spatie\Permission\Tests\TestSupport\TestModels\TestRolePermissionsEnum; |
13 | 15 | use Spatie\Permission\Tests\TestSupport\TestModels\User; |
| 16 | +use Spatie\Permission\Tests\TestSupport\TestModels\UserWithoutHasRoles; |
| 17 | +use Spatie\Permission\Traits\HasRoles; |
| 18 | + |
| 19 | +class TeamHasPermissionsCustomPivot extends MorphPivot {} |
| 20 | + |
| 21 | +class TeamHasPermissionsCustomPivotUser extends UserWithoutHasRoles |
| 22 | +{ |
| 23 | + use HasRoles { |
| 24 | + permissions as traitPermissions; |
| 25 | + } |
| 26 | + |
| 27 | + public function permissions(): BelongsToMany |
| 28 | + { |
| 29 | + return $this->traitPermissions() |
| 30 | + ->withPivot('team_test_id') |
| 31 | + ->using(TeamHasPermissionsCustomPivot::class); |
| 32 | + } |
| 33 | +} |
14 | 34 |
|
15 | 35 | beforeEach(fn () => $this->setUpTeams()); |
16 | 36 |
|
|
756 | 776 | ->toEqual(collect(['edit-articles', 'edit-blog'])); |
757 | 777 | }); |
758 | 778 |
|
| 779 | +it('can revoke a permission from one team when using a custom pivot class', function () { |
| 780 | + config()->set('auth.providers.users.model', TeamHasPermissionsCustomPivotUser::class); |
| 781 | + |
| 782 | + $user = TeamHasPermissionsCustomPivotUser::create(['email' => 'custom-pivot-revoke-permission@test.com']); |
| 783 | + |
| 784 | + setPermissionsTeamId(1); |
| 785 | + $user->givePermissionTo('edit-articles', 'edit-news'); |
| 786 | + |
| 787 | + setPermissionsTeamId(2); |
| 788 | + $user->givePermissionTo('edit-articles', 'edit-blog'); |
| 789 | + $user->load('permissions'); |
| 790 | + |
| 791 | + expect($user->getPermissionNames()->sort()->values()) |
| 792 | + ->toEqual(collect(['edit-articles', 'edit-blog'])); |
| 793 | + |
| 794 | + setPermissionsTeamId(1); |
| 795 | + $user->load('permissions'); |
| 796 | + |
| 797 | + expect($user->getPermissionNames()->sort()->values()) |
| 798 | + ->toEqual(collect(['edit-articles', 'edit-news'])); |
| 799 | + |
| 800 | + $user->revokePermissionTo('edit-articles'); |
| 801 | + |
| 802 | + expect($user->getPermissionNames()->sort()->values()) |
| 803 | + ->toEqual(collect(['edit-news'])); |
| 804 | + |
| 805 | + setPermissionsTeamId(2); |
| 806 | + $user->load('permissions'); |
| 807 | + |
| 808 | + expect($user->getPermissionNames()->sort()->values()) |
| 809 | + ->toEqual(collect(['edit-articles', 'edit-blog'])); |
| 810 | +}); |
| 811 | + |
| 812 | +it('can sync permissions for one team when using a custom pivot class', function () { |
| 813 | + config()->set('auth.providers.users.model', TeamHasPermissionsCustomPivotUser::class); |
| 814 | + |
| 815 | + $user = TeamHasPermissionsCustomPivotUser::create(['email' => 'custom-pivot-sync-permissions@test.com']); |
| 816 | + |
| 817 | + setPermissionsTeamId(1); |
| 818 | + $user->givePermissionTo('edit-articles', 'edit-news'); |
| 819 | + |
| 820 | + setPermissionsTeamId(2); |
| 821 | + $user->givePermissionTo('edit-articles', 'edit-blog'); |
| 822 | + |
| 823 | + setPermissionsTeamId(1); |
| 824 | + $user->syncPermissions('edit-news'); |
| 825 | + |
| 826 | + expect($user->getPermissionNames()->sort()->values()) |
| 827 | + ->toEqual(collect(['edit-news'])); |
| 828 | + |
| 829 | + setPermissionsTeamId(2); |
| 830 | + $user->load('permissions'); |
| 831 | + |
| 832 | + expect($user->getPermissionNames()->sort()->values()) |
| 833 | + ->toEqual(collect(['edit-articles', 'edit-blog'])); |
| 834 | +}); |
| 835 | + |
| 836 | +it('can sync permissions with events for one team when using a custom pivot class', function () { |
| 837 | + Event::fake([PermissionDetachedEvent::class, PermissionAttachedEvent::class]); |
| 838 | + app('config')->set('permission.events_enabled', true); |
| 839 | + config()->set('auth.providers.users.model', TeamHasPermissionsCustomPivotUser::class); |
| 840 | + |
| 841 | + $user = TeamHasPermissionsCustomPivotUser::create(['email' => 'custom-pivot-sync-permissions-events@test.com']); |
| 842 | + |
| 843 | + setPermissionsTeamId(1); |
| 844 | + $user->givePermissionTo('edit-articles', 'edit-news'); |
| 845 | + |
| 846 | + setPermissionsTeamId(2); |
| 847 | + $user->givePermissionTo('edit-articles', 'edit-blog'); |
| 848 | + |
| 849 | + setPermissionsTeamId(1); |
| 850 | + $user->syncPermissions('edit-news'); |
| 851 | + |
| 852 | + expect($user->getPermissionNames()->sort()->values()) |
| 853 | + ->toEqual(collect(['edit-news'])); |
| 854 | + |
| 855 | + Event::assertDispatched(PermissionDetachedEvent::class); |
| 856 | + |
| 857 | + setPermissionsTeamId(2); |
| 858 | + $user->load('permissions'); |
| 859 | + |
| 860 | + expect($user->getPermissionNames()->sort()->values()) |
| 861 | + ->toEqual(collect(['edit-articles', 'edit-blog'])); |
| 862 | +}); |
| 863 | + |
| 864 | +it('can sync to no permissions for one team when using a custom pivot class', function () { |
| 865 | + config()->set('auth.providers.users.model', TeamHasPermissionsCustomPivotUser::class); |
| 866 | + |
| 867 | + $user = TeamHasPermissionsCustomPivotUser::create(['email' => 'custom-pivot-sync-empty-permissions@test.com']); |
| 868 | + |
| 869 | + setPermissionsTeamId(1); |
| 870 | + $user->givePermissionTo('edit-articles', 'edit-news'); |
| 871 | + |
| 872 | + setPermissionsTeamId(2); |
| 873 | + $user->givePermissionTo('edit-articles'); |
| 874 | + |
| 875 | + setPermissionsTeamId(1); |
| 876 | + $user->syncPermissions([]); |
| 877 | + |
| 878 | + expect($user->getPermissionNames())->toBeEmpty(); |
| 879 | + |
| 880 | + setPermissionsTeamId(2); |
| 881 | + $user->load('permissions'); |
| 882 | + |
| 883 | + expect($user->getPermissionNames()->sort()->values()) |
| 884 | + ->toEqual(collect(['edit-articles'])); |
| 885 | +}); |
| 886 | + |
759 | 887 | it('can scope users on different teams', function () { |
760 | 888 | $user1 = User::create(['email' => 'user1@test.com']); |
761 | 889 | $user2 = User::create(['email' => 'user2@test.com']); |
|
0 commit comments