You are here

class ViewAjaxControllerTest in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/views/tests/src/Unit/Controller/ViewAjaxControllerTest.php \Drupal\Tests\views\Unit\Controller\ViewAjaxControllerTest

@coversDefaultClass \Drupal\views\Controller\ViewAjaxController @group views

Hierarchy

Expanded class hierarchy of ViewAjaxControllerTest

File

core/modules/views/tests/src/Unit/Controller/ViewAjaxControllerTest.php, line 22
Contains \Drupal\Tests\views\Unit\Controller\ViewAjaxControllerTest.

Namespace

Drupal\Tests\views\Unit\Controller
View source
class ViewAjaxControllerTest extends UnitTestCase {

  /**
   * The mocked view entity storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $viewStorage;

  /**
   * The mocked executable factory.
   *
   * @var \Drupal\views\ViewExecutableFactory|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $executableFactory;

  /**
   * The tested views ajax controller.
   *
   * @var \Drupal\views\Controller\ViewAjaxController
   */
  protected $viewAjaxController;

  /**
   * The mocked current path.
   *
   * @var \Drupal\Core\Path\CurrentPathStack|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $currentPath;

  /**
   * The redirect destination.
   *
   * @var \Drupal\Core\Routing\RedirectDestinationInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $redirectDestination;

  /**
   * The renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $renderer;

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    $this->viewStorage = $this
      ->getMock('Drupal\\Core\\Entity\\EntityStorageInterface');
    $this->executableFactory = $this
      ->getMockBuilder('Drupal\\views\\ViewExecutableFactory')
      ->disableOriginalConstructor()
      ->getMock();
    $this->renderer = $this
      ->getMock('\\Drupal\\Core\\Render\\RendererInterface');
    $this->renderer
      ->expects($this
      ->any())
      ->method('render')
      ->will($this
      ->returnCallback(function (array &$elements) {
      $elements['#attached'] = [];
      return isset($elements['#markup']) ? $elements['#markup'] : '';
    }));
    $this->renderer
      ->expects($this
      ->any())
      ->method('executeInRenderContext')
      ->willReturnCallback(function (RenderContext $context, callable $callable) {
      return $callable();
    });
    $this->currentPath = $this
      ->getMockBuilder('Drupal\\Core\\Path\\CurrentPathStack')
      ->disableOriginalConstructor()
      ->getMock();
    $this->redirectDestination = $this
      ->getMock('\\Drupal\\Core\\Routing\\RedirectDestinationInterface');
    $this->viewAjaxController = new ViewAjaxController($this->viewStorage, $this->executableFactory, $this->renderer, $this->currentPath, $this->redirectDestination);
    $element_info_manager = $this
      ->getMock('\\Drupal\\Core\\Render\\ElementInfoManagerInterface');
    $request_stack = new RequestStack();
    $request_stack
      ->push(new Request());
    $args = [
      $this
        ->getMock('\\Drupal\\Core\\Controller\\ControllerResolverInterface'),
      $this
        ->getMock('\\Drupal\\Core\\Theme\\ThemeManagerInterface'),
      $element_info_manager,
      $this
        ->getMock('\\Drupal\\Core\\Render\\PlaceholderGeneratorInterface'),
      $this
        ->getMock('\\Drupal\\Core\\Render\\RenderCacheInterface'),
      $request_stack,
      [
        'required_cache_contexts' => [
          'languages:language_interface',
          'theme',
        ],
      ],
    ];
    $this->renderer = $this
      ->getMockBuilder('Drupal\\Core\\Render\\Renderer')
      ->setConstructorArgs($args)
      ->setMethods(NULL)
      ->getMock();
    $container = new ContainerBuilder();
    $container
      ->set('renderer', $this->renderer);
    \Drupal::setContainer($container);
  }

  /**
   * Tests missing view_name and view_display_id
   *
   * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
   */
  public function testMissingViewName() {
    $request = new Request();
    $this->viewAjaxController
      ->ajaxView($request);
  }

  /**
   * Tests with view_name and view_display_id but not existing view.
   *
   * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
   */
  public function testMissingView() {
    $request = new Request();
    $request->request
      ->set('view_name', 'test_view');
    $request->request
      ->set('view_display_id', 'page_1');
    $this->viewStorage
      ->expects($this
      ->once())
      ->method('load')
      ->with('test_view')
      ->will($this
      ->returnValue(FALSE));
    $this->viewAjaxController
      ->ajaxView($request);
  }

  /**
   * Tests a view without having access to it.
   *
   * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
   */
  public function testAccessDeniedView() {
    $request = new Request();
    $request->request
      ->set('view_name', 'test_view');
    $request->request
      ->set('view_display_id', 'page_1');
    $view = $this
      ->getMockBuilder('Drupal\\views\\Entity\\View')
      ->disableOriginalConstructor()
      ->getMock();
    $this->viewStorage
      ->expects($this
      ->once())
      ->method('load')
      ->with('test_view')
      ->will($this
      ->returnValue($view));
    $executable = $this
      ->getMockBuilder('Drupal\\views\\ViewExecutable')
      ->disableOriginalConstructor()
      ->getMock();
    $executable
      ->expects($this
      ->once())
      ->method('access')
      ->will($this
      ->returnValue(FALSE));
    $this->executableFactory
      ->expects($this
      ->once())
      ->method('get')
      ->with($view)
      ->will($this
      ->returnValue($executable));
    $this->viewAjaxController
      ->ajaxView($request);
  }

  /**
   * Tests a valid view without arguments pagers etc.
   */
  public function testAjaxView() {
    $request = new Request();
    $request->request
      ->set('view_name', 'test_view');
    $request->request
      ->set('view_display_id', 'page_1');
    list($view, $executable) = $this
      ->setupValidMocks();
    $display_handler = $this
      ->getMockBuilder('Drupal\\views\\Plugin\\views\\display\\DisplayPluginBase')
      ->disableOriginalConstructor()
      ->getMock();

    // Ensure that the pager element is not set.
    $display_handler
      ->expects($this
      ->never())
      ->method('setOption');
    $display_collection = $this
      ->getMockBuilder('Drupal\\views\\DisplayPluginCollection')
      ->disableOriginalConstructor()
      ->getMock();
    $display_collection
      ->expects($this
      ->any())
      ->method('get')
      ->with('page_1')
      ->will($this
      ->returnValue($display_handler));
    $executable->displayHandlers = $display_collection;
    $response = $this->viewAjaxController
      ->ajaxView($request);
    $this
      ->assertTrue($response instanceof ViewAjaxResponse);
    $this
      ->assertSame($response
      ->getView(), $executable);
    $this
      ->assertViewResultCommand($response);
  }

  /**
   * Tests a valid view with arguments.
   */
  public function testAjaxViewWithArguments() {
    $request = new Request();
    $request->request
      ->set('view_name', 'test_view');
    $request->request
      ->set('view_display_id', 'page_1');
    $request->request
      ->set('view_args', 'arg1/arg2');
    list($view, $executable) = $this
      ->setupValidMocks();
    $executable
      ->expects($this
      ->once())
      ->method('preview')
      ->with('page_1', array(
      'arg1',
      'arg2',
    ));
    $response = $this->viewAjaxController
      ->ajaxView($request);
    $this
      ->assertTrue($response instanceof ViewAjaxResponse);
    $this
      ->assertViewResultCommand($response);
  }

  /**
   * Tests a valid view with arguments.
   */
  public function testAjaxViewWithEmptyArguments() {
    $request = new Request();
    $request->request
      ->set('view_name', 'test_view');
    $request->request
      ->set('view_display_id', 'page_1');

    // Simulate a request that has a second, empty argument.
    $request->request
      ->set('view_args', 'arg1/');
    list($view, $executable) = $this
      ->setupValidMocks();
    $executable
      ->expects($this
      ->once())
      ->method('preview')
      ->with('page_1', $this
      ->identicalTo(array(
      'arg1',
      NULL,
    )));
    $response = $this->viewAjaxController
      ->ajaxView($request);
    $this
      ->assertTrue($response instanceof ViewAjaxResponse);
    $this
      ->assertViewResultCommand($response);
  }

  /**
   * Tests a valid view with a pager.
   */
  public function testAjaxViewWithPager() {
    $request = new Request();
    $request->request
      ->set('view_name', 'test_view');
    $request->request
      ->set('view_display_id', 'page_1');
    $dom_id = $this
      ->randomMachineName(20);
    $request->request
      ->set('view_dom_id', $dom_id);
    $request->request
      ->set('pager_element', '0');
    list($view, $executable) = $this
      ->setupValidMocks();
    $display_handler = $this
      ->getMockBuilder('Drupal\\views\\Plugin\\views\\display\\DisplayPluginBase')
      ->disableOriginalConstructor()
      ->getMock();
    $display_handler
      ->expects($this
      ->once())
      ->method('setOption', '0')
      ->with($this
      ->equalTo('pager_element'));
    $display_collection = $this
      ->getMockBuilder('Drupal\\views\\DisplayPluginCollection')
      ->disableOriginalConstructor()
      ->getMock();
    $display_collection
      ->expects($this
      ->any())
      ->method('get')
      ->with('page_1')
      ->will($this
      ->returnValue($display_handler));
    $executable->displayHandlers = $display_collection;
    $response = $this->viewAjaxController
      ->ajaxView($request);
    $this
      ->assertTrue($response instanceof ViewAjaxResponse);
    $commands = $this
      ->getCommands($response);
    $this
      ->assertEquals('viewsScrollTop', $commands[0]['command']);
    $this
      ->assertEquals('.js-view-dom-id-' . $dom_id, $commands[0]['selector']);
    $this
      ->assertViewResultCommand($response, 1);
  }

  /**
   * Sets up a bunch of valid mocks like the view entity and executable.
   */
  protected function setupValidMocks() {
    $view = $this
      ->getMockBuilder('Drupal\\views\\Entity\\View')
      ->disableOriginalConstructor()
      ->getMock();
    $this->viewStorage
      ->expects($this
      ->once())
      ->method('load')
      ->with('test_view')
      ->will($this
      ->returnValue($view));
    $executable = $this
      ->getMockBuilder('Drupal\\views\\ViewExecutable')
      ->disableOriginalConstructor()
      ->getMock();
    $executable
      ->expects($this
      ->once())
      ->method('access')
      ->will($this
      ->returnValue(TRUE));
    $executable
      ->expects($this
      ->once())
      ->method('preview')
      ->will($this
      ->returnValue(array(
      '#markup' => 'View result',
    )));
    $this->executableFactory
      ->expects($this
      ->once())
      ->method('get')
      ->with($view)
      ->will($this
      ->returnValue($executable));
    return array(
      $view,
      $executable,
    );
  }

  /**
   * Gets the commands entry from the response object.
   *
   * @param \Drupal\views\Ajax\ViewAjaxResponse $response
   *   The views ajax response object.
   *
   * @return mixed
   *   Returns the commands.
   */
  protected function getCommands(ViewAjaxResponse $response) {
    $reflection_property = new \ReflectionProperty('Drupal\\views\\Ajax\\ViewAjaxResponse', 'commands');
    $reflection_property
      ->setAccessible(TRUE);
    $commands = $reflection_property
      ->getValue($response);
    return $commands;
  }

  /**
   * Ensures that the main view content command is added.
   *
   * @param \Drupal\views\Ajax\ViewAjaxResponse $response
   *   The response object.
   * @param int $position
   *   The position where the view content command is expected.
   */
  protected function assertViewResultCommand(ViewAjaxResponse $response, $position = 0) {
    $commands = $this
      ->getCommands($response);
    $this
      ->assertEquals('insert', $commands[$position]['command']);
    $this
      ->assertEquals('View result', $commands[$position]['data']);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
UnitTestCase::$randomGenerator protected property The random generator.
UnitTestCase::$root protected property The app root.
UnitTestCase::assertArrayEquals protected function Asserts if two arrays are equal by sorting them first.
UnitTestCase::getBlockMockWithMachineName protected function Mocks a block with a block plugin.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed in array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getRandomGenerator protected function Gets the random generator for the utility methods.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::randomMachineName public function Generates a unique random string containing letters and numbers.
ViewAjaxControllerTest::$currentPath protected property The mocked current path.
ViewAjaxControllerTest::$executableFactory protected property The mocked executable factory.
ViewAjaxControllerTest::$redirectDestination protected property The redirect destination.
ViewAjaxControllerTest::$renderer protected property The renderer.
ViewAjaxControllerTest::$viewAjaxController protected property The tested views ajax controller.
ViewAjaxControllerTest::$viewStorage protected property The mocked view entity storage.
ViewAjaxControllerTest::assertViewResultCommand protected function Ensures that the main view content command is added.
ViewAjaxControllerTest::getCommands protected function Gets the commands entry from the response object.
ViewAjaxControllerTest::setUp protected function Overrides UnitTestCase::setUp
ViewAjaxControllerTest::setupValidMocks protected function Sets up a bunch of valid mocks like the view entity and executable.
ViewAjaxControllerTest::testAccessDeniedView public function Tests a view without having access to it.
ViewAjaxControllerTest::testAjaxView public function Tests a valid view without arguments pagers etc.
ViewAjaxControllerTest::testAjaxViewWithArguments public function Tests a valid view with arguments.
ViewAjaxControllerTest::testAjaxViewWithEmptyArguments public function Tests a valid view with arguments.
ViewAjaxControllerTest::testAjaxViewWithPager public function Tests a valid view with a pager.
ViewAjaxControllerTest::testMissingView public function Tests with view_name and view_display_id but not existing view.
ViewAjaxControllerTest::testMissingViewName public function Tests missing view_name and view_display_id