You are here

protected function BigPipeTest::assertBigPipePlaceholders in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/big_pipe/tests/src/Functional/BigPipeTest.php \Drupal\Tests\big_pipe\Functional\BigPipeTest::assertBigPipePlaceholders()
  2. 9 core/modules/big_pipe/tests/src/Functional/BigPipeTest.php \Drupal\Tests\big_pipe\Functional\BigPipeTest::assertBigPipePlaceholders()

Asserts expected BigPipe placeholders are present and replaced.

@internal

Parameters

array $expected_big_pipe_placeholders: Keys: BigPipe placeholder IDs. Values: expected AJAX response.

array $expected_big_pipe_placeholder_stream_order: Keys: BigPipe placeholder IDs. Values: expected AJAX response. Keys are defined in the order that they are expected to be rendered & streamed.

File

core/modules/big_pipe/tests/src/Functional/BigPipeTest.php, line 367

Class

BigPipeTest
Tests BigPipe's no-JS detection & response delivery (with and without JS).

Namespace

Drupal\Tests\big_pipe\Functional

Code

protected function assertBigPipePlaceholders(array $expected_big_pipe_placeholders, array $expected_big_pipe_placeholder_stream_order) : void {
  $this
    ->assertSetsEqual(array_keys($expected_big_pipe_placeholders), explode(' ', $this
    ->getSession()
    ->getResponseHeader('BigPipe-Test-Placeholders')));
  $placeholder_positions = [];
  $placeholder_replacement_positions = [];
  foreach ($expected_big_pipe_placeholders as $big_pipe_placeholder_id => $expected_ajax_response) {

    // Verify expected placeholder.
    $expected_placeholder_html = '<span data-big-pipe-placeholder-id="' . $big_pipe_placeholder_id . '"></span>';
    $this
      ->assertSession()
      ->responseContains($expected_placeholder_html);
    $pos = strpos($this
      ->getSession()
      ->getPage()
      ->getContent(), $expected_placeholder_html);
    $placeholder_positions[$pos] = $big_pipe_placeholder_id;

    // Verify expected placeholder replacement.
    $expected_placeholder_replacement = '<script type="application/vnd.drupal-ajax" data-big-pipe-replacement-for-placeholder-with-id="' . $big_pipe_placeholder_id . '">';
    $result = $this
      ->xpath('//script[@data-big-pipe-replacement-for-placeholder-with-id=:id]', [
      ':id' => Html::decodeEntities($big_pipe_placeholder_id),
    ]);
    if ($expected_ajax_response === NULL) {
      $this
        ->assertCount(0, $result);
      $this
        ->assertSession()
        ->responseNotContains($expected_placeholder_replacement);
      continue;
    }
    $this
      ->assertEquals($expected_ajax_response, trim($result[0]
      ->getText()));
    $this
      ->assertSession()
      ->responseContains($expected_placeholder_replacement);
    $pos = strpos($this
      ->getSession()
      ->getPage()
      ->getContent(), $expected_placeholder_replacement);
    $placeholder_replacement_positions[$pos] = $big_pipe_placeholder_id;
  }
  ksort($placeholder_positions, SORT_NUMERIC);
  $this
    ->assertEquals(array_keys($expected_big_pipe_placeholders), array_values($placeholder_positions));
  $placeholders = array_map(function (NodeElement $element) {
    return $element
      ->getAttribute('data-big-pipe-placeholder-id');
  }, $this
    ->cssSelect('[data-big-pipe-placeholder-id]'));
  $this
    ->assertSameSize($expected_big_pipe_placeholders, array_unique($placeholders));
  $expected_big_pipe_placeholders_with_replacements = [];
  foreach ($expected_big_pipe_placeholder_stream_order as $big_pipe_placeholder_id) {
    $expected_big_pipe_placeholders_with_replacements[$big_pipe_placeholder_id] = $expected_big_pipe_placeholders[$big_pipe_placeholder_id];
  }
  $this
    ->assertEquals($expected_big_pipe_placeholders_with_replacements, array_filter($expected_big_pipe_placeholders));
  $this
    ->assertSetsEqual(array_keys($expected_big_pipe_placeholders_with_replacements), array_values($placeholder_replacement_positions));
  $this
    ->assertSame(count($expected_big_pipe_placeholders_with_replacements), preg_match_all('/' . preg_quote('<script type="application/vnd.drupal-ajax" data-big-pipe-replacement-for-placeholder-with-id="', '/') . '/', $this
    ->getSession()
    ->getPage()
    ->getContent()));

  // Verifying BigPipe start/stop signals.
  $this
    ->assertSession()
    ->responseContains(BigPipe::START_SIGNAL);
  $this
    ->assertSession()
    ->responseContains(BigPipe::STOP_SIGNAL);
  $start_signal_position = strpos($this
    ->getSession()
    ->getPage()
    ->getContent(), BigPipe::START_SIGNAL);
  $stop_signal_position = strpos($this
    ->getSession()
    ->getPage()
    ->getContent(), BigPipe::STOP_SIGNAL);
  $this
    ->assertTrue($start_signal_position < $stop_signal_position, 'BigPipe start signal appears before stop signal.');

  // Verifying BigPipe placeholder replacements and start/stop signals were
  // streamed in the correct order.
  $expected_stream_order = array_keys($expected_big_pipe_placeholders_with_replacements);
  array_unshift($expected_stream_order, BigPipe::START_SIGNAL);
  array_push($expected_stream_order, BigPipe::STOP_SIGNAL);
  $actual_stream_order = $placeholder_replacement_positions + [
    $start_signal_position => BigPipe::START_SIGNAL,
    $stop_signal_position => BigPipe::STOP_SIGNAL,
  ];
  ksort($actual_stream_order, SORT_NUMERIC);
  $this
    ->assertEquals($expected_stream_order, array_values($actual_stream_order));
}