'No Branch Corp', 'contact_name' => 'Admin No Branch', 'email' => 'nobranch@test.com', 'desired_subdomain' => 'no-branch-tenant', 'employee_count' => 10, 'requested_features' => ['payroll'], // NO multi_branch requested 'email_verified_at' => now(), 'status' => 'approved', ]); $job = new ProvisionTenantJob($inquiry); $job->handle(); $tenant = Tenant::find('no-branch-tenant'); $tenant->run(function () { Artisan::call('migrate', ['--database' => 'tenant', '--path' => 'database/migrations/tenant', '--force' => true]); $companyUser = User::where('email', 'nobranch@test.com')->first(); $this->actingAs($companyUser); // Attempt to visit Designation route (Must be 403 Forbidden because multi_branch was NOT purchased) $response = $this->get('/hr/designations'); $response->assertStatus(403); // Attempt to visit Branch route (Must be 403 Forbidden) $response = $this->get('/hr/branches'); $response->assertStatus(403); // Attempt to visit Department route (Must be 403 Forbidden) $response = $this->get('/hr/departments'); $response->assertStatus(403); }); } public function test_mobile_api_blocked_when_mobile_app_not_requested(): void { $inquiry = Inquiry::create([ 'company_name' => 'No Mobile Corp', 'contact_name' => 'Admin No Mobile', 'email' => 'nomobile@test.com', 'desired_subdomain' => 'no-mobile-tenant', 'employee_count' => 10, 'requested_features' => ['payroll'], // NO mobile_app requested 'email_verified_at' => now(), 'status' => 'approved', ]); $job = new ProvisionTenantJob($inquiry); $job->handle(); $tenant = Tenant::find('no-mobile-tenant'); $tenant->run(function () { Artisan::call('migrate', ['--database' => 'tenant', '--path' => 'database/migrations/tenant', '--force' => true]); $companyUser = User::where('email', 'nomobile@test.com')->first(); $token = $companyUser->createToken('test-token')->plainTextToken; // Attempt to access mobile API (Must be 403 Forbidden because mobile_app was NOT purchased) $response = $this->withHeader('Authorization', 'Bearer ' . $token) ->getJson('/api/attendance/today'); $response->assertStatus(403); }); } public function test_designations_and_branches_allowed_when_multi_branch_requested(): void { $inquiry = Inquiry::create([ 'company_name' => 'Branch Inc', 'contact_name' => 'Admin Branch', 'email' => 'withbranch@test.com', 'desired_subdomain' => 'with-branch-tenant', 'employee_count' => 10, 'requested_features' => ['multi_branch'], // multi_branch requested 'email_verified_at' => now(), 'status' => 'approved', ]); $job = new ProvisionTenantJob($inquiry); $job->handle(); $tenant = Tenant::find('with-branch-tenant'); $tenant->run(function () { Artisan::call('migrate', ['--database' => 'tenant', '--path' => 'database/migrations/tenant', '--force' => true]); $companyUser = User::where('email', 'withbranch@test.com')->first(); $this->actingAs($companyUser); $response = $this->get('/hr/designations'); $response->assertStatus(200); $response = $this->get('/hr/branches'); $response->assertStatus(200); }); } }