3 namespace Drupal\Tests\aggregator\Kernel\Views;
5 use Drupal\Component\Utility\Xss;
6 use Drupal\Core\Render\RenderContext;
8 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
9 use Drupal\views\Views;
10 use Drupal\views\Tests\ViewTestData;
13 * Tests basic integration of views data from the aggregator module.
17 class IntegrationTest extends ViewsKernelTestBase {
24 public static $modules = ['aggregator', 'aggregator_test_views', 'system', 'field', 'options', 'user'];
27 * Views used by this test.
31 public static $testViews = ['test_aggregator_items'];
34 * The entity storage for aggregator items.
36 * @var \Drupal\aggregator\ItemStorage
38 protected $itemStorage;
41 * The entity storage for aggregator feeds.
43 * @var \Drupal\aggregator\FeedStorage
45 protected $feedStorage;
50 protected function setUp($import_test_views = TRUE) {
53 $this->installEntitySchema('aggregator_item');
54 $this->installEntitySchema('aggregator_feed');
56 ViewTestData::createTestViews(get_class($this), ['aggregator_test_views']);
58 $this->itemStorage = $this->container->get('entity.manager')->getStorage('aggregator_item');
59 $this->feedStorage = $this->container->get('entity.manager')->getStorage('aggregator_feed');
63 * Tests basic aggregator_item view.
65 public function testAggregatorItemView() {
66 /** @var \Drupal\Core\Render\RendererInterface $renderer */
67 $renderer = \Drupal::service('renderer');
69 $feed = $this->feedStorage->create([
70 'title' => $this->randomMachineName(),
71 'url' => 'https://www.drupal.org/',
73 'checked' => 123543535,
74 'description' => $this->randomMachineName(),
80 for ($i = 0; $i < 10; $i++) {
82 $values['fid'] = $feed->id();
83 $values['timestamp'] = mt_rand(REQUEST_TIME - 10, REQUEST_TIME + 10);
84 $values['title'] = $this->randomMachineName();
85 $values['description'] = $this->randomMachineName();
86 // Add a image to ensure that the sanitizing can be tested below.
87 $values['author'] = $this->randomMachineName() . '<img src="http://example.com/example.png" \>"';
88 $values['link'] = 'https://www.drupal.org/node/' . mt_rand(1000, 10000);
89 $values['guid'] = $this->randomString();
91 $aggregator_item = $this->itemStorage->create($values);
92 $aggregator_item->save();
93 $items[$aggregator_item->id()] = $aggregator_item;
95 $values['iid'] = $aggregator_item->id();
96 $expected[] = $values;
99 $view = Views::getView('test_aggregator_items');
100 $this->executeView($view);
105 'aggregator_item_timestamp' => 'timestamp',
106 'description' => 'description',
107 'aggregator_item_author' => 'author',
109 $this->assertIdenticalResultset($view, $expected, $column_map);
111 // Ensure that the rendering of the linked title works as expected.
112 foreach ($view->result as $row) {
113 $iid = $view->field['iid']->getValue($row);
114 $expected_link = \Drupal::l($items[$iid]->getTitle(), Url::fromUri($items[$iid]->getLink(), ['absolute' => TRUE]));
115 $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view, $row) {
116 return $view->field['title']->advancedRender($row);
118 $this->assertEqual($output, $expected_link->getGeneratedLink(), 'Ensure the right link is generated');
120 $expected_author = Xss::filter($items[$iid]->getAuthor(), _aggregator_allowed_tags());
121 $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view, $row) {
122 return $view->field['author']->advancedRender($row);
124 $this->assertEqual($output, $expected_author, 'Ensure the author got filtered');
126 $expected_description = Xss::filter($items[$iid]->getDescription(), _aggregator_allowed_tags());
127 $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view, $row) {
128 return $view->field['description']->advancedRender($row);
130 $this->assertEqual($output, $expected_description, 'Ensure the author got filtered');