lb_everywhere-8.x-1.x-dev/tests/src/Unit/LBEverywhereDisplayVariantTest.php

tests/src/Unit/LBEverywhereDisplayVariantTest.php
<?php

namespace Drupal\Tests\lb_everywhere\Unit;

use Drupal\block\BlockRepositoryInterface;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Cache\Context\CacheContextsManager;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityFormBuilderInterface;
use Drupal\Core\Entity\EntityType;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityViewBuilderInterface;
use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Theme\ActiveTheme;
use Drupal\Core\Theme\ThemeManagerInterface;
use Drupal\Core\Url;
use Drupal\layout_builder\Entity\LayoutEntityDisplayInterface;
use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
use Drupal\layout_builder\Section;
use Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface;
use Drupal\layout_builder\SectionStorageInterface;
use Drupal\lb_everywhere\LBEverywhereRegionRepository;
use Drupal\lb_everywhere\Plugin\DisplayVariant\LBEverywhereDisplayVariant;
use Drupal\Tests\UnitTestCase;
use Prophecy\Argument;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * @coversDefaultClass \Drupal\lb_everywhere\Plugin\DisplayVariant\LBEverywhereDisplayVariant
 *
 * @group lb_everywhere
 */
class LBEverywhereDisplayVariantTest extends UnitTestCase {

  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * The theme manager.
   *
   * @var \Drupal\Core\Theme\ThemeManagerInterface
   */
  protected $themeManager;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();

    $display = $this->prophesize(LayoutEntityDisplayInterface::class);
    $section = $this->prophesize(Section::class);
    $section->toRenderArray([])->willReturn(['#markup' => 'The Rendered Section']);
    $sections[] = $section->reveal();

    $section_storage = $this->prophesize(SectionStorageInterface::class);
    $section_storage->getSections()->willReturn($sections);
    $section_storage->getContextValue('display')->willReturn($display->reveal());
    $section_storage->getContextsDuringPreview()->willReturn([]);
    $section_storages['sidebar_first'] = $section_storage->reveal();

    $cache_contexts_manager = $this->prophesize(CacheContextsManager::class);
    $cache_contexts_manager->assertValidTokens(['url.query_args', 'user.permissions'])->willReturn(TRUE);

    $block_repository = $this->prophesize(BlockRepositoryInterface::class);
    $cacheable_metadata = [];
    $block_repository->getVisibleBlocksPerRegion($cacheable_metadata)->willReturn([]);

    $block_view_builder = $this->prophesize(EntityViewBuilderInterface::class);

    $entity_type_manager = $this->prophesize(EntityTypeManagerInterface::class);
    $entity_type_manager->getViewBuilder('block')->willReturn($block_view_builder->reveal());
    $entity_type_manager->getDefinition('block')->willReturn(new EntityType(['id' => 'block']));

    $region_repository = $this->prophesize(LBEverywhereRegionRepository::class);
    $region_repository->getSectionStorages('test_theme', Argument::type(CacheableMetadata::class))->willReturn($section_storages);
    $region_repository->getSectionStorages('empty_theme', Argument::type(CacheableMetadata::class))->willReturn([]);

    $tempstore_repository = $this->prophesize(LayoutTempstoreRepositoryInterface::class);
    $tempstore_repository->get(Argument::type(SectionStorageInterface::class))->willReturnArgument(0);

    $entity_form_builder = $this->prophesize(EntityFormBuilderInterface::class);
    $entity_form_builder->getForm($display->reveal(), 'layout_builder', Argument::type('array'))->willReturn(['#markup' => 'The Section Form']);

    $context_repository = $this->prophesize(ContextRepositoryInterface::class);
    $context_repository->getAvailableContexts()->willReturn([]);

    $this->requestStack = $this->prophesize(RequestStack::class);
    $this->themeManager = $this->prophesize(ThemeManagerInterface::class);
    $this->currentUser = $this->prophesize(AccountInterface::class);

    $route_match = $this->prophesize(RouteMatchInterface::class);
    $section_storage_manager = $this->prophesize(SectionStorageManagerInterface::class);

