mirror of
https://github.com/FOSSBilling/FOSSBilling.git
synced 2026-11-09 13:36:07 +09:00
* Improve type safety, auth checks and PHPStan fixes (#3250) * Improve type safety, auth checks and PHPStan fixes * Remove @phpstan-ignore annotations * Improve type safety, auth checks and PHPStan fixes * Remove @phpstan-ignore annotations * Remove redundant @phpstan-ignore comment * Improve code robustness and reliability (#3248) * Harden code against null/undefined values * Update dependency lockfiles * Sanitize ticket input and use IDs in email list * Restructure tests and add test utilities * Move E2E tests to `Library\E2E` namespace * Update `php-build` action ref in workflows * Switch tests to Pest and add test scaffolding * Refactor E2E tests to Pest-style tests m Skip E2E tests when env not configured * Refactor Unit tests and update test config Add test datasets and refine test helpers * Add DEBUG guard, fix API JSON decode, update tests * Refactor tests: add types and Mockery expectations * Adjust tests, phpstan config, and composer script * Instantiate test APIs locally, remove beforeEach * Refactor runtime checks, types & logging * Apply PHP Code Styling Changes m * Add PHPStan ignores, test renames & small fixes * Enable Pest tests in CI workflow * Remove legacy tests; add new unit tests/config * Avoid undefined index in fingerprint comparison * Ignore properties absent in both fingerprints * Remove public_ticket_create API method * Add Fingerprint unit tests * Remove em dash from fingerprint test name * Switch to Pest; assorted bug fixes & refactors * Prefer getDi() and guard DEBUG define * Refactor tests: DBAL, Antispam rename, helpers * Refactor email tests to use Doctrine entities * Update tests, use DBAL mocks & improve Formbuilder admin * Validate plan_id and update unit tests * Replace error_log with DI logger and update tests * Expect db->store in Invoice Service test * Use DI logger instead of error_log; fix tests * Fix typo in Hook Service test * Fix Staff test spelling fixture * Complete Pest test migration * Fix Product test spelling fixtures * Fix Product test spelling fixtures * Run live tests with Pest and load helpers * Migrate tests to ApiClient; remove legacy APIHelper * Fix Email test spelling * Remove unused PHPUnit bridge * Organize Cypress end-to-end tests * Document Pest test directory root * Remove noisy Pest comments
164 lines
5.9 KiB
PHP
164 lines
5.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Tests\Helpers\ApiClient;
|
|
|
|
const SUPPORT_MIN_TICKET_ID_LENGTH = 30;
|
|
const SUPPORT_MAX_TICKET_ID_LENGTH = 60;
|
|
|
|
$initialSupportConfig = null;
|
|
|
|
beforeEach(function () use (&$initialSupportConfig): void {
|
|
$configGetResult = ApiClient::request('admin/extension/config_get', ['ext' => 'mod_support']);
|
|
expect($configGetResult->wasSuccessful())->toBeTrue();
|
|
|
|
$configData = $configGetResult->getResult();
|
|
expect($configData)->toBeArray();
|
|
$initialSupportConfig = $configData;
|
|
});
|
|
|
|
afterEach(function () use (&$initialSupportConfig): void {
|
|
if ($initialSupportConfig === null) {
|
|
return;
|
|
}
|
|
|
|
$configResetResult = ApiClient::request(
|
|
'admin/extension/config_save',
|
|
array_merge(['ext' => 'mod_support'], $initialSupportConfig)
|
|
);
|
|
expect($configResetResult->wasSuccessful())->toBeTrue();
|
|
$initialSupportConfig = null;
|
|
});
|
|
|
|
test('creates ticket for guest', function (): void {
|
|
$expectedName = 'Name';
|
|
$expectedEmail = 'email@example.com';
|
|
$expectedSubject = 'Subject';
|
|
$expectedMessage = 'message';
|
|
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'name' => $expectedName,
|
|
'email' => $expectedEmail,
|
|
'subject' => $expectedSubject,
|
|
'message' => $expectedMessage,
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeTrue();
|
|
$ticketId = $result->getResult();
|
|
expect($ticketId)->toBeString()
|
|
->and(strlen($ticketId))->toBeGreaterThanOrEqual(SUPPORT_MIN_TICKET_ID_LENGTH)
|
|
->and(strlen($ticketId))->toBeLessThanOrEqual(SUPPORT_MAX_TICKET_ID_LENGTH)
|
|
->and($ticketId)->toMatch('/^[A-Za-z0-9_-]+$/');
|
|
|
|
$ticketGetResult = ApiClient::request('guest/support/ticket_get', ['hash' => $ticketId]);
|
|
expect($ticketGetResult->wasSuccessful())->toBeTrue();
|
|
|
|
$ticketData = $ticketGetResult->getResult();
|
|
expect($ticketData)->toBeArray()
|
|
->toHaveKey('author_name')
|
|
->toHaveKey('subject')
|
|
->toHaveKey('messages')
|
|
->and($ticketData['author_name'])->toBe($expectedName)
|
|
->and($ticketData['subject'])->toBe($expectedSubject)
|
|
->and($ticketData['messages'])->toBeArray()->not->toBeEmpty()
|
|
->and($ticketData['messages'][0]['content'])->toBe($expectedMessage);
|
|
});
|
|
|
|
test('rejects guest ticket creation when public tickets are disabled', function (): void {
|
|
$configResult = ApiClient::request('admin/extension/config_save', ['ext' => 'mod_support', 'disable_public_tickets' => true]);
|
|
expect($configResult->wasSuccessful())->toBeTrue();
|
|
|
|
$configGetResult = ApiClient::request('admin/extension/config_get', ['ext' => 'mod_support']);
|
|
expect($configGetResult->wasSuccessful())->toBeTrue();
|
|
|
|
$configData = $configGetResult->getResult();
|
|
expect($configData)->toBeArray()
|
|
->toHaveKey('disable_public_tickets')
|
|
->and((bool) $configData['disable_public_tickets'])->toBeTrue();
|
|
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'name' => 'Name',
|
|
'email' => 'email2@example.com',
|
|
'subject' => 'Subject',
|
|
'message' => 'message',
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeFalse();
|
|
$errorMessage = $result->getErrorMessage();
|
|
expect($errorMessage)->toBeString()
|
|
->toContain("aren't accepting support tickets")
|
|
->toContain('unregistered users');
|
|
});
|
|
|
|
test('public tickets enabled reflects configuration', function (): void {
|
|
$enabledResult = ApiClient::request('guest/support/public_tickets_enabled');
|
|
expect($enabledResult->wasSuccessful())->toBeTrue()
|
|
->and($enabledResult->getResult())->toBeTrue();
|
|
|
|
$configResult = ApiClient::request('admin/extension/config_save', ['ext' => 'mod_support', 'disable_public_tickets' => true]);
|
|
expect($configResult->wasSuccessful())->toBeTrue();
|
|
|
|
$disabledResult = ApiClient::request('guest/support/public_tickets_enabled');
|
|
expect($disabledResult->wasSuccessful())->toBeTrue()
|
|
->and($disabledResult->getResult())->toBeFalse();
|
|
});
|
|
|
|
test('rejects guest ticket creation without name', function (): void {
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'email' => 'email@example.com',
|
|
'subject' => 'Subject',
|
|
'message' => 'message',
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeFalse()
|
|
->and($result->getErrorMessage())->toBe('Please enter your name');
|
|
});
|
|
|
|
test('rejects guest ticket creation without email', function (): void {
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'name' => 'Name',
|
|
'subject' => 'Subject',
|
|
'message' => 'message',
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeFalse()
|
|
->and($result->getErrorMessage())->toBe('Please enter your email address');
|
|
});
|
|
|
|
test('rejects guest ticket creation with invalid email', function (): void {
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'name' => 'Name',
|
|
'email' => 'not-an-email',
|
|
'subject' => 'Subject',
|
|
'message' => 'message',
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeFalse()
|
|
->and($result->getErrorMessage())->toBe('Email address is invalid');
|
|
});
|
|
|
|
test('rejects guest ticket creation with empty subject', function (): void {
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'name' => 'Name',
|
|
'email' => 'email@example.com',
|
|
'subject' => '',
|
|
'message' => 'message',
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeFalse()
|
|
->and($result->getErrorMessage())->toBe('Please enter the subject');
|
|
});
|
|
|
|
test('rejects guest ticket creation with empty message', function (): void {
|
|
$result = ApiClient::request('guest/support/ticket_create', [
|
|
'name' => 'Name',
|
|
'email' => 'email@example.com',
|
|
'subject' => 'Subject',
|
|
'message' => '',
|
|
]);
|
|
|
|
expect($result->wasSuccessful())->toBeFalse()
|
|
->and($result->getErrorMessage())->toBe('Please enter your message');
|
|
});
|