feat(mailbox): Implement cinematic UX and user tiers
- Added Spatie roles (free, pro, enterprise, admin) and access scopes - Implemented delayed, cinematic mailbox provisioning animation - Fixed GSAP and SVG collision issues on creation overlay - Improved component sync with livewire refresh - Added feature tests for tier systems and fixed RegistrationTest
This commit is contained in:
@@ -10,6 +10,8 @@ test('registration screen can be rendered', function (): void {
|
||||
});
|
||||
|
||||
test('new users can register', function (): void {
|
||||
$this->seed(\Database\Seeders\RoleSeeder::class);
|
||||
|
||||
$response = Livewire::test(Register::class)
|
||||
->set('name', 'Test User')
|
||||
->set('email', 'test@example.com')
|
||||
|
||||
89
tests/Feature/UserTierTest.php
Normal file
89
tests/Feature/UserTierTest.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Domain;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Tests\TestCase;
|
||||
|
||||
class UserTierTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
Artisan::call('db:seed', ['--class' => 'RoleSeeder']);
|
||||
}
|
||||
|
||||
public function test_new_user_is_assigned_free_role_by_default()
|
||||
{
|
||||
\Livewire\Livewire::test(\App\Livewire\Auth\Register::class)
|
||||
->set('name', 'Test User')
|
||||
->set('email', 'test@example.com')
|
||||
->set('password', 'password')
|
||||
->set('password_confirmation', 'password')
|
||||
->call('register')
|
||||
->assertHasNoErrors()
|
||||
->assertRedirect();
|
||||
|
||||
$user = User::where('email', 'test@example.com')->first();
|
||||
$this->assertNotNull($user, 'User was not created');
|
||||
$this->assertTrue($user->hasRole('free'));
|
||||
$this->assertEquals('FREE', $user->tierLabel());
|
||||
}
|
||||
|
||||
public function test_free_user_can_only_access_public_domains()
|
||||
{
|
||||
$publicDomain = Domain::factory()->create(['allowed_types' => ['public'], 'name' => 'public.com']);
|
||||
$premiumDomain = Domain::factory()->create(['allowed_types' => ['premium'], 'name' => 'premium.com']);
|
||||
|
||||
$user = User::factory()->free()->create();
|
||||
|
||||
$accessibleDomains = Domain::accessibleBy($user)->get();
|
||||
|
||||
$this->assertTrue($accessibleDomains->contains($publicDomain));
|
||||
$this->assertFalse($accessibleDomains->contains($premiumDomain));
|
||||
}
|
||||
|
||||
public function test_pro_user_can_access_public_and_premium_domains()
|
||||
{
|
||||
$publicDomain = Domain::factory()->create(['allowed_types' => ['public'], 'name' => 'public.com']);
|
||||
$premiumDomain = Domain::factory()->create(['allowed_types' => ['premium'], 'name' => 'premium.com']);
|
||||
$privateDomain = Domain::factory()->create(['allowed_types' => ['private'], 'name' => 'private.com']);
|
||||
|
||||
$user = User::factory()->pro()->create();
|
||||
|
||||
$accessibleDomains = Domain::accessibleBy($user)->get();
|
||||
|
||||
$this->assertTrue($accessibleDomains->contains($publicDomain));
|
||||
$this->assertTrue($accessibleDomains->contains($premiumDomain));
|
||||
$this->assertFalse($accessibleDomains->contains($privateDomain));
|
||||
}
|
||||
|
||||
public function test_enterprise_user_can_access_all_domains()
|
||||
{
|
||||
$publicDomain = Domain::factory()->create(['allowed_types' => ['public'], 'name' => 'public.com']);
|
||||
$privateDomain = Domain::factory()->create(['allowed_types' => ['private'], 'name' => 'private.com']);
|
||||
|
||||
$user = User::factory()->enterprise()->create();
|
||||
|
||||
$accessibleDomains = Domain::accessibleBy($user)->get();
|
||||
|
||||
$this->assertTrue($accessibleDomains->contains($publicDomain));
|
||||
$this->assertTrue($accessibleDomains->contains($privateDomain));
|
||||
}
|
||||
|
||||
public function test_guest_can_only_access_public_domains()
|
||||
{
|
||||
$publicDomain = Domain::factory()->create(['allowed_types' => ['public'], 'name' => 'public.com']);
|
||||
$premiumDomain = Domain::factory()->create(['allowed_types' => ['premium'], 'name' => 'premium.com']);
|
||||
|
||||
$accessibleDomains = Domain::accessibleBy(null)->get();
|
||||
|
||||
$this->assertTrue($accessibleDomains->contains($publicDomain));
|
||||
$this->assertFalse($accessibleDomains->contains($premiumDomain));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user