    $container = new ContainerBuilder();
    $container->set('cache_contexts_manager', $cache_contexts_manager->reveal());
    $container->set('block.repository', $block_repository->reveal());
    $container->set('entity_type.manager', $entity_type_manager->reveal());
    $container->set('request_stack', $this->requestStack->reveal());
    $container->set('theme.manager', $this->themeManager->reveal());
    $container->set('lb_everywhere.region_repository', $region_repository->reveal());
    $container->set('layout_builder.tempstore_repository', $tempstore_repository->reveal());
    $container->set('entity.form_builder', $entity_form_builder->reveal());
    $container->set('current_user', $this->currentUser->reveal());
    $container->set('string_translation', $this->getStringTranslationStub());
    $container->set('context.repository', $context_repository->reveal());
    $container->set('current_route_match', $route_match->reveal());
    $container->set('plugin.manager.layout_builder.section_storage', $section_storage_manager->reveal());
    \Drupal::setContainer($container);
  }

  /**
   * @covers ::build
   *
   * @dataProvider providerTestBuild
   */
  public function testBuild($expected, array $query_parameters, $has_permission, $theme_name = 'test_theme') {
    $this->requestStack->getCurrentRequest()->willReturn(new Request($query_parameters));
    $this->themeManager->getActiveTheme()->willReturn(new ActiveTheme(['name' => $theme_name]));
    $this->currentUser->hasPermission('configure any layout')->willReturn($has_permission);

    $display_variant = LBEverywhereDisplayVariant::create(\Drupal::getContainer(), [], '', []);

    $result = $display_variant->build();
    $this->assertEquals($expected, $result);
  }

  /**
   * Provides test data for ::testBuild().
   */
  public function providerTestBuild() {
    $expected = [
      '#cache' => [
        'tags' => [
          'block_list',
        ],
        'contexts' => [
          'url.query_args',
          'user.permissions',
        ],
        'max-age' => -1,
      ],
      'content' => [
        'system_main' => [],
        'messages' => [
          '#weight' => -1000,
          '#type' => 'status_messages',
          '#include_fallback' => TRUE,
        ],
      ],
    ];

    $data = [];
    $data['empty theme'] = [
      $expected,
      [],
      TRUE,
      'empty_theme',
    ];
    $rendered_expected = $expected + [
      'sidebar_first' => [
        'lbeverywhere' => [
          ['#markup' => 'The Rendered Section'],
        ],
      ],
    ];
    $data['default, with perms'] = [
      $rendered_expected,
      [],
      TRUE,
    ];
    $data['layout mode, with perms'] = [
      $expected + [
        'sidebar_first' => [
          'lbeverywhere' => [
            [
              '#type' => 'link',
              '#url' => Url::fromRoute('<current>', [], ['query' => ['mode' => 'layout', 'region' => 'sidebar_first']]),
              '#title' => 'Enable Layout Builder for the <em class="placeholder">Sidebar First</em> region',
              '#attributes' => [
                'class' => [
                  'visually-hidden',
                ],
                'data-layout-builder-region' => TRUE,
              ],
            ],
            [
              '#markup' => 'The Rendered Section',
            ],
          ],
          '#attributes' => [
            'class' => [
              'region__select-mode',
            ],
          ],
        ],
      ],
      ['mode' => 'layout'],
      TRUE,
    ];
    $data['unexpected mode, with perms'] = [
      $rendered_expected,
      ['mode' => 'garbage'],
      TRUE,
    ];
    $data['layout mode, valid region, with perms'] = [
      $expected + [
        'sidebar_first' => [
          'lbeverywhere' => [
            '#markup' => 'The Section Form',
          ],
        ],
      ],
      ['mode' => 'layout', 'region' => 'sidebar_first'],
      TRUE,
    ];
    $data['unexpected region, with perms'] = [
      $rendered_expected,
      ['mode' => 'layout', 'region' => 'garbage'],
      TRUE,
    ];
    $data['default, no perms'] = [
      $rendered_expected,
      [],
      FALSE,
    ];
    $data['layout mode, no perms'] = [
      $rendered_expected,
      ['mode' => 'layout'],
      FALSE,
    ];
    $data['unexpected mode, no perms'] = [
      $rendered_expected,
      ['mode' => 'garbage'],
      FALSE,
    ];
    $data['layout mode, valid region, no perms'] = [
      $rendered_expected,
      ['mode' => 'layout', 'region' => 'sidebar_first'],
      FALSE,
    ];
    $data['unexpected region, no perms'] = [
      $rendered_expected,
      ['mode' => 'layout', 'region' => 'garbage'],
      FALSE,
    ];
    return $data;
  }

}

namespace Drupal\lb_everywhere\Plugin\DisplayVariant;

if (!function_exists('system_region_list')) {
  function system_region_list($theme_name) {
    return [
      'sidebar_first' => 'Sidebar First',
    ];
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc