From 9e7346e84f508b1dbb325f90fc442da263e6c8f2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <> Date: Sat, 10 Feb 2024 19:49:53 +0000 Subject: [PATCH] Build release --- .editorconfig | 8 - .github/workflows/build.yml | 12 -- .github/workflows/js.yml | 27 --- .github/workflows/php.yml | 38 ---- .github/workflows/release.yml | 12 -- .gitignore | 8 - .shopware-extension.yml | 17 -- CHANGELOG_en-GB.md | 12 ++ .../css/frosh-platform-template-mail.css | 1 + .../js/frosh-platform-template-mail.js | 130 +++++++++++++ src/Resources/store/de.md | 20 -- src/Resources/store/en.md | 19 -- src/Resources/store/icon.png | Bin 10151 -> 0 bytes src/Resources/store/images/1.png | Bin 26472 -> 0 bytes tests/Command/ExportCommandTest.php | 47 ----- tests/Extension/MailTemplateExtensionTest.php | 38 ---- tests/Integration/OrderTest.php | 182 ------------------ .../SetupExampleTemplatesTrait.php | 55 ------ .../CachedMailFinderServiceTest.php | 27 --- tests/Services/MailLoader/MjmlLoaderTest.php | 58 ------ tests/Services/MailLoader/TwigLoaderTest.php | 20 -- tests/Services/MailLoader/_fixtures/test.inky | 5 - tests/Services/MailLoader/_fixtures/test.mjml | 11 -- tests/Services/SearchPathProviderTest.php | 77 -------- tests/Services/StringTemplateRendererTest.php | 30 --- tests/Subscriber/FlowSubscriberTest.php | 41 ---- tests/TestBootstraper.php | 48 ----- 27 files changed, 143 insertions(+), 800 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/js.yml delete mode 100644 .github/workflows/php.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .gitignore delete mode 100644 .shopware-extension.yml create mode 100644 CHANGELOG_en-GB.md create mode 100644 src/Resources/public/administration/css/frosh-platform-template-mail.css create mode 100644 src/Resources/public/administration/js/frosh-platform-template-mail.js delete mode 100644 src/Resources/store/de.md delete mode 100644 src/Resources/store/en.md delete mode 100644 src/Resources/store/icon.png delete mode 100644 src/Resources/store/images/1.png delete mode 100644 tests/Command/ExportCommandTest.php delete mode 100644 tests/Extension/MailTemplateExtensionTest.php delete mode 100644 tests/Integration/OrderTest.php delete mode 100644 tests/Integration/SetupExampleTemplatesTrait.php delete mode 100644 tests/Services/MailLoader/CachedMailFinderServiceTest.php delete mode 100644 tests/Services/MailLoader/MjmlLoaderTest.php delete mode 100644 tests/Services/MailLoader/TwigLoaderTest.php delete mode 100644 tests/Services/MailLoader/_fixtures/test.inky delete mode 100644 tests/Services/MailLoader/_fixtures/test.mjml delete mode 100644 tests/Services/SearchPathProviderTest.php delete mode 100644 tests/Services/StringTemplateRendererTest.php delete mode 100644 tests/Subscriber/FlowSubscriberTest.php delete mode 100644 tests/TestBootstraper.php diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index d3fcdc6..0000000 --- a/.editorconfig +++ /dev/null @@ -1,8 +0,0 @@ -root = true - -[*] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 4 -charset = utf-8 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 1655bc1..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: Build extension -on: - workflow_dispatch: - push: - branches: - - main - -jobs: - build: - uses: shopware/github-actions/.github/workflows/build-zip.yml@main - with: - extensionName: ${{ github.event.repository.name }} diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml deleted file mode 100644 index 0a9cee8..0000000 --- a/.github/workflows/js.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: JavaScript -on: - push: - paths: - - '**/*.js' - - '**/*.ts' - branches: - - main - pull_request: - paths: - - '**/*.js' - - '**/*.ts' - -jobs: - run: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Biome CLI - uses: biomejs/setup-biome@v2 - with: - version: latest - - - name: Run Biome - run: biome ci . diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml deleted file mode 100644 index 5008d0b..0000000 --- a/.github/workflows/php.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: PHP -on: - pull_request: - paths: - - '**/*.php' - - .github/workflows/php.yml - push: - paths: - - '**/*.php' - branches: - - main - workflow_dispatch: - schedule: - - cron: '0 3 * * *' - -jobs: - cs: - if: github.event_name != 'schedule' - uses: shopware/github-actions/.github/workflows/cs-fixer.yml@main - phpstan: - uses: shopware/github-actions/.github/workflows/phpstan.yml@main - with: - extensionName: ${{ github.event.repository.name }} - shopwareVersion: 6.5.x - phpunit: - strategy: - fail-fast: false - matrix: - shopware-version: - - '6.5.x' - - 'v6.6.0.0-rc2' - uses: shopware/github-actions/.github/workflows/phpunit.yml@main - with: - extensionName: ${{ github.event.repository.name }} - shopwareVersion: ${{ matrix.shopware-version }} - uploadCoverage: true - secrets: - codecovToken: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 7d0cd69..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: Release to Store -on: - workflow_dispatch: -jobs: - build: - uses: shopware/github-actions/.github/workflows/store-release.yml@main - with: - extensionName: ${{ github.event.repository.name }} - secrets: - accountUser: ${{ secrets.SHOPWARE_CLI_ACCOUNT_EMAIL }} - accountPassword: ${{ secrets.SHOPWARE_CLI_ACCOUNT_PASSWORD }} - ghToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 9d1e742..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.idea -*.phar -/.phpunit.result.cache -/composer.lock -/vendor -src/Resources/views/ -src/Resources/public/ -/.php-cs-fixer.cache diff --git a/.shopware-extension.yml b/.shopware-extension.yml deleted file mode 100644 index cddce5c..0000000 --- a/.shopware-extension.yml +++ /dev/null @@ -1,17 +0,0 @@ -changelog: - enabled: true - -build: - zip: - composer: - enabled: false - assets: - enabled: true - enable_es_build_for_admin: true - enable_es_build_for_storefront: true - pack: - excludes: - paths: - - .idea - - var - - .gitignore diff --git a/CHANGELOG_en-GB.md b/CHANGELOG_en-GB.md new file mode 100644 index 0000000..69af7ce --- /dev/null +++ b/CHANGELOG_en-GB.md @@ -0,0 +1,12 @@ +# 3.0.1 +- [chore: increase version](/c73a8bb) +- [ci: add js linting](/91c470e) +- [fix: unused imports](/0a9047f) +- [feat: add phpstan](/c942ee7) +- [fix: admin creating new mail template, fixes #57](/759ab95) +- [fix: improve injecting the language into mailer, fixes #43](/0a1379f) +- [ci: update workflows](/282f1b6) +- [ci: delete backporting](/0cf541d) +- [fix: restore 6.5 compatiblity](/76ff889) +- [Add configurable MJML server (#55)](/cb608fc) +- [ci: add backporting](/269fd74) \ No newline at end of file diff --git a/src/Resources/public/administration/css/frosh-platform-template-mail.css b/src/Resources/public/administration/css/frosh-platform-template-mail.css new file mode 100644 index 0000000..1b3fcb0 --- /dev/null +++ b/src/Resources/public/administration/css/frosh-platform-template-mail.css @@ -0,0 +1 @@ +.sw-mail-template-detail__options-info-wrapper .sw-field,.sw-mail-template-detail .sw-code-editor{margin-bottom:5px}.sw-mail-template-detail .sw-code-editor+.sw-label{margin-bottom:32px} diff --git a/src/Resources/public/administration/js/frosh-platform-template-mail.js b/src/Resources/public/administration/js/frosh-platform-template-mail.js new file mode 100644 index 0000000..0dc6940 --- /dev/null +++ b/src/Resources/public/administration/js/frosh-platform-template-mail.js @@ -0,0 +1,130 @@ +(()=>{var l=`{% block sw_mail_template_list_grid %} + + + + + + +{% endblock %} +`;Shopware.Component.override("sw-mail-template-list",{template:l,methods:{getListColumns(){let e=this.$super("getListColumns");return e.unshift({property:"froshTemplateMail",label:"sw-mail-template.list.columnTemplateMail",allowResize:!0},{property:"technicalName",label:"sw-mail-template.list.columnTechnicalName",allowResize:!0,visible:!1}),e},getFroshTooltip(e,t){return{message:t?this.$t(`sw-mail-template.frosh.${e}`,{folder:t}):this.$t("sw-mail-template.frosh.noTemplate")}}}});var a=`{% block sw_mail_template_options_form_subject_field %} + {% parent %} + + + +{% endblock %} + +{% block sw_mail_template_mail_text_form_content_plain_field %} + {% parent %} + + + +{% endblock %} + +{% block sw_mail_template_mail_text_form_content_html_field %} + {% parent %} + + + +{% endblock %} +`;Shopware.Component.override("sw-mail-template-detail",{template:a,methods:{getFroshTooltip(e,t){return{message:t?this.$t(`sw-mail-template.frosh.${e}`,{folder:t}):this.$t("sw-mail-template.frosh.noTemplate")}}}});})(); diff --git a/src/Resources/store/de.md b/src/Resources/store/de.md deleted file mode 100644 index daf8f9b..0000000 --- a/src/Resources/store/de.md +++ /dev/null @@ -1,20 +0,0 @@ -Mit Template Mail kannst du deine Mail-Templates aus der Administration in dein Theme auslagern. -Somit sind deine Mail-Templates versioniert, können voneinander erben und du profitierst von all den anderen tollen Dingen, die man in Twig machen kann. -Dieses Plugin stellt außerdem einen Loader bereit, der dafür sorgt, dass andere Plugins weitere Dateitypen hinzufügen können. Im Plugin selbst werden aktuell Twig, [MJML](https://mjml.io/) und [Inky](https://foundation.zurb.com/emails/docs/inky.html) unterstützt. - - -## Wie benutze ich das Plugin? -Durch die Installation ändert sich erst mal nichts für dich. Du kannst anfangen die ersten Templates in dein Theme auszulagern. - -### Beispiel Pfade für Twig, Zahlungsbestätigung (*order_transaction.state.paid*): -Ordner: custom/plugins/*MyTheme*/Resources/views/email/global/ - -- HTML-Inhalt der Zahlungsbestätigung: *order_transaction.state.paid*/html.twig -- PlainText-Inhalt der Zahlungsbestätigung: *order_transaction.state.paid*/plain.twig -- Betreff der Zahlungsbestätigung: *order_transaction.state.paid*/subject.twig - - -Das Plugin wird von der Github Organization [FriendsOfShopware](https://github.com/FriendsOfShopware/) entwickelt. -Maintainer des Plugin ist [Soner Sayakci](https://github.com/shyim). -Das Github Repository ist zu finden [hier](https://github.com/FriendsOfShopware/FroshPlatformTemplateMail) -[Bei Fragen / Fehlern bitte ein Github Issue erstellen](https://github.com/FriendsOfShopware/FroshPlatformTemplateMail/issues/new) diff --git a/src/Resources/store/en.md b/src/Resources/store/en.md deleted file mode 100644 index 2dc5b2e..0000000 --- a/src/Resources/store/en.md +++ /dev/null @@ -1,19 +0,0 @@ -With Template Mail you can outsource your mail templates in the administration to your theme. -So your mail templates are versioned, can inherit from each other and all the other great things you can do in Twig. -The plugin also supports loaders. So other plugins can add file extensions where they can create the mail. -The plugin itself supports Twig and MJML by default. - -## How do I use the plugin? - -After installation nothing changes for you. You can now start to swap the first templates into your theme. - -Example paths: - -* custom/plugins/MyTheme/Resources/views/email/global/order_transaction.state.paid/html.twig - content of the sOrder in HTML form -* custom/plugins/MyTheme/Resources/views/email/global/order_transaction.state.paid/plain.twig - content of the sOrder in text form -* custom/plugins/MyTheme/Resources/views/email/global/order_transaction.state.paid/subject.twig - title of the sOrder Mailion) - -The plugin is provided by the Github Organization [FriendsOfShopware](https://github.com/FriendsOfShopware/). -Maintainer of the plugin is [Soner Sayakci](https://github.com/shyim). -You can find the Github Repository [here](https://github.com/FriendsOfShopware/FroshPlatformTemplateMail) -[For questions / errors please create a Github Issue](https://github.com/FriendsOfShopware/FroshPlatformTemplateMail/issues/new) diff --git a/src/Resources/store/icon.png b/src/Resources/store/icon.png deleted file mode 100644 index 885856b6e391cc84d714204bf9a596ca42f432b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10151 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�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::class); - $connection->method('fetchAllAssociative')->willReturn([ - [ - 'content_plain' => 'My content', - 'content_html' => '

My content

', - 'subject' => 'Test template', - 'technical_name' => 'test_template', - 'locale' => 'en', - ], - ]); - - $command = new ExportCommand($connection); - - $tester = new CommandTester($command); - $tester->execute(['directory' => sys_get_temp_dir()]); - - $htmlFile = sys_get_temp_dir() . '/en/test_template/html.twig'; - $plainFile = sys_get_temp_dir() . '/en/test_template/plain.twig'; - $subjectFile = sys_get_temp_dir() . '/en/test_template/subject.twig'; - - static::assertFileExists($htmlFile); - static::assertFileExists($plainFile); - static::assertFileExists($subjectFile); - - static::assertEquals('

My content

', file_get_contents($htmlFile)); - static::assertEquals('My content', file_get_contents($plainFile)); - static::assertEquals('Test template', file_get_contents($subjectFile)); - - static::assertSame(0, $tester->getStatusCode()); - static::assertStringContainsString('Files has been exported', $tester->getDisplay()); - } -} diff --git a/tests/Extension/MailTemplateExtensionTest.php b/tests/Extension/MailTemplateExtensionTest.php deleted file mode 100644 index 0e31d36..0000000 --- a/tests/Extension/MailTemplateExtensionTest.php +++ /dev/null @@ -1,38 +0,0 @@ -getMockBuilder(FieldCollection::class) - ->disableOriginalConstructor() - ->onlyMethods(['add']) - ->getMock(); - - $collection - ->expects(static::once()) - ->method('add') - ->with((new StringField('frosh_template_mail', 'froshTemplateMail'))->addFlags(new Runtime())); - - (new MailTemplateExtension())->extendFields($collection); - } - - public function testGetDefinitionClassReturnsMailTemplateDefinitionClass(): void - { - static::assertSame( - MailTemplateDefinition::class, - (new MailTemplateExtension())->getDefinitionClass() - ); - } -} diff --git a/tests/Integration/OrderTest.php b/tests/Integration/OrderTest.php deleted file mode 100644 index 5f9c41b..0000000 --- a/tests/Integration/OrderTest.php +++ /dev/null @@ -1,182 +0,0 @@ -orderService = $this->getContainer()->get(OrderService::class); - - $this->addCountriesToSalesChannel(); - - $contextFactory = $this->getContainer()->get(SalesChannelContextFactory::class); - $this->salesChannelContext = $contextFactory->create( - '', - TestDefaults::SALES_CHANNEL, - [SalesChannelContextService::CUSTOMER_ID => $this->createCustomer('Jon', 'Doe')] - ); - } - - public function testOrderConfirmationMail(): void - { - $eventDispatcher = $this->getContainer()->get('event_dispatcher'); - $mailSentEvent = null; - - $eventDispatcher->addListener(MailSentEvent::class, function (MailSentEvent $e) use (&$mailSentEvent): void { - $mailSentEvent = $e; - }); - - $this->performOrder(); - - static::assertNotNull($mailSentEvent, 'Mail did not sent'); - - static::assertSame( - [ - 'text/html' => 'HTML CONFIRM', - 'text/plain' => 'TEXT CONFIRM', - ], - $mailSentEvent->getContents() - ); - static::assertSame('SUBJECT CONFIRM', $mailSentEvent->getSubject()); - } - - private function fillCart(string $contextToken): void - { - $cart = $this->getContainer()->get(CartService::class)->createNew($contextToken); - - $productId = $this->createProduct(); - $cart->add(new LineItem('lineItem1', LineItem::PRODUCT_LINE_ITEM_TYPE, $productId)); - $cart->setTransactions($this->createTransaction()); - } - - private function createProduct(): string - { - $productId = Uuid::randomHex(); - - $product = [ - 'id' => $productId, - 'name' => 'Test product', - 'productNumber' => '123456789', - 'stock' => 1, - 'price' => [ - ['currencyId' => Defaults::CURRENCY, 'gross' => 19.99, 'net' => 10, 'linked' => false], - ], - 'manufacturer' => ['id' => $productId, 'name' => 'shopware AG'], - 'tax' => ['id' => $this->getValidTaxId(), 'name' => 'testTaxRate', 'taxRate' => 15], - 'categories' => [ - ['id' => $productId, 'name' => 'Test category'], - ], - 'visibilities' => [ - [ - 'id' => $productId, - 'salesChannelId' => TestDefaults::SALES_CHANNEL, - 'visibility' => ProductVisibilityDefinition::VISIBILITY_ALL, - ], - ], - ]; - - $this->getContainer()->get('product.repository')->create([$product], Context::createDefaultContext()); - - return $productId; - } - - private function createTransaction(): TransactionCollection - { - return new TransactionCollection([ - new Transaction( - new CalculatedPrice( - 13.37, - 13.37, - new CalculatedTaxCollection(), - new TaxRuleCollection() - ), - $this->getValidPaymentMethodId() - ), - ]); - } - - private function performOrder(): string - { - $data = new RequestDataBag(['tos' => true]); - $this->fillCart($this->salesChannelContext->getToken()); - - return $this->orderService->createOrder($data, $this->salesChannelContext); - } - - /** - * @param array $options - */ - private function createCustomer(string $firstName, string $lastName, array $options = []): string - { - $customerId = Uuid::randomHex(); - $salutationId = $this->getValidSalutationId(); - $paymentMethodId = $this->getValidPaymentMethodId(); - - $customer = [ - 'id' => $customerId, - 'salesChannelId' => TestDefaults::SALES_CHANNEL, - 'defaultShippingAddress' => [ - 'id' => $customerId, - 'firstName' => $firstName, - 'lastName' => $lastName, - 'city' => 'Schöppingen', - 'street' => 'Ebbinghoff 10', - 'zipcode' => '48624', - 'salutationId' => $salutationId, - 'countryId' => $this->getValidCountryId(), - ], - 'defaultBillingAddressId' => $customerId, - 'defaultPaymentMethodId' => $paymentMethodId, - 'groupId' => TestDefaults::FALLBACK_CUSTOMER_GROUP, - 'email' => Uuid::randomHex() . '@example.com', - 'password' => 'nott1234', - 'firstName' => $firstName, - 'lastName' => $lastName, - 'salutationId' => $salutationId, - 'customerNumber' => '12345', - ]; - - $customer = array_merge_recursive($customer, $options); - - $this->getContainer()->get('customer.repository')->create([$customer], Context::createDefaultContext()); - - return $customerId; - } -} diff --git a/tests/Integration/SetupExampleTemplatesTrait.php b/tests/Integration/SetupExampleTemplatesTrait.php deleted file mode 100644 index 197cc7e..0000000 --- a/tests/Integration/SetupExampleTemplatesTrait.php +++ /dev/null @@ -1,55 +0,0 @@ - - */ - private array $tplFiles = [ - 'global/order_confirmation_mail/html.twig' => 'HTML CONFIRM', - 'global/order_confirmation_mail/plain.twig' => 'TEXT CONFIRM', - 'global/order_confirmation_mail/subject.twig' => 'SUBJECT CONFIRM', - ]; - - /** - * @before - */ - public function setupTemplates(): void - { - $fs = new Filesystem(); - - $resources = $this->getResourcesFolder(); - foreach ($this->tplFiles as $tplFile => $content) { - $file = $resources . '/' . $tplFile; - $folder = \dirname($file); - $fs->mkdir($folder); - - $fs->dumpFile($file, $content); - } - } - - /** - * @after - */ - public function removeTemplates(): void - { - $fs = new Filesystem(); - - $resources = $this->getResourcesFolder(); - foreach ($this->tplFiles as $tplFile => $content) { - $file = $resources . '/' . $tplFile; - $fs->remove($file); - } - } - - private function getResourcesFolder(): string - { - return \dirname(__DIR__, 2) . '/src/Resources/views/email/'; - } -} diff --git a/tests/Services/MailLoader/CachedMailFinderServiceTest.php b/tests/Services/MailLoader/CachedMailFinderServiceTest.php deleted file mode 100644 index 815daf8..0000000 --- a/tests/Services/MailLoader/CachedMailFinderServiceTest.php +++ /dev/null @@ -1,27 +0,0 @@ -createMock(MailFinderService::class); - $mailFinder->method('findTemplateByTechnicalName')->willReturnCallback(fn() => (string) microtime(true)); - - $cachedMailFinder = new CachedMailFinderService($mailFinder, new ArrayAdapter()); - $context = new TemplateMailContext('1234', Context::createDefaultContext()); - - $time = $cachedMailFinder->findTemplateByTechnicalName('', '', $context); - static::assertSame($time, $cachedMailFinder->findTemplateByTechnicalName('', '', $context)); - } -} diff --git a/tests/Services/MailLoader/MjmlLoaderTest.php b/tests/Services/MailLoader/MjmlLoaderTest.php deleted file mode 100644 index 55f357c..0000000 --- a/tests/Services/MailLoader/MjmlLoaderTest.php +++ /dev/null @@ -1,58 +0,0 @@ -supportedExtensions()); - - $text = $loader->load(__DIR__ . '/_fixtures/test.mjml'); - static::assertStringContainsString('', $text); - static::assertStringContainsString('', $text); - } - - public function testApiIsNotAvailable(): void - { - $mock = new MockHandler([ - new ServerException('Error Communicating with Server', new Request('GET', 'test'), new Response(500)), - ]); - - $handlerStack = HandlerStack::create($mock); - $client = new Client(['handler' => $handlerStack]); - - $loader = new MjmlLoader('https://mjml.shyim.de', new NullLogger(), $client); - - static::assertSame('', $loader->load(__DIR__ . '/_fixtures/test.mjml')); - } - - public function testApiRespondsErrors(): void - { - $mock = new MockHandler([ - new Response(200, ['Content-Type' => 'application/json'], json_encode(['errors' => ['some error happend']], JSON_THROW_ON_ERROR)), - ]); - - $handlerStack = HandlerStack::create($mock); - $client = new Client(['handler' => $handlerStack]); - - $loader = new MjmlLoader('https://mjml.shyim.de', new NullLogger(), $client); - - static::expectException(MjmlCompileError::class); - $loader->load(__DIR__ . '/_fixtures/test.mjml'); - } -} diff --git a/tests/Services/MailLoader/TwigLoaderTest.php b/tests/Services/MailLoader/TwigLoaderTest.php deleted file mode 100644 index e7f2c8c..0000000 --- a/tests/Services/MailLoader/TwigLoaderTest.php +++ /dev/null @@ -1,20 +0,0 @@ -supportedExtensions()); - static::assertNotEmpty($loader->load($storefront->getPath() . '/Resources/views/storefront/base.html.twig')); - } -} diff --git a/tests/Services/MailLoader/_fixtures/test.inky b/tests/Services/MailLoader/_fixtures/test.inky deleted file mode 100644 index e514481..0000000 --- a/tests/Services/MailLoader/_fixtures/test.inky +++ /dev/null @@ -1,5 +0,0 @@ - - - Put content in me! - - diff --git a/tests/Services/MailLoader/_fixtures/test.mjml b/tests/Services/MailLoader/_fixtures/test.mjml deleted file mode 100644 index 004b668..0000000 --- a/tests/Services/MailLoader/_fixtures/test.mjml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - Hello World - - - - diff --git a/tests/Services/SearchPathProviderTest.php b/tests/Services/SearchPathProviderTest.php deleted file mode 100644 index 58c58fe..0000000 --- a/tests/Services/SearchPathProviderTest.php +++ /dev/null @@ -1,77 +0,0 @@ - $expectedPaths - * @dataProvider eventProvider - */ - public function testPaths(TemplateMailContext $event, array $expectedPaths): void - { - $language = new LanguageEntity(); - $language->setId(Defaults::LANGUAGE_SYSTEM); - $locale = new LocaleEntity(); - $locale->setCode('en-GB'); - $language->setLocale($locale); - $repository = new StaticEntityRepository([new LanguageCollection([$language])]); - - // @phpstan-ignore-next-line - $provider = new SearchPathProvider($repository); - static::assertSame($expectedPaths, $provider->buildPaths($event)); - } - - public static function eventProvider(): \Generator - { - // Without sales channel source - - yield [ - self::createEvent(), - [ - '98432def39fc4624b33213a56b8c944d/en-GB', // Sales channel and language combo - '98432def39fc4624b33213a56b8c944d', // Sales channel - 'en-GB', // Language code - '2fbb5fe2e29a4d70aa5854ce7ce3e20b', // Language id - 'global', // Global - ], - ]; - - // With sales channel source - - yield [ - self::createEvent(true), - [ - '98432def39fc4624b33213a56b8c944d/en-GB', // Sales channel and language combo - '98432def39fc4624b33213a56b8c944d', // Sales channel - 'en-GB', // Language code - '2fbb5fe2e29a4d70aa5854ce7ce3e20b', // Language id - 'global', // Global - ], - ]; - } - - private static function createEvent(bool $salesChannelSource = false): TemplateMailContext - { - $context = new Context( - $salesChannelSource ? new SalesChannelApiSource(TestDefaults::SALES_CHANNEL) : new SystemSource() - ); - - return new TemplateMailContext(TestDefaults::SALES_CHANNEL, $context); - } -} diff --git a/tests/Services/StringTemplateRendererTest.php b/tests/Services/StringTemplateRendererTest.php deleted file mode 100644 index 687f825..0000000 --- a/tests/Services/StringTemplateRendererTest.php +++ /dev/null @@ -1,30 +0,0 @@ -render('{{ text }}', ['text' => 'foo'], Context::createDefaultContext())); - } - - public function testInvalidString(): void - { - $renderer = new StringTemplateRenderer(new Environment(new ArrayLoader())); - - static::expectException(StringTemplateRenderingException::class); - - $renderer->render('{{ text() }}', [], Context::createDefaultContext()); - } -} diff --git a/tests/Subscriber/FlowSubscriberTest.php b/tests/Subscriber/FlowSubscriberTest.php deleted file mode 100644 index a55ce21..0000000 --- a/tests/Subscriber/FlowSubscriberTest.php +++ /dev/null @@ -1,41 +0,0 @@ - 'onFlowSendMailActionEvent', - ], FlowSubscriber::getSubscribedEvents()); - } - - public function testEmptyMailDoesNothing(): void - { - $mailTemplateTypeRepository = $this->createMock(EntityRepository::class); - $mailTemplateTypeRepository->expects(static::never())->method('search'); - - $subscriber = new FlowSubscriber( - $mailTemplateTypeRepository, - $this->createMock(MailFinderServiceInterface::class), - $this->createMock(AbstractTranslator::class), - $this->createMock(EntityRepository::class) - ); - - $subscriber->onFlowSendMailActionEvent(new FlowSendMailActionEvent(new DataBag([]), new MailTemplateEntity(), new StorableFlow('test', Context::createDefaultContext()))); - } -} diff --git a/tests/TestBootstraper.php b/tests/TestBootstraper.php deleted file mode 100644 index d589430..0000000 --- a/tests/TestBootstraper.php +++ /dev/null @@ -1,48 +0,0 @@ -setLoadEnvFile(true) - ->setForceInstallPlugins(true) - ->addActivePlugins('FroshPlatformTemplateMail') - ->bootstrap() - ->getClassLoader(); -} - -$paths = [ - '../../../../src/Core/TestBootstrapper.php', - '../vendor/shopware/core/TestBootstrapper.php', - '../../../../vendor/shopware/core/TestBootstrapper.php', -]; - -foreach ($paths as $path) { - $path = realpath(__DIR__ . '/' . $path); - - if (!\is_string($path)) { - continue; - } - - if (!\is_file($path)) { - continue; - } - - require $path; - - return (new TestBootstrapper()) - ->setPlatformEmbedded(false) - ->setLoadEnvFile(true) - ->setForceInstallPlugins(true) - ->addActivePlugins('FroshPlatformTemplateMail') - ->bootstrap() - ->getClassLoader(); -}