Files
FOSSBilling/tests/Modules/Support/GuestTest.php
T
Adam Daley dd3dcbfd52 Enhance type safety, authentication checks, and testing framework (#3701)
* 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
2026-06-02 07:43:01 +01:00

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');
});