From 681a05eed6901be6b70405efe4a9ec09a55d02d7 Mon Sep 17 00:00:00 2001 From: KarlsonComplete Date: Thu, 6 Feb 2025 23:21:21 +0300 Subject: [PATCH 1/3] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=20-=20=D0=92=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D1=85=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 8 +- .../UseCase/ChangeDomainUrl/Command.php | 36 ++------ .../UseCase/InstallFinish/Command.php | 26 ++---- .../UseCase/InstallFinish/Handler.php | 6 +- .../UseCase/InstallStart/Command.php | 25 +----- .../UseCase/InstallStart/Handler.php | 8 +- .../UseCase/ChangeDomainUrl/HandlerTest.php | 9 +- .../UseCase/InstallFinish/HandlerTest.php | 3 +- .../UseCase/InstallStart/HandlerTest.php | 8 +- .../Bitrix24Accounts/DomainCheckerTest.php | 83 ------------------- .../UseCase/ChangeDomainUrl/CommandTest.php | 64 +++++++++----- .../UseCase/InstallFinish/CommandTest.php | 22 +++-- .../UseCase/InstallStart/CommandTest.php | 30 ++++--- .../UseCase/Uninstall/CommandTest.php | 5 +- 14 files changed, 118 insertions(+), 215 deletions(-) delete mode 100644 tests/Unit/Bitrix24Accounts/DomainCheckerTest.php diff --git a/Makefile b/Makefile index d61aebf..5927f0a 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,8 @@ include $(ENV) -include $(ENV_LOCAL) +start-rector: vendor + vendor/bin/rector process tests --config=rector.php coding-standards: vendor vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php --diff --verbose @@ -46,6 +48,10 @@ init: @echo "run application…" docker-compose up -d + +clear: + docker-compose run --rm php-cli composer clear-cache + up: @echo "run application…" docker-compose up --build -d @@ -110,7 +116,7 @@ test-run-functional: debug-print-env # Запустить один функциональный тест с дебагером run-one-functional-test: debug-print-env - docker-compose run --rm php-cli php -dxdebug.start_with_request=yes vendor/bin/phpunit --filter 'testCreateExistingAccount' tests/Functional/Bitrix24Accounts/UseCase/InstallStart/HandlerTest.php + docker-compose run --rm php-cli php -dxdebug.start_with_request=yes vendor/bin/phpunit --filter 'testChangeDomainUrlWithHappyPath' tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php schema-drop: docker-compose run --rm php-cli php bin/doctrine orm:schema-tool:drop --force diff --git a/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php b/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php index 0304d13..4ce4d4d 100644 --- a/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php +++ b/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php @@ -4,37 +4,17 @@ namespace Bitrix24\Lib\Bitrix24Accounts\UseCase\ChangeDomainUrl; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; + readonly class Command { + public string $oldDomain; + public string $newDomain; public function __construct( - /** - * @var non-empty-string $oldDomain - */ - public string $oldDomain, - /** - * @var non-empty-string $newDomain - */ - public string $newDomain + Domain $oldDomain, + Domain $newDomain ) { - $this->validateDomain($oldDomain, 'oldDomainUrlHost'); - $this->validateDomain($newDomain, 'newDomainUrlHost'); - } - - private function validateDomain(string $domain, string $parameterName): void - { - // Регулярное выражение для проверки допустимых символов (латиница и кириллица) - $patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?oldDomain = $oldDomain->getValue(); + $this->newDomain = $newDomain->getValue(); } } diff --git a/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php b/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php index 339d739..ffe1f89 100644 --- a/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php +++ b/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php @@ -4,15 +4,19 @@ namespace Bitrix24\Lib\Bitrix24Accounts\UseCase\InstallFinish; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; readonly class Command { + public string $domain; + public function __construct( public string $applicationToken, public string $memberId, - public string $domainUrl, + Domain $domainUrl, public int $bitrix24UserId, ) { $this->validate(); + $this->domain = $domainUrl->getValue(); } private function validate(): void @@ -25,28 +29,8 @@ private function validate(): void throw new \InvalidArgumentException('Member ID cannot be empty.'); } - $this->validateDomain($this->domainUrl); - if ($this->bitrix24UserId <= 0) { throw new \InvalidArgumentException('Bitrix24 User ID must be a positive integer.'); } } - - private function validateDomain(string $domain): void - { - // Регулярное выражение для проверки допустимых символов (латиница и кириллица) - $patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?logger->info('Bitrix24Accounts.InstallFinish.start', [ - 'b24_domain_url' => $command->domainUrl, + 'b24_domain_url' => $command->domain, 'b24_member_id' => $command->memberId, 'b24_application_id' => $command->applicationToken, 'b24_user_id' => $command->bitrix24UserId, ]); /** @var AggregateRootEventsEmitterInterface|Bitrix24AccountInterface $bitrix24Account */ - $bitrix24Account = $this->getSingleAccountByMemberId($command->domainUrl, $command->memberId, $command->bitrix24UserId); + $bitrix24Account = $this->getSingleAccountByMemberId($command->domain, $command->memberId, $command->bitrix24UserId); $bitrix24Account->applicationInstalled($command->applicationToken); @@ -47,7 +47,7 @@ public function handle(Command $command): void $this->logger->info( 'Bitrix24Accounts.InstallFinish.Finish', [ - 'b24_domain_url' => $command->domainUrl, + 'b24_domain_url' => $command->domain, 'b24_member_id' => $command->memberId, 'b24_application_id' => $command->applicationToken, 'b24_user_id' => $command->bitrix24UserId, diff --git a/src/Bitrix24Accounts/UseCase/InstallStart/Command.php b/src/Bitrix24Accounts/UseCase/InstallStart/Command.php index e9e8636..0bab8f0 100644 --- a/src/Bitrix24Accounts/UseCase/InstallStart/Command.php +++ b/src/Bitrix24Accounts/UseCase/InstallStart/Command.php @@ -7,20 +7,23 @@ use Bitrix24\SDK\Core\Credentials\AuthToken; use Bitrix24\SDK\Core\Credentials\Scope; use Symfony\Component\Uid\Uuid; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; readonly class Command { + public string $domain; public function __construct( public Uuid $uuid, public int $bitrix24UserId, public bool $isBitrix24UserAdmin, public string $memberId, - public string $domainUrl, + Domain $domainUrl, public AuthToken $authToken, public int $applicationVersion, public Scope $applicationScope ) { $this->validate(); + $this->domain = $domainUrl->getValue(); } private function validate(): void @@ -37,28 +40,8 @@ private function validate(): void throw new \InvalidArgumentException('Member ID must be a non-empty string.'); } - $this->validateDomain($this->domainUrl); - if ($this->applicationVersion <= 0) { throw new \InvalidArgumentException('Application version must be a positive integer.'); } } - - private function validateDomain(string $domain): void - { - // Регулярное выражение для проверки допустимых символов (латиница и кириллица) - $patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?logger->info('Bitrix24Accounts.InstallStart.start', [ 'id' => $command->uuid->toRfc4122(), - 'domain_url' => $command->domainUrl, + 'domain' => $command->domain, 'member_id' => $command->memberId, ]); @@ -33,7 +33,7 @@ public function handle(Command $command): void $command->bitrix24UserId, $command->isBitrix24UserAdmin, $command->memberId, - $command->domainUrl, + $command->domain, Bitrix24AccountStatus::new, $command->authToken, new CarbonImmutable(), @@ -53,7 +53,7 @@ public function handle(Command $command): void 'Bitrix24Accounts.InstallStart.Finish', [ 'id' => $command->uuid->toRfc4122(), - 'domain_url' => $command->domainUrl, + 'domain_url' => $command->domain, 'member_id' => $command->memberId, ] ); @@ -62,7 +62,7 @@ public function handle(Command $command): void 'Bitrix24Accounts.InstallStart.AlreadyExists', [ 'id' => $command->uuid->toRfc4122(), - 'domain_url' => $command->domainUrl, + 'domain' => $command->domain, 'member_id' => $command->memberId, ] ); diff --git a/tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php b/tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php index 36a21f2..01e2d5a 100644 --- a/tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php +++ b/tests/Functional/Bitrix24Accounts/UseCase/ChangeDomainUrl/HandlerTest.php @@ -29,6 +29,7 @@ use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Component\Uid\Uuid; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; /** * @internal @@ -74,8 +75,8 @@ public function testChangeDomainUrlForAccount(): void $this->handler->handle( new Bitrix24Accounts\UseCase\ChangeDomainUrl\Command( - $oldDomainUrl, - $newDomainUrl + new Domain($oldDomainUrl), + new Domain($newDomainUrl) ) ); @@ -126,8 +127,8 @@ public function testChangeDomainUrlForManyAccounts(): void $this->handler->handle( new Bitrix24Accounts\UseCase\ChangeDomainUrl\Command( - $oldDomainUrl, - $newDomainUrl + new Domain($oldDomainUrl), + new Domain($newDomainUrl) ) ); diff --git a/tests/Functional/Bitrix24Accounts/UseCase/InstallFinish/HandlerTest.php b/tests/Functional/Bitrix24Accounts/UseCase/InstallFinish/HandlerTest.php index 04a8e05..f0d1ac0 100644 --- a/tests/Functional/Bitrix24Accounts/UseCase/InstallFinish/HandlerTest.php +++ b/tests/Functional/Bitrix24Accounts/UseCase/InstallFinish/HandlerTest.php @@ -30,6 +30,7 @@ use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Component\Uid\Uuid; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; /** * @internal @@ -78,7 +79,7 @@ public function testFinishInstallationApplication(): void new Bitrix24Accounts\UseCase\InstallFinish\Command( $applicationToken, $bitrix24Account->getMemberId(), - $bitrix24Account->getDomainUrl(), + new Domain($bitrix24Account->getDomainUrl()), $bitrix24Account->getBitrix24UserId() ) ); diff --git a/tests/Functional/Bitrix24Accounts/UseCase/InstallStart/HandlerTest.php b/tests/Functional/Bitrix24Accounts/UseCase/InstallStart/HandlerTest.php index aecab34..8fe33ba 100644 --- a/tests/Functional/Bitrix24Accounts/UseCase/InstallStart/HandlerTest.php +++ b/tests/Functional/Bitrix24Accounts/UseCase/InstallStart/HandlerTest.php @@ -33,6 +33,7 @@ use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Stopwatch\Stopwatch; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; /** * @internal @@ -65,7 +66,6 @@ protected function setUp(): void /** * @throws InvalidArgumentException * @throws Bitrix24AccountNotFoundException - * @throws RandomException * @throws UnknownScopeCodeException */ #[Test] @@ -81,7 +81,7 @@ public function testInstallNewApplication(): void $bitrix24AccountBuilder->getBitrix24UserId(), $bitrix24AccountBuilder->isBitrix24UserAdmin(), $bitrix24AccountBuilder->getMemberId(), - $bitrix24AccountBuilder->getDomainUrl(), + new Domain($bitrix24AccountBuilder->getDomainUrl()), $bitrix24AccountBuilder->getAuthToken(), $bitrix24AccountBuilder->getApplicationVersion(), $bitrix24AccountBuilder->getApplicationScope() @@ -181,7 +181,7 @@ public function testInstallExistingAccount(): void $bitrix24Account->getBitrix24UserId(), $bitrix24Account->isBitrix24UserAdmin(), $bitrix24Account->getMemberId(), - $bitrix24Account->getDomainUrl(), + new Domain($bitrix24Account->getDomainUrl()), $bitrix24Account->getAuthToken(), $bitrix24Account->getApplicationVersion(), $bitrix24Account->getApplicationScope() @@ -199,7 +199,7 @@ public function testInstallExistingAccount(): void $bitrix24Account->getBitrix24UserId(), $bitrix24Account->isBitrix24UserAdmin(), $bitrix24Account->getMemberId(), - $bitrix24Account->getDomainUrl(), + new Domain($bitrix24Account->getDomainUrl()), $bitrix24Account->getAuthToken(), $bitrix24Account->getApplicationVersion(), $bitrix24Account->getApplicationScope() diff --git a/tests/Unit/Bitrix24Accounts/DomainCheckerTest.php b/tests/Unit/Bitrix24Accounts/DomainCheckerTest.php deleted file mode 100644 index 123e0f4..0000000 --- a/tests/Unit/Bitrix24Accounts/DomainCheckerTest.php +++ /dev/null @@ -1,83 +0,0 @@ -assertEquals(6, $exceptionCount, 'Expected 6 invalid exception and received ' . $exceptionCount); - } else { - // Если ожидается отсутствие исключений, проверяем что их не было - $this->assertEquals(0, $exceptionCount, sprintf('No exceptions were expected but %d were thrown.', $exceptionCount)); - } - - } - - public static function dataForCommand(): \Generator - { - - // Примеры недопустимых доменов - $arrInvalidDomains = [ - ['oldDomain' => 'invalid_domain.com', 'newDomain' => 'valid.com'], // Неправильный формат (подчеркивание) - ['oldDomain' => '-invalid.com', 'newDomain' => 'valid.com'], // Домен не может начинаться с дефиса - ['oldDomain' => 'invalid-.com', 'newDomain' => 'valid.com'], // Домен не может заканчиваться на дефис - ['oldDomain' => '123.456.789.0', 'newDomain' => 'valid.com'], // Неправильный формат (IP-адрес) - ['oldDomain' => 'example..com', 'newDomain' => 'valid.com'], // Два подряд идущих точки - ['oldDomain' => 'example.c', 'newDomain' => 'valid.com'] // Слишком короткая доменная зона - ]; - - // Примеры допустимых доменов - $arrValidDomains = [ - ['oldDomain' => 'example.com', 'newDomain' => 'example.org'], - ['oldDomain' => 'пример.рф', 'newDomain' => 'пример.рус'], - ['oldDomain' => 'test-site.org', 'newDomain' => 'test-site.ru'], - ['oldDomain' => 'valid-domain.co.uk', 'newDomain' => 'valid-domain.net'], - ['oldDomain' => 'subdomain.example.com', 'newDomain' => 'subdomain2.example.com'], - ['oldDomain' => 'тест.рус', 'newDomain' => 'тест2.рус'], // Пример с кириллицей - ]; - - yield 'invalidDomain' => [ - [$arrInvalidDomains], // Оборачиваем в массив для передачи в testValidCommand - \InvalidArgumentException::class - ]; - - yield 'validDomain' => [ - [$arrValidDomains], // Оборачиваем в массив для передачи в testValidCommand - null // Здесь исключение не ожидается - ]; - } -} diff --git a/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php b/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php index bfd3e1d..2f4bfe4 100644 --- a/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php +++ b/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php @@ -5,6 +5,7 @@ namespace Bitrix24\Lib\Tests\Unit\Bitrix24Accounts\UseCase\ChangeDomainUrl; use Bitrix24\Lib\Bitrix24Accounts\UseCase\ChangeDomainUrl\Command; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; @@ -18,43 +19,64 @@ class CommandTest extends TestCase { #[Test] - #[DataProvider('dataForCommand')] - public function testValidCommand( - string $oldDomain, - string $newDomain, + #[DataProvider('dataForValidateDomain')] + public function testValidateDomain( + array $arrDomains, ?string $expectedException - ): void - { + ): void { - if ($expectedException !== null) { - $this->expectException(\InvalidArgumentException::class); + $exceptionCount = 0; + foreach ($arrDomains as $arrDomain) { + try { + $oldDomain = new Domain($arrDomain['oldDomain']); + $newDomain = new Domain($arrDomain['newDomain']); + new Command($oldDomain, $newDomain); + } catch (\InvalidArgumentException) { + // Увеличиваем счетчик при каждом выбросе исключения + $exceptionCount++; + } } - $command = new Command($oldDomain, $newDomain); - - if ($expectedException == null) { - $this->assertInstanceOf(Command::class, $command); + // Проверяем, сколько исключений было выброшено + if ($expectedException !== null) { + $this->assertEquals(6, $exceptionCount, 'Expected 6 invalid exception and received ' . $exceptionCount); + } else { + // Если ожидается отсутствие исключений, проверяем что их не было + $this->assertEquals(0, $exceptionCount, sprintf('No exceptions were expected but %d were thrown.', $exceptionCount)); } } - public static function dataForCommand(): \Generator + public static function dataForValidateDomain(): \Generator { - $invalidOldDomain = 'invalid_domain.com'; - $invalidNewDomain = 'valid.com'; - $validOldDomain = 'example.com'; - $validNewDomain = 'example.org'; + // Примеры недопустимых доменов + $arrInvalidDomains = [ + ['oldDomain' => 'invalid_domain.com', 'newDomain' => 'valid.com'], // Неправильный формат (подчеркивание) + ['oldDomain' => '-invalid.com', 'newDomain' => 'valid.com'], // Домен не может начинаться с дефиса + ['oldDomain' => 'invalid-.com', 'newDomain' => 'valid.com'], // Домен не может заканчиваться на дефис + ['oldDomain' => '123.456.789.0', 'newDomain' => 'valid.com'], // Неправильный формат (IP-адрес) + ['oldDomain' => 'example..com', 'newDomain' => 'valid.com'], // Два подряд идущих точки + ['oldDomain' => 'example.c', 'newDomain' => 'valid.com'] // Слишком короткая доменная зона + ]; + + // Примеры допустимых доменов + $arrValidDomains = [ + ['oldDomain' => 'example.com', 'newDomain' => 'example.org'], + ['oldDomain' => 'пример.рф', 'newDomain' => 'пример.рус'], + ['oldDomain' => 'test-site.org', 'newDomain' => 'test-site.ru'], + ['oldDomain' => 'valid-domain.co.uk', 'newDomain' => 'valid-domain.net'], + ['oldDomain' => 'subdomain.example.com', 'newDomain' => 'subdomain2.example.com'], + ['oldDomain' => 'тест.рус', 'newDomain' => 'тест2.рус'], // Пример с кириллицей + ]; yield 'invalidDomain' => [ - $invalidOldDomain, - $invalidNewDomain, + $arrInvalidDomains, // Оборачиваем в массив для передачи в testValidCommand \InvalidArgumentException::class ]; yield 'validDomain' => [ - $validOldDomain, - $validNewDomain, + $arrValidDomains, // Оборачиваем в массив для передачи в testValidCommand null // Здесь исключение не ожидается ]; } diff --git a/tests/Unit/Bitrix24Accounts/UseCase/InstallFinish/CommandTest.php b/tests/Unit/Bitrix24Accounts/UseCase/InstallFinish/CommandTest.php index c11824b..dd7d259 100644 --- a/tests/Unit/Bitrix24Accounts/UseCase/InstallFinish/CommandTest.php +++ b/tests/Unit/Bitrix24Accounts/UseCase/InstallFinish/CommandTest.php @@ -12,6 +12,8 @@ use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; use Symfony\Component\Uid\Uuid; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; + /** * @internal @@ -22,13 +24,14 @@ class CommandTest extends TestCase #[Test] #[DataProvider('dataForCommand')] public function testValidCommand( - string $applicationToken, - string $memberId, - string $domainUrl, - int $bitrix24UserId, + string $applicationToken, + string $memberId, + string $domainUrl, + int $bitrix24UserId, ?string $expectedException, ?string $expectedExceptionMessage, - ): void { + ): void + { if (null !== $expectedException) { $this->expectException($expectedException); } @@ -37,12 +40,15 @@ public function testValidCommand( $this->expectExceptionMessage($expectedExceptionMessage); } - new Command( + $domainObject = new Domain($domainUrl); + + $command = new Command( $applicationToken, $memberId, - $domainUrl, + $domainObject, $bitrix24UserId ); + } public static function dataForCommand(): \Generator @@ -76,7 +82,7 @@ public static function dataForCommand(): \Generator '', $bitrix24Account->getBitrix24UserId(), \InvalidArgumentException::class, - 'Domain URL is not valid.' + sprintf('Invalid domain: %s', '') ]; } } diff --git a/tests/Unit/Bitrix24Accounts/UseCase/InstallStart/CommandTest.php b/tests/Unit/Bitrix24Accounts/UseCase/InstallStart/CommandTest.php index c9f1a21..3369550 100644 --- a/tests/Unit/Bitrix24Accounts/UseCase/InstallStart/CommandTest.php +++ b/tests/Unit/Bitrix24Accounts/UseCase/InstallStart/CommandTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; use Symfony\Component\Uid\Uuid; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; + /** * @internal @@ -24,17 +26,18 @@ class CommandTest extends TestCase #[Test] #[DataProvider('dataForCommand')] public function testValidCommand( - Uuid $uuid, - int $bitrix24UserId, - bool $isBitrix24UserAdmin, - string $memberId, - string $domainUrl, + Uuid $uuid, + int $bitrix24UserId, + bool $isBitrix24UserAdmin, + string $memberId, + string $domainUrl, AuthToken $authToken, - int $applicationVersion, - Scope $applicationScope, - ?string $expectedException, - ?string $expectedExceptionMessage, - ): void { + int $applicationVersion, + Scope $applicationScope, + ?string $expectedException, + ?string $expectedExceptionMessage, + ): void + { if (null !== $expectedException) { $this->expectException($expectedException); } @@ -43,16 +46,19 @@ public function testValidCommand( $this->expectExceptionMessage($expectedExceptionMessage); } + $domain = new Domain($domainUrl); + new Command( $uuid, $bitrix24UserId, $isBitrix24UserAdmin, $memberId, - $domainUrl, + $domain, $authToken, $applicationVersion, $applicationScope ); + } public static function dataForCommand(): \Generator @@ -84,7 +90,7 @@ public static function dataForCommand(): \Generator $bitrix24Account->getApplicationVersion(), $bitrix24Account->getApplicationScope(), \InvalidArgumentException::class, - 'Domain URL is not valid.' + sprintf('Invalid domain: %s', '') ]; yield 'validBitrix24UserId' => [ diff --git a/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php b/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php index db55093..a037d1c 100644 --- a/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php +++ b/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php @@ -41,11 +41,8 @@ public function testValidCommand( public static function dataForCommand(): \Generator { - - $applicationToken = Uuid::v7()->toRfc4122(); - yield 'validApplicationToken' => [ - $applicationToken, + Uuid::v7()->toRfc4122(), null, null, ]; From 48173d7bdf443576c631fac8225d2fb69f02b931 Mon Sep 17 00:00:00 2001 From: KarlsonComplete Date: Sat, 8 Feb 2025 14:08:44 +0300 Subject: [PATCH 2/3] =?UTF-8?q?-=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UseCase/InstallFinish/Command.php | 2 +- .../UseCase/InstallStart/Command.php | 5 +- .../UseCase/Uninstall/Command.php | 4 +- .../Builders/Bitrix24AccountBuilder.php | 2 +- .../UseCase/ChangeDomainUrl/CommandTest.php | 67 ++++++++++++++----- .../UseCase/Uninstall/CommandTest.php | 30 +++++---- 6 files changed, 73 insertions(+), 37 deletions(-) diff --git a/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php b/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php index ffe1f89..d0a75a9 100644 --- a/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php +++ b/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php @@ -21,7 +21,7 @@ public function __construct( private function validate(): void { - if ('' === $this->applicationToken || '0' === $this->applicationToken) { + if ('' === $this->applicationToken) { throw new \InvalidArgumentException('Application token cannot be empty.'); } diff --git a/src/Bitrix24Accounts/UseCase/InstallStart/Command.php b/src/Bitrix24Accounts/UseCase/InstallStart/Command.php index 0bab8f0..26526f7 100644 --- a/src/Bitrix24Accounts/UseCase/InstallStart/Command.php +++ b/src/Bitrix24Accounts/UseCase/InstallStart/Command.php @@ -28,15 +28,12 @@ public function __construct( private function validate(): void { - if (empty($this->uuid)) { - throw new \InvalidArgumentException('Empty UUID provided.'); - } if ($this->bitrix24UserId <= 0) { throw new \InvalidArgumentException('Bitrix24 User ID must be a positive integer.'); } - if (!is_string($this->memberId) || ('' === $this->memberId || '0' === $this->memberId)) { + if ('' === $this->memberId) { throw new \InvalidArgumentException('Member ID must be a non-empty string.'); } diff --git a/src/Bitrix24Accounts/UseCase/Uninstall/Command.php b/src/Bitrix24Accounts/UseCase/Uninstall/Command.php index a4a52e1..5a92c6a 100644 --- a/src/Bitrix24Accounts/UseCase/Uninstall/Command.php +++ b/src/Bitrix24Accounts/UseCase/Uninstall/Command.php @@ -17,8 +17,8 @@ public function __construct( private function validate(): void { - if ('' === $this->applicationToken || '0' === $this->applicationToken) { - throw new \InvalidArgumentException('Empty application token application token.'); + if ('' === $this->applicationToken) { + throw new \InvalidArgumentException('Application token must be a non-empty string.'); } } } diff --git a/tests/Functional/Bitrix24Accounts/Builders/Bitrix24AccountBuilder.php b/tests/Functional/Bitrix24Accounts/Builders/Bitrix24AccountBuilder.php index a63331a..bff547e 100644 --- a/tests/Functional/Bitrix24Accounts/Builders/Bitrix24AccountBuilder.php +++ b/tests/Functional/Bitrix24Accounts/Builders/Bitrix24AccountBuilder.php @@ -98,7 +98,7 @@ public function withStatus(Bitrix24AccountStatus $bitrix24AccountStatus): self return $this; } - public function build(): AggregateRootEventsEmitterInterface&Bitrix24AccountInterface + public function build(): Bitrix24Account { $bitrix24Account = new Bitrix24Account( $this->id, diff --git a/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php b/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php index 2f4bfe4..23b1435 100644 --- a/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php +++ b/tests/Unit/Bitrix24Accounts/UseCase/ChangeDomainUrl/CommandTest.php @@ -19,7 +19,7 @@ class CommandTest extends TestCase { #[Test] - #[DataProvider('dataForValidateDomain')] + #[DataProvider('dataForValidateInvalidDomain')] public function testValidateDomain( array $arrDomains, ?string $expectedException @@ -47,18 +47,37 @@ public function testValidateDomain( } - public static function dataForValidateDomain(): \Generator - { + #[Test] + #[DataProvider('dataForValidateValidDomain')] + public function testValidateInvalidDomain( + array $arrDomains, + ?string $expectedException + ): void { - // Примеры недопустимых доменов - $arrInvalidDomains = [ - ['oldDomain' => 'invalid_domain.com', 'newDomain' => 'valid.com'], // Неправильный формат (подчеркивание) - ['oldDomain' => '-invalid.com', 'newDomain' => 'valid.com'], // Домен не может начинаться с дефиса - ['oldDomain' => 'invalid-.com', 'newDomain' => 'valid.com'], // Домен не может заканчиваться на дефис - ['oldDomain' => '123.456.789.0', 'newDomain' => 'valid.com'], // Неправильный формат (IP-адрес) - ['oldDomain' => 'example..com', 'newDomain' => 'valid.com'], // Два подряд идущих точки - ['oldDomain' => 'example.c', 'newDomain' => 'valid.com'] // Слишком короткая доменная зона - ]; + $exceptionCount = 0; + foreach ($arrDomains as $arrDomain) { + try { + $oldDomain = new Domain($arrDomain['oldDomain']); + $newDomain = new Domain($arrDomain['newDomain']); + new Command($oldDomain, $newDomain); + } catch (\InvalidArgumentException) { + // Увеличиваем счетчик при каждом выбросе исключения + $exceptionCount++; + } + } + + // Проверяем, сколько исключений было выброшено + if ($expectedException !== null) { + $this->assertEquals(6, $exceptionCount, 'Expected 6 invalid exception and received ' . $exceptionCount); + } else { + // Если ожидается отсутствие исключений, проверяем что их не было + $this->assertEquals(0, $exceptionCount, sprintf('No exceptions were expected but %d were thrown.', $exceptionCount)); + } + + } + + public static function dataForValidateValidDomain(): \Generator + { // Примеры допустимых доменов $arrValidDomains = [ @@ -70,14 +89,28 @@ public static function dataForValidateDomain(): \Generator ['oldDomain' => 'тест.рус', 'newDomain' => 'тест2.рус'], // Пример с кириллицей ]; - yield 'invalidDomain' => [ - $arrInvalidDomains, // Оборачиваем в массив для передачи в testValidCommand - \InvalidArgumentException::class - ]; - yield 'validDomain' => [ $arrValidDomains, // Оборачиваем в массив для передачи в testValidCommand null // Здесь исключение не ожидается ]; } + + public static function dataForValidateInvalidDomain(): \Generator + { + + // Примеры недопустимых доменов + $arrInvalidDomains = [ + ['oldDomain' => 'invalid_domain.com', 'newDomain' => 'valid.com'], // Неправильный формат (подчеркивание) + ['oldDomain' => '-invalid.com', 'newDomain' => 'valid.com'], // Домен не может начинаться с дефиса + ['oldDomain' => 'invalid-.com', 'newDomain' => 'valid.com'], // Домен не может заканчиваться на дефис + ['oldDomain' => '123.456.789.0', 'newDomain' => 'valid.com'], // Неправильный формат (IP-адрес) + ['oldDomain' => 'example..com', 'newDomain' => 'valid.com'], // Два подряд идущих точки + ['oldDomain' => 'example.c', 'newDomain' => 'valid.com'] // Слишком короткая доменная зона + ]; + + yield 'invalidDomain' => [ + $arrInvalidDomains, // Оборачиваем в массив для передачи в testValidCommand + \InvalidArgumentException::class + ]; + } } diff --git a/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php b/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php index a037d1c..817dbb0 100644 --- a/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php +++ b/tests/Unit/Bitrix24Accounts/UseCase/Uninstall/CommandTest.php @@ -18,8 +18,17 @@ class CommandTest extends TestCase { #[Test] - #[DataProvider('dataForCommand')] - public function testValidCommand( + #[DataProvider('dataForCommandValidToken')] + public function testValidTokenForCommand( + string $applicationToken, + ): void { + $command = new Command($applicationToken); + $this->assertInstanceOf(Command::class, $command); + } + + #[Test] + #[DataProvider('dataForCommandEmptyToken')] + public function testEmptyTokenForCommand( string $applicationToken, ?string $expectedException, ?string $expectedExceptionMessage, @@ -32,25 +41,22 @@ public function testValidCommand( $this->expectExceptionMessage($expectedExceptionMessage); } - $command = new Command($applicationToken); - - if ($expectedException == null) { - $this->assertInstanceOf(Command::class, $command); - } + new Command($applicationToken); } - public static function dataForCommand(): \Generator + public static function dataForCommandValidToken(): \Generator { yield 'validApplicationToken' => [ - Uuid::v7()->toRfc4122(), - null, - null, + Uuid::v7()->toRfc4122() ]; + } + public static function dataForCommandEmptyToken(): \Generator + { yield 'emptyApplicationToken' => [ '', \InvalidArgumentException::class, - 'Empty application token application token.', + 'Application token must be a non-empty string.', ]; } } From d7542887b96065221f9d9f1a09ae53385298a8ac Mon Sep 17 00:00:00 2001 From: KarlsonComplete Date: Sun, 9 Feb 2025 11:48:29 +0300 Subject: [PATCH 3/3] =?UTF-8?q?-=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82=D0=B0=20,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20updateApplicationVersion?= =?UTF-8?q?=20-=20=D0=AE=D0=B7=D0=B0=D0=BD=D1=83=D0=BB=20cs-fixer=20-=20?= =?UTF-8?q?=D0=AE=D0=B7=D0=B0=D0=BD=D1=83=D0=BB=20=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= =?UTF-8?q?=20Domain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entity/Bitrix24Account.php | 2 +- .../UseCase/ChangeDomainUrl/Command.php | 2 + .../UseCase/InstallFinish/Command.php | 5 ++- .../UseCase/InstallStart/Command.php | 8 ++-- src/Bitrix24Accounts/ValueObjects/Domain.php | 39 +++++++++++++++++++ .../UseCase/InstallFinish/CommandTest.php | 6 +-- 6 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 src/Bitrix24Accounts/ValueObjects/Domain.php diff --git a/src/Bitrix24Accounts/Entity/Bitrix24Account.php b/src/Bitrix24Accounts/Entity/Bitrix24Account.php index a269988..616f75d 100644 --- a/src/Bitrix24Accounts/Entity/Bitrix24Account.php +++ b/src/Bitrix24Accounts/Entity/Bitrix24Account.php @@ -233,7 +233,7 @@ public function getUpdatedAt(): CarbonImmutable * @throws InvalidArgumentException */ #[\Override] - public function updateApplicationVersion(int $version, ?Scope $newScope): void + public function updateApplicationVersion(AuthToken $authToken, int $b24UserId, int $version, ?Scope $newScope): void { if (Bitrix24AccountStatus::active !== $this->status) { throw new InvalidArgumentException( diff --git a/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php b/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php index 4ce4d4d..e93ce70 100644 --- a/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php +++ b/src/Bitrix24Accounts/UseCase/ChangeDomainUrl/Command.php @@ -9,7 +9,9 @@ readonly class Command { public string $oldDomain; + public string $newDomain; + public function __construct( Domain $oldDomain, Domain $newDomain diff --git a/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php b/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php index d0a75a9..2ab9f21 100644 --- a/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php +++ b/src/Bitrix24Accounts/UseCase/InstallFinish/Command.php @@ -5,6 +5,7 @@ namespace Bitrix24\Lib\Bitrix24Accounts\UseCase\InstallFinish; use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; + readonly class Command { public string $domain; @@ -12,11 +13,11 @@ public function __construct( public string $applicationToken, public string $memberId, - Domain $domainUrl, + Domain $domain, public int $bitrix24UserId, ) { $this->validate(); - $this->domain = $domainUrl->getValue(); + $this->domain = $domain->getValue(); } private function validate(): void diff --git a/src/Bitrix24Accounts/UseCase/InstallStart/Command.php b/src/Bitrix24Accounts/UseCase/InstallStart/Command.php index 26526f7..3b95869 100644 --- a/src/Bitrix24Accounts/UseCase/InstallStart/Command.php +++ b/src/Bitrix24Accounts/UseCase/InstallStart/Command.php @@ -4,31 +4,31 @@ namespace Bitrix24\Lib\Bitrix24Accounts\UseCase\InstallStart; +use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; use Bitrix24\SDK\Core\Credentials\AuthToken; use Bitrix24\SDK\Core\Credentials\Scope; use Symfony\Component\Uid\Uuid; -use Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain; readonly class Command { public string $domain; + public function __construct( public Uuid $uuid, public int $bitrix24UserId, public bool $isBitrix24UserAdmin, public string $memberId, - Domain $domainUrl, + Domain $domain, public AuthToken $authToken, public int $applicationVersion, public Scope $applicationScope ) { $this->validate(); - $this->domain = $domainUrl->getValue(); + $this->domain = $domain->getValue(); } private function validate(): void { - if ($this->bitrix24UserId <= 0) { throw new \InvalidArgumentException('Bitrix24 User ID must be a positive integer.'); } diff --git a/src/Bitrix24Accounts/ValueObjects/Domain.php b/src/Bitrix24Accounts/ValueObjects/Domain.php new file mode 100644 index 0000000..f958a5a --- /dev/null +++ b/src/Bitrix24Accounts/ValueObjects/Domain.php @@ -0,0 +1,39 @@ +validate($domain); + $this->value = $domain; + } + + public function getValue(): string + { + return $this->value; + } + + private function validate(string $domain): void + { + // Регулярное выражение для проверки допустимых символов (латиница и кириллица) + $patternValidChars = '/^((?!-)[A-Za-zА-Яа-яЁё0-9-]{1,63}(?expectExceptionMessage($expectedExceptionMessage); } - $domainObject = new Domain($domainUrl); + $domain = new Domain($domainUrl); - $command = new Command( + new Command( $applicationToken, $memberId, - $domainObject, + $domain, $bitrix24UserId );