From ba93b2c35c2948c3bd577d301804b12cc381b388 Mon Sep 17 00:00:00 2001 From: konradoboza Date: Thu, 31 Oct 2024 12:01:12 +0100 Subject: [PATCH] Added CI job to run automatic tests --- .github/workflows/backend-ci.yaml | 90 +++++++++++++++++++ composer.json | 19 ++-- phpstan-baseline.neon | 54 ++++++----- .../ContentProxyTranslateListener.php | 14 ++- ...IbexaAutomatedTranslationExtensionTest.php | 14 +-- .../Field/PageBuilderFieldEncoderTest.php | 8 +- 6 files changed, 151 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/backend-ci.yaml diff --git a/.github/workflows/backend-ci.yaml b/.github/workflows/backend-ci.yaml new file mode 100644 index 0000000..4436561 --- /dev/null +++ b/.github/workflows/backend-ci.yaml @@ -0,0 +1,90 @@ +name: Backend build + +on: + push: + branches: + - main + - '[0-9]+.[0-9]+' + pull_request: ~ + +jobs: + cs-fix: + name: Run code style check + runs-on: "ubuntu-22.04" + strategy: + matrix: + php: + - '8.1' + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP Action + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: 'pdo_sqlite, gd' + tools: cs2pr + + - name: Add composer keys for private packagist + run: | + composer config http-basic.updates.ibexa.co $SATIS_NETWORK_KEY $SATIS_NETWORK_TOKEN + composer config github-oauth.github.com $TRAVIS_GITHUB_TOKEN + env: + SATIS_NETWORK_KEY: ${{ secrets.SATIS_NETWORK_KEY }} + SATIS_NETWORK_TOKEN: ${{ secrets.SATIS_NETWORK_TOKEN }} + TRAVIS_GITHUB_TOKEN: ${{ secrets.TRAVIS_GITHUB_TOKEN }} + + - uses: ramsey/composer-install@v3 + with: + dependency-versions: "highest" + + - name: Run code style check + run: composer run-script check-cs -- --format=checkstyle | cs2pr + + tests: + name: Tests + runs-on: "ubuntu-22.04" + timeout-minutes: 10 + + strategy: + fail-fast: false + matrix: + php: + - '7.4' + - '8.2' + - '8.3' + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP Action + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + extensions: pdo_sqlite, gd + tools: cs2pr + + - name: Add composer keys for private packagist + run: | + composer config http-basic.updates.ibexa.co $SATIS_NETWORK_KEY $SATIS_NETWORK_TOKEN + composer config github-oauth.github.com $TRAVIS_GITHUB_TOKEN + env: + SATIS_NETWORK_KEY: ${{ secrets.SATIS_NETWORK_KEY }} + SATIS_NETWORK_TOKEN: ${{ secrets.SATIS_NETWORK_TOKEN }} + TRAVIS_GITHUB_TOKEN: ${{ secrets.TRAVIS_GITHUB_TOKEN }} + + - uses: ramsey/composer-install@v3 + with: + dependency-versions: "highest" + composer-options: "--prefer-dist --no-progress --no-suggest" + + - name: Setup problem matchers for PHPUnit + run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + + - name: Run PHPStan analysis + run: composer run-script phpstan + + - name: Run test suite + run: composer run-script --timeout=600 test diff --git a/composer.json b/composer.json index 2864cae..9ea2bd0 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,12 @@ "deepl", "googletranslate" ], + "repositories": [ + { + "type": "composer", + "url": "https://updates.ibexa.co" + } + ], "homepage": "https://github.com/ibexa/automated-translation", "type": "ibexa-bundle", "authors": [ @@ -33,15 +39,18 @@ "symfony/http-foundation": "^5.0", "symfony/event-dispatcher": "^5.0", "guzzlehttp/guzzle": "^6.3.0", - "ibexa/core": "~4.6.0@dev", - "ibexa/fieldtype-richtext": "~4.6.0@dev", - "ibexa/admin-ui": "~4.6.0@dev" + "ibexa/core": "~4.6.x-dev", + "ibexa/fieldtype-richtext": "~4.6.x-dev", + "ibexa/admin-ui": "~4.6.x-dev" }, "require-dev": { "squizlabs/php_codesniffer": "^3.2", "phpmd/phpmd": "^2.6", "phpunit/phpunit": "^8.5", "ibexa/code-style": "^1.0", + "ibexa/migrations": "~4.6.x-dev", + "ibexa/fieldtype-page": "~4.6.x-dev", + "ibexa/search": "~4.6.x-dev", "dg/bypass-finals": "^1.3", "phpstan/phpstan": "^1.2", "phpstan/phpstan-phpunit": "^1.0", @@ -82,9 +91,7 @@ }, "config": { "sort-packages": true, - "allow-plugins": { - "composer/package-versions-deprecated": true - } + "allow-plugins": false }, "extra": { "branch-alias": { diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 82e4887..e4d5f04 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,52 +1,62 @@ parameters: ignoreErrors: + - + message: "#^Parameter \\#2 \\$callback of function array_filter expects \\(callable\\(mixed\\)\\: bool\\)\\|null, Closure\\(mixed\\)\\: \\(array\\|null\\) given\\.$#" + count: 1 + path: src/bundle/DependencyInjection/IbexaAutomatedTranslationExtension.php + - message: "#^Access to protected property Ibexa\\\\AdminUi\\\\Form\\\\Data\\\\ContentTranslationData\\:\\:\\$content\\.$#" count: 4 path: src/bundle/Form/Extension/ContentEditType.php - - message: "#^Call to method getBlockDefinition\\(\\) on an unknown class Ibexa\\\\FieldTypePage\\\\FieldType\\\\Page\\\\Block\\\\Definition\\\\BlockDefinitionFactory\\.$#" + message: "#^Parameter \\#3 \\$remoteServiceKey of method Ibexa\\\\AutomatedTranslation\\\\Translator\\:\\:getTranslatedFields\\(\\) expects string, string\\|null given\\.$#" count: 1 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + path: src/bundle/Form/Extension/ContentEditType.php - - message: "#^Call to method getPage\\(\\) on an unknown class Ibexa\\\\FieldTypePage\\\\FieldType\\\\LandingPage\\\\Value\\.$#" - count: 2 + message: "#^Cannot call method setValue\\(\\) on Ibexa\\\\Contracts\\\\FieldTypePage\\\\FieldType\\\\LandingPage\\\\Model\\\\Attribute\\|null\\.$#" + count: 1 path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php - - message: "#^Instantiated class Ibexa\\\\FieldTypePage\\\\FieldType\\\\LandingPage\\\\Value not found\\.$#" - count: 2 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + message: "#^Call to an undefined method Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\BlockAttribute\\\\BlockAttributeEncoderManager\\:\\:expects\\(\\)\\.$#" + count: 1 + path: tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php - - message: "#^Method Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\Field\\\\PageBuilderFieldEncoder\\:\\:decode\\(\\) should return Ibexa\\\\Core\\\\FieldType\\\\Value but returns Ibexa\\\\FieldTypePage\\\\FieldType\\\\LandingPage\\\\Value\\.$#" - count: 2 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + message: "#^Call to an undefined method Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\BlockAttribute\\\\BlockAttributeEncoderManager\\:\\:method\\(\\)\\.$#" + count: 1 + path: tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php - - message: "#^PHPDoc tag @var for variable \\$previousFieldValue contains unknown class Ibexa\\\\FieldTypePage\\\\FieldType\\\\LandingPage\\\\Value\\.$#" + message: "#^Call to an undefined method Ibexa\\\\FieldTypePage\\\\FieldType\\\\Page\\\\Block\\\\Definition\\\\BlockDefinitionFactoryInterface\\:\\:method\\(\\)\\.$#" count: 1 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + path: tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php - - message: "#^PHPDoc tag @var for variable \\$value contains unknown class Ibexa\\\\FieldTypePage\\\\FieldType\\\\LandingPage\\\\Value\\.$#" + message: "#^Parameter \\#1 \\$type of method Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\Field\\\\PageBuilderFieldEncoder\\:\\:canDecode\\(\\) expects string, class\\-string\\|false given\\.$#" count: 1 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + path: tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php - - message: "#^Parameter \\$blockDefinitionFactory of method Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\Field\\\\PageBuilderFieldEncoder\\:\\:__construct\\(\\) has invalid type Ibexa\\\\FieldTypePage\\\\FieldType\\\\Page\\\\Block\\\\Definition\\\\BlockDefinitionFactory\\.$#" - count: 1 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + message: "#^Parameter \\#2 \\$blockDefinitionFactory of class Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\Field\\\\PageBuilderFieldEncoder constructor expects Ibexa\\\\FieldTypePage\\\\FieldType\\\\Page\\\\Block\\\\Definition\\\\BlockDefinitionFactory, Ibexa\\\\FieldTypePage\\\\FieldType\\\\Page\\\\Block\\\\Definition\\\\BlockDefinitionFactoryInterface given\\.$#" + count: 4 + path: tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php - - message: "#^Property Ibexa\\\\AutomatedTranslation\\\\Encoder\\\\Field\\\\PageBuilderFieldEncoder\\:\\:\\$blockDefinitionFactory has unknown class Ibexa\\\\FieldTypePage\\\\FieldType\\\\Page\\\\Block\\\\Definition\\\\BlockDefinitionFactory as its type\\.$#" + message: "#^Return type of call to method PHPUnit\\\\Framework\\\\TestCase\\:\\:createMock\\(\\) contains unresolvable type\\.$#" count: 1 - path: src/lib/Encoder/Field/PageBuilderFieldEncoder.php + path: tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php - - message: "#^Parameter \\#1 \\$function of function call_user_func_array expects callable\\(\\)\\: mixed, array\\{Ibexa\\\\Bundle\\\\AutomatedTranslation\\\\DependencyInjection\\\\IbexaAutomatedTranslationExtension, mixed\\} given\\.$#" - count: 1 - path: tests/bundle/DependencyInjection/IbexaAutomatedTranslationExtensionTest.php + message: "#^Return type of call to method PHPUnit\\\\Framework\\\\MockObject\\\\MockBuilder\\\\:\\:getMock\\(\\) contains unresolvable type\\.$#" + count: 2 + path: tests/lib/Encoder/Field/RichTextFieldEncoderTest.php + + - + message: "#^Return type of call to method PHPUnit\\\\Framework\\\\MockObject\\\\MockBuilder\\\\:\\:getMock\\(\\) contains unresolvable type\\.$#" + count: 2 + path: tests/lib/EncoderTest.php diff --git a/src/bundle/EventListener/ContentProxyTranslateListener.php b/src/bundle/EventListener/ContentProxyTranslateListener.php index 20dc5fb..63430f3 100644 --- a/src/bundle/EventListener/ContentProxyTranslateListener.php +++ b/src/bundle/EventListener/ContentProxyTranslateListener.php @@ -18,17 +18,13 @@ class ContentProxyTranslateListener implements EventSubscriberInterface { - /** @var \Symfony\Component\HttpFoundation\RequestStack */ - private $requestStack; + private RequestStack $requestStack; - /** @var \Ibexa\AutomatedTranslation\Translator */ - private $translator; + private Translator $translator; - /** @var \Ibexa\Contracts\Core\Repository\ContentService */ - private $contentService; + private ContentService $contentService; - /** @var \Symfony\Component\Routing\RouterInterface */ - private $router; + private RouterInterface $router; public function __construct( RequestStack $requestStack, @@ -74,7 +70,7 @@ public function translate(ContentProxyTranslateEvent $event): void $contentDraft = $this->translator->getTranslatedContent( $fromLanguageCode, $toLanguageCode, - $request->query->get('translatorAlias'), + $request->query->get('translatorAlias') ?? '', $content ); diff --git a/tests/bundle/DependencyInjection/IbexaAutomatedTranslationExtensionTest.php b/tests/bundle/DependencyInjection/IbexaAutomatedTranslationExtensionTest.php index 63df52b..7f956ca 100644 --- a/tests/bundle/DependencyInjection/IbexaAutomatedTranslationExtensionTest.php +++ b/tests/bundle/DependencyInjection/IbexaAutomatedTranslationExtensionTest.php @@ -12,7 +12,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\ContainerBuilder; -class IbexaAutomatedTranslationExtensionTest extends TestCase +final class IbexaAutomatedTranslationExtensionTest extends TestCase { /** * @return array{array{array{system: array{default: array{configurations: array{}}}}, bool}} @@ -63,7 +63,8 @@ public function clientConfigurationDataProvider(): array } /** - * @param array $input + * @param array{system: array{configurations: mixed}} $input + * * @dataProvider clientConfigurationDataProvider */ public function testHasConfiguredClients(array $input, bool $expected): void @@ -73,7 +74,6 @@ public function testHasConfiguredClients(array $input, bool $expected): void ->getMock(); $containerMock - ->expects($this->any()) ->method('resolveEnvPlaceholders') ->withConsecutive(['value1'], ['value2'], ['ENV_TEST1']) ->willReturnOnConsecutiveCalls(['value1'], ['value2'], ['test1']); @@ -81,13 +81,13 @@ public function testHasConfiguredClients(array $input, bool $expected): void $subject = new IbexaAutomatedTranslationExtension(); // call for private method hasConfiguredClients on $subject object - $hasConfiguredClientsResult = call_user_func_array(\Closure::bind( - function ($method, $params) { - return call_user_func_array([$this, $method], $params); + $hasConfiguredClientsResult = (\Closure::bind( + function () use ($input, $containerMock): bool { + return $this->hasConfiguredClients($input, $containerMock); }, $subject, IbexaAutomatedTranslationExtension::class - ), ['hasConfiguredClients', [$input, $containerMock]]); + ))(); $this->assertEquals($expected, $hasConfiguredClientsResult); } diff --git a/tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php b/tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php index dcb480d..4952143 100644 --- a/tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php +++ b/tests/lib/Encoder/Field/PageBuilderFieldEncoderTest.php @@ -15,10 +15,10 @@ use Ibexa\Contracts\FieldTypePage\FieldType\LandingPage\Model\BlockValue; use Ibexa\Contracts\FieldTypePage\FieldType\LandingPage\Model\Page; use Ibexa\Contracts\FieldTypePage\FieldType\LandingPage\Model\Zone; -use Ibexa\Contracts\FieldTypePage\FieldType\LandingPage\Value; use Ibexa\Contracts\FieldTypePage\FieldType\Page\Block\Definition\BlockAttributeDefinition; use Ibexa\Contracts\FieldTypePage\FieldType\Page\Block\Definition\BlockDefinition; -use Ibexa\Contracts\FieldTypePage\FieldType\Page\Block\Definition\BlockDefinitionFactory; +use Ibexa\FieldTypePage\FieldType\LandingPage\Value; +use Ibexa\FieldTypePage\FieldType\Page\Block\Definition\BlockDefinitionFactoryInterface; use PHPUnit\Framework\TestCase; final class PageBuilderFieldEncoderTest extends TestCase @@ -27,12 +27,12 @@ final class PageBuilderFieldEncoderTest extends TestCase private BlockAttributeEncoderManager $blockAttributeEncoderManagerMock; - private BlockDefinitionFactory $blockDefinitionFactoryMock; + private BlockDefinitionFactoryInterface $blockDefinitionFactoryMock; public function setUp(): void { $this->blockAttributeEncoderManagerMock = $this->createMock(BlockAttributeEncoderManager::class); - $this->blockDefinitionFactoryMock = $this->createMock(BlockDefinitionFactory::class); + $this->blockDefinitionFactoryMock = $this->createMock(BlockDefinitionFactoryInterface::class); } public function testEncode(): void