addPlaceholderStrategy($strategy); } $this->assertEquals($result, $chained_placeholder_strategy->processPlaceholders($placeholders)); } /** * Provides a list of render strategies, placeholders and results. * * @return array */ public function providerProcessPlaceholders() { $data = []; // Empty placeholders. $data['empty placeholders'] = [[], [], []]; // Placeholder removing strategy. $placeholders = [ 'remove-me' => ['#markup' => 'I-am-a-llama-that-will-be-removed-sad-face.'], ]; $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->willReturn([]); $dev_null_strategy = $prophecy->reveal(); $data['placeholder removing strategy'] = [[$dev_null_strategy], $placeholders, []]; // Fake Single Flush strategy. $placeholders = [ '67890' => ['#markup' => 'special-placeholder'], ]; $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->willReturn($placeholders); $single_flush_strategy = $prophecy->reveal(); $data['fake single flush strategy'] = [[$single_flush_strategy], $placeholders, $placeholders]; // Fake ESI strategy. $placeholders = [ '12345' => ['#markup' => 'special-placeholder-for-esi'], ]; $result = [ '12345' => ['#markup' => ''], ]; $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->willReturn($result); $esi_strategy = $prophecy->reveal(); $data['fake esi strategy'] = [[$esi_strategy], $placeholders, $result]; // ESI + SingleFlush strategy (ESI replaces all). $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->willReturn($result); $esi_strategy = $prophecy->reveal(); $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->shouldNotBeCalled(); $prophecy->processPlaceholders($result)->shouldNotBeCalled(); $prophecy->processPlaceholders([])->shouldNotBeCalled(); $single_flush_strategy = $prophecy->reveal(); $data['fake esi and single_flush strategy - esi replaces all'] = [[$esi_strategy, $single_flush_strategy], $placeholders, $result]; // ESI + SingleFlush strategy (mixed). $placeholders = [ '12345' => ['#markup' => 'special-placeholder-for-ESI'], '67890' => ['#markup' => 'special-placeholder'], 'foo' => ['#markup' => 'bar'], ]; $esi_result = [ '12345' => ['#markup' => ''], ]; $normal_result = [ '67890' => ['#markup' => 'special-placeholder'], 'foo' => ['#markup' => 'bar'], ]; $result = $esi_result + $normal_result; $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->willReturn($esi_result); $esi_strategy = $prophecy->reveal(); $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($normal_result)->willReturn($normal_result); $single_flush_strategy = $prophecy->reveal(); $data['fake esi and single_flush strategy - mixed'] = [[$esi_strategy, $single_flush_strategy], $placeholders, $result]; return $data; } /** * @covers ::processPlaceholders */ public function testProcessPlaceholdersNoStrategies() { // Placeholders but no strategies defined. $placeholders = [ 'assert-me' => ['#markup' => 'I-am-a-llama-that-will-lead-to-an-assertion-by-the-chained-placeholder-strategy.'], ]; $chained_placeholder_strategy = new ChainedPlaceholderStrategy(); $this->setExpectedException(\AssertionError::class, 'At least one placeholder strategy must be present; by default the fallback strategy \Drupal\Core\Render\Placeholder\SingleFlushStrategy is always present.'); $chained_placeholder_strategy->processPlaceholders($placeholders); } /** * @covers ::processPlaceholders */ public function testProcessPlaceholdersWithRoguePlaceholderStrategy() { // Placeholders but no strategies defined. $placeholders = [ 'assert-me' => ['#markup' => 'llama'], ]; $result = [ 'assert-me' => ['#markup' => 'llama'], 'new-placeholder' => ['#markup' => 'rogue llama'], ]; $prophecy = $this->prophesize('\Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface'); $prophecy->processPlaceholders($placeholders)->willReturn($result); $rogue_strategy = $prophecy->reveal(); $chained_placeholder_strategy = new ChainedPlaceholderStrategy(); $chained_placeholder_strategy->addPlaceholderStrategy($rogue_strategy); $this->setExpectedException(\AssertionError::class, 'Processed placeholders must be a subset of all placeholders.'); $chained_placeholder_strategy->processPlaceholders($placeholders); } }