52 lines
1.8 KiB
PHP
52 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use App\Models\Inquiry;
|
|
use App\Models\TenantEntitlement;
|
|
use App\Jobs\ProvisionTenantJob;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use App\Models\Tenant;
|
|
use Tests\TestCase;
|
|
|
|
class TenantEntitlementEnforcementTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
public function test_employee_creation_is_rejected_when_max_limit_reached(): void
|
|
{
|
|
$tenantId = 'entitlement-limit-test';
|
|
$inquiry = Inquiry::create([
|
|
'company_name' => 'Limit Corp',
|
|
'contact_name' => 'Limit Admin',
|
|
'email' => 'admin@limitcorp.com',
|
|
'desired_subdomain' => $tenantId,
|
|
'employee_count' => 2, // Max 2 staff members
|
|
'requested_features' => ['payroll'],
|
|
'email_verified_at' => now(),
|
|
'status' => 'approved',
|
|
]);
|
|
|
|
(new ProvisionTenantJob($inquiry))->handle();
|
|
|
|
$tenant = Tenant::find($tenantId);
|
|
|
|
$tenant->run(function () use ($tenantId) {
|
|
// Seed 2 active employees (reaching limit of 2)
|
|
\App\Models\User::create(['name' => 'Staff 1', 'email' => 'staff1@limitcorp.com', 'type' => 'employee', 'password' => 'secret']);
|
|
\App\Models\User::create(['name' => 'Staff 2', 'email' => 'staff2@limitcorp.com', 'type' => 'employee', 'password' => 'secret']);
|
|
|
|
$middleware = new \App\Http\Middleware\EnforceEmployeeLimit();
|
|
$request = \Illuminate\Http\Request::create('/hr/employees', 'POST');
|
|
$request->headers->set('Accept', 'application/json');
|
|
|
|
$response = $middleware->handle($request, function () {
|
|
return response()->json(['success' => true]);
|
|
});
|
|
|
|
// 3rd employee attempt must be rejected with 403 Forbidden
|
|
$this->assertEquals(403, $response->getStatusCode());
|
|
});
|
|
}
|
|
}
|