From d6aaabe5f72a899a5f4d2a617308f0966642f19d Mon Sep 17 00:00:00 2001
From: Francesco Sardara <francesco@tdgwebservices.com>
Date: Fri, 1 Apr 2022 17:16:48 +0200
Subject: [PATCH] OEL-494: Add test coverage for the document paragraph
 rendering.

---
 composer.json                                 |   6 +
 .../Paragraphs/DocumentParagraphTest.php      | 234 ++++++++++++++++++
 2 files changed, 240 insertions(+)
 create mode 100644 modules/oe_whitelabel_paragraphs/tests/src/Kernel/Paragraphs/DocumentParagraphTest.php

diff --git a/composer.json b/composer.json
index 33bf9fa5..b730ebc1 100644
--- a/composer.json
+++ b/composer.json
@@ -64,6 +64,12 @@
             "Drupal\\oe_whitelabel\\": "./src/"
         }
     },
+    "autoload-dev": {
+        "psr-4": {
+            "Drupal\\Tests\\oe_whitelabel\\": "./tests/src/",
+            "Drupal\\Tests\\oe_bootstrap_theme\\": "./build/themes/contrib/oe_bootstrap_theme/tests/src/"
+        }
+    },
     "extra": {
         "composer-exit-on-patch-failure": true,
         "enable-patching": true,
diff --git a/modules/oe_whitelabel_paragraphs/tests/src/Kernel/Paragraphs/DocumentParagraphTest.php b/modules/oe_whitelabel_paragraphs/tests/src/Kernel/Paragraphs/DocumentParagraphTest.php
new file mode 100644
index 00000000..7ca6a792
--- /dev/null
+++ b/modules/oe_whitelabel_paragraphs/tests/src/Kernel/Paragraphs/DocumentParagraphTest.php
@@ -0,0 +1,234 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\oe_whitelabel_paragraphs\Kernel\Paragraphs;
+
+use Drupal\Core\Site\Settings;
+use Drupal\file\Entity\File;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\media\Entity\Media;
+use Drupal\paragraphs\Entity\Paragraph;
+use Drupal\Tests\oe_bootstrap_theme\PatternAssertion\FilePatternAssert;
+use Drupal\Tests\user\Traits\UserCreationTrait;
+use Drupal\user\Entity\User;
+use Symfony\Component\DomCrawler\Crawler;
+
+/**
+ * Tests the document paragraph.
+ */
+class DocumentParagraphTest extends ParagraphsTestBase {
+
+  use UserCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'content_translation',
+    'file_link_test',
+    'language',
+    'node',
+    'oe_paragraphs_document',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    // The node dependency is wrongfully forced by oe_media_media_access().
+    $this->installEntitySchema('node');
+    $this->installEntitySchema('media');
+    $this->installConfig([
+      'content_translation',
+      'language',
+      'media',
+      'oe_media',
+    ]);
+
+    $this->container->get('module_handler')->loadInclude('oe_paragraphs_media_field_storage', 'install');
+    oe_paragraphs_media_field_storage_install(FALSE);
+    $this->installConfig(['oe_paragraphs_document']);
+
+    ConfigurableLanguage::createFromLangcode('it')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
+
+    // Enable translations for the document media bundle.
+    $this->container->get('content_translation.manager')->setEnabled('media', 'document', TRUE);
+    // Make fields translatable.
+    $field_ids = [
+      'media.document.oe_media_file_type',
+      'media.document.oe_media_remote_file',
+      'media.document.oe_media_file',
+    ];
+    foreach ($field_ids as $field_id) {
+      $field_config = $this->container->get('entity_type.manager')->getStorage('field_config')->load($field_id);
+      $field_config->set('translatable', TRUE)->save();
+    }
+    $this->container->get('router.builder')->rebuild();
+
+    // Simulate the presence of test remote files. This avoids real requests to
+    // external websites.
+    $settings = Settings::getAll();
+    $settings['file_link_test_middleware'] = [
+      'http://oe_whitelabel.drupal/spanish-document.txt' => [
+        'status' => 200,
+        'headers' => [
+          'Content-Type' => 'text/plain',
+          'Content-Length' => 45187,
+        ],
+      ],
+      'http://oe_whitelabel.drupal/spreadsheet.xls' => [
+        'status' => 200,
+        'headers' => [
+          'Content-Type' => 'application/vnd.ms-excel',
+          'Content-Length' => 78459784,
+        ],
+      ],
+    ];
+    new Settings($settings);
+
+    // Tests need to run with user 1 as access checks prevent entity reference
+    // rendering otherwise.
+    $this->setCurrentUser(User::load(1));
+  }
+
+  /**
+   * Tests the file paragraph rendering.
+   */
+  public function testRendering(): void {
+    $uri_en = $this->container->get('file_system')->copy(
+      $this->container->get('extension.list.module')->getPath('oe_media') . '/tests/fixtures/sample.pdf',
+      'public://test.pdf'
+    );
+    $pdf_en = File::create(['uri' => $uri_en]);
+    $pdf_en->save();
+
+    $local_media = Media::create([
+      'bundle' => 'document',
+      'name' => 'Local PDF file',
+      'oe_media_file_type' => 'local',
+      'oe_media_file' => [
+        'target_id' => $pdf_en->id(),
+      ],
+    ]);
+    $local_media->save();
+
+    $paragraph = Paragraph::create([
+      'type' => 'oe_document',
+      'field_oe_media' => [
+        'target_id' => $local_media->id(),
+      ],
+    ]);
+    $paragraph->save();
+
+    $html = $this->renderParagraph($paragraph);
+    $crawler = new Crawler($html);
+    $paragraph_wrapper = $crawler->filter('.paragraph');
+    $this->assertCount(1, $paragraph_wrapper);
+
+    $expected = [
+      'file' => [
+        'title' => 'Local PDF file',
+        'language' => 'English',
+        'url' => file_create_url($uri_en),
+        'meta' => '(2.96 KB - PDF)',
+        'icon' => 'file-pdf-fill',
+      ],
+      'translations' => NULL,
+      'link_label' => 'Download',
+    ];
+    $assert = new FilePatternAssert();
+    $assert->assertPattern($expected, $paragraph_wrapper->html());
+
+    // Add an Italian translation for the media.
+    $uri_it = $this->container->get('file_system')->copy(
+      $this->container->get('extension.list.module')->getPath('oe_media') . '/tests/fixtures/sample.pdf',
+      'public://test_it.pdf'
+    );
+    $pdf_it = File::create(['uri' => $uri_it]);
+    $pdf_it->save();
+    $local_media->addTranslation('it', [
+      'name' => 'Italian translation',
+      'oe_media_file_type' => 'local',
+      'oe_media_file' => [
+        'target_id' => $pdf_it->id(),
+      ],
+    ]);
+    $local_media->save();
+
+    $html = $this->renderParagraph($paragraph);
+    $crawler = new Crawler($html);
+    $paragraph_wrapper = $crawler->filter('.paragraph');
+    $this->assertCount(1, $paragraph_wrapper);
+    $expected['translations'] = [
+      [
+        'title' => 'Italian translation',
+        'language' => 'Italian',
+        'url' => file_create_url($uri_it),
+        'meta' => '(2.96 KB - PDF)',
+      ],
+    ];
+    $assert->assertPattern($expected, $paragraph_wrapper->html());
+
+    // Add a Spanish translation that points to a remote file.
+    $local_media->addTranslation('es', [
+      'name' => 'Spanish translation',
+      'oe_media_file_type' => 'remote',
+      'oe_media_remote_file' => 'http://oe_whitelabel.drupal/spanish-document.txt',
+    ]);
+    $local_media->save();
+
+    $html = $this->renderParagraph($paragraph);
+    $crawler = new Crawler($html);
+    $paragraph_wrapper = $crawler->filter('.paragraph');
+    $this->assertCount(1, $paragraph_wrapper);
+    $expected['translations'][] = [
+      'title' => 'Spanish translation',
+      'language' => 'Spanish',
+      'url' => 'http://oe_whitelabel.drupal/spanish-document.txt',
+      'meta' => '(44.13 KB - TXT)',
+    ];
+    $assert->assertPattern($expected, $paragraph_wrapper->html());
+
+    // Test a remote document as main file, to make sure that the
+    // DocumentMediaWrapper class is tested in all scenarios.
+    $remote_media = Media::create([
+      'bundle' => 'document',
+      'name' => 'Remote XLS file',
+      'oe_media_file_type' => 'remote',
+      'oe_media_remote_file' => 'http://oe_whitelabel.drupal/spreadsheet.xls',
+    ]);
+    $remote_media->save();
+
+    $paragraph = Paragraph::create([
+      'type' => 'oe_document',
+      'field_oe_media' => [
+        'target_id' => $remote_media->id(),
+      ],
+    ]);
+    $paragraph->save();
+
+    $html = $this->renderParagraph($paragraph);
+    $crawler = new Crawler($html);
+    $paragraph_wrapper = $crawler->filter('.paragraph');
+    $this->assertCount(1, $paragraph_wrapper);
+
+    $expected = [
+      'file' => [
+        'title' => 'Remote XLS file',
+        'language' => 'English',
+        'url' => 'http://oe_whitelabel.drupal/spreadsheet.xls',
+        'meta' => '(74.83 MB - XLS)',
+        'icon' => 'file-excel-fill',
+      ],
+      'translations' => NULL,
+      'link_label' => 'Download',
+    ];
+    $assert = new FilePatternAssert();
+    $assert->assertPattern($expected, $paragraph_wrapper->html());
+  }
+
+}
-- 
GitLab