feat(subscription): add resource quota management for subscription plans and update related components
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Subscription;
|
||||
|
||||
use App\Subscription\Entity\SubscriptionPlan;
|
||||
use App\Tests\ApiTestCase;
|
||||
|
||||
/**
|
||||
* سقف منابعِ پلن از پنل ادمین نوشته و خوانده میشود.
|
||||
*
|
||||
* `-1` یعنی نامحدود؛ `0` و هر منفیِ دیگری رد میشود — پلنی که هیچ منبعی نمیدهد یا
|
||||
* منفیِ بیمعنا دارد، خاموش شکست میخورد و در پنل چیزی نشان نمیدهد.
|
||||
*/
|
||||
class AdminPlanResourceLimitTest extends ApiTestCase
|
||||
{
|
||||
private function planName(): string
|
||||
{
|
||||
return 'quota_plan_' . bin2hex(random_bytes(4));
|
||||
}
|
||||
|
||||
public function testPlanIsCreatedWithItsResourceQuota(): void
|
||||
{
|
||||
$admin = $this->createUser(['ROLE_USER', 'ROLE_ADMIN']);
|
||||
|
||||
$body = $this->authJson('POST', '/api/v1/admin/subscription/plan', $admin, [
|
||||
'name' => $this->planName(),
|
||||
'level' => 7,
|
||||
'max_secretaries' => 2,
|
||||
'max_resources' => 5,
|
||||
'features' => ['services' => true],
|
||||
]);
|
||||
|
||||
self::assertSame(201, $this->responseCode(), json_encode($body, JSON_UNESCAPED_UNICODE));
|
||||
self::assertSame(5, $body['data']['max_resources']);
|
||||
}
|
||||
|
||||
/** نیامدنِ فیلد یعنی محافظهکارانهترین سقف، نه نامحدود. */
|
||||
public function testOmittedQuotaDefaultsToOne(): void
|
||||
{
|
||||
$admin = $this->createUser(['ROLE_USER', 'ROLE_ADMIN']);
|
||||
|
||||
$body = $this->authJson('POST', '/api/v1/admin/subscription/plan', $admin, [
|
||||
'name' => $this->planName(),
|
||||
'level' => 7,
|
||||
]);
|
||||
|
||||
self::assertSame(201, $this->responseCode());
|
||||
self::assertSame(1, $body['data']['max_resources']);
|
||||
}
|
||||
|
||||
public function testQuotaIsUpdatedAndUnlimitedIsAccepted(): void
|
||||
{
|
||||
$admin = $this->createUser(['ROLE_USER', 'ROLE_ADMIN']);
|
||||
|
||||
$created = $this->authJson('POST', '/api/v1/admin/subscription/plan', $admin, [
|
||||
'name' => $this->planName(),
|
||||
'level' => 7,
|
||||
'max_resources' => 3,
|
||||
]);
|
||||
|
||||
$body = $this->authJson('PATCH', '/api/v1/admin/subscription/plan/' . $created['data']['uuid'], $admin, [
|
||||
'max_resources' => SubscriptionPlan::UNLIMITED,
|
||||
]);
|
||||
|
||||
self::assertSame(200, $this->responseCode());
|
||||
self::assertSame(SubscriptionPlan::UNLIMITED, $body['data']['max_resources']);
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('invalidQuotas')]
|
||||
public function testInvalidQuotaIsRejected(int $quota): void
|
||||
{
|
||||
$admin = $this->createUser(['ROLE_USER', 'ROLE_ADMIN']);
|
||||
|
||||
$this->authJson('POST', '/api/v1/admin/subscription/plan', $admin, [
|
||||
'name' => $this->planName(),
|
||||
'level' => 7,
|
||||
'max_resources' => $quota,
|
||||
]);
|
||||
|
||||
self::assertSame(422, $this->responseCode());
|
||||
}
|
||||
|
||||
/** @return array<string, array{0: int}> */
|
||||
public static function invalidQuotas(): array
|
||||
{
|
||||
return [
|
||||
'zero' => [0],
|
||||
'below unlimited' => [-2],
|
||||
];
|
||||
}
|
||||
|
||||
/** فهرست پلنها سقف را میدهد؛ وگرنه کارتهای صفحهٔ اشتراک چیزی برای نشاندادن ندارند. */
|
||||
public function testPlanListExposesTheQuota(): void
|
||||
{
|
||||
$user = $this->createUser(['ROLE_USER']);
|
||||
$body = $this->authJson('GET', '/api/v1/subscription/plans', $user);
|
||||
|
||||
self::assertSame(200, $this->responseCode());
|
||||
self::assertArrayHasKey('max_resources', $body['data'][0]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user