X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Fmodules%2Fblock_content%2Ftests%2Fsrc%2FFunctional%2FUpdate%2FBlockContentReusableUpdateTest.php;fp=web%2Fcore%2Fmodules%2Fblock_content%2Ftests%2Fsrc%2FFunctional%2FUpdate%2FBlockContentReusableUpdateTest.php;h=fb261db70e0ae0b7e2f4e33adb3e791e436eb075;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hp=0000000000000000000000000000000000000000;hpb=74df008bdbb3a11eeea356744f39b802369bda3c;p=yaffs-website diff --git a/web/core/modules/block_content/tests/src/Functional/Update/BlockContentReusableUpdateTest.php b/web/core/modules/block_content/tests/src/Functional/Update/BlockContentReusableUpdateTest.php new file mode 100644 index 000000000..fb261db70 --- /dev/null +++ b/web/core/modules/block_content/tests/src/Functional/Update/BlockContentReusableUpdateTest.php @@ -0,0 +1,153 @@ +databaseDumpFiles = [ + __DIR__ . '/../../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz', + // Override the 'block_content' view with an extra display with overridden + // filters. This extra display should also have a filter added for + // 'reusable' field so that it does not expose non-reusable fields. This + // display also has a filter that only shows blocks that contain 'block2' + // in the 'info' field. + __DIR__ . '/../../../fixtures/update/drupal-8.views_block_content-2976334.php', + ]; + } + + /** + * Tests adding 'reusable' entity base field to the block content entity type. + * + * @see block_content_update_8600() + * @see block_content_post_update_add_views_reusable_filter() + */ + public function testReusableFieldAddition() { + $assert_session = $this->assertSession(); + $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + + // Ensure that 'reusable' field is not present before updates. + $this->assertEmpty($entity_definition_update_manager->getFieldStorageDefinition('reusable', 'block_content')); + + // Ensure that 'reusable' filter is not present before updates. + $view_config = \Drupal::configFactory()->get('views.view.block_content'); + $this->assertFalse($view_config->isNew()); + $this->assertEmpty($view_config->get('display.default.display_options.filters.reusable')); + $this->assertEmpty($view_config->get('display.page_2.display_options.filters.reusable')); + // Run updates. + $this->runUpdates(); + + // Ensure that 'reusable' filter is present after updates. + \Drupal::configFactory()->clearStaticCache(); + $view_config = \Drupal::configFactory()->get('views.view.block_content'); + $this->assertNotEmpty($view_config->get('display.default.display_options.filters.reusable')); + $this->assertNotEmpty($view_config->get('display.page_2.display_options.filters.reusable')); + + // Check that the field exists and is configured correctly. + $reusable_field = $entity_definition_update_manager->getFieldStorageDefinition('reusable', 'block_content'); + $this->assertEquals('Reusable', $reusable_field->getLabel()); + $this->assertEquals('A boolean indicating whether this block is reusable.', $reusable_field->getDescription()); + $this->assertEquals(FALSE, $reusable_field->isRevisionable()); + $this->assertEquals(FALSE, $reusable_field->isTranslatable()); + + $after_block1 = BlockContent::create([ + 'info' => 'After update block1', + 'type' => 'basic_block', + ]); + $after_block1->save(); + // Add second block that will be shown with the 'info' filter on the + // additional view display. + $after_block2 = BlockContent::create([ + 'info' => 'After update block2', + 'type' => 'basic_block', + ]); + $after_block2->save(); + + $this->assertTrue($after_block1->isReusable()); + $this->assertTrue($after_block2->isReusable()); + + $admin_user = $this->drupalCreateUser(['administer blocks']); + $this->drupalLogin($admin_user); + + $block_non_reusable = BlockContent::create([ + 'info' => 'block1 non reusable', + 'type' => 'basic_block', + 'reusable' => FALSE, + ]); + $block_non_reusable->save(); + // Add second block that would be shown with the 'info' filter on the + // additional view display if the 'reusable' filter was not added. + $block2_non_reusable = BlockContent::create([ + 'info' => 'block2 non reusable', + 'type' => 'basic_block', + 'reusable' => FALSE, + ]); + $block2_non_reusable->save(); + $this->assertFalse($block_non_reusable->isReusable()); + $this->assertFalse($block2_non_reusable->isReusable()); + + // Ensure the Custom Block view shows the reusable blocks only. + $this->drupalGet('admin/structure/block/block-content'); + $assert_session->statusCodeEquals('200'); + $assert_session->responseContains('view-id-block_content'); + $assert_session->pageTextContains($after_block1->label()); + $assert_session->pageTextContains($after_block2->label()); + $assert_session->pageTextNotContains($block_non_reusable->label()); + $assert_session->pageTextNotContains($block2_non_reusable->label()); + + // Ensure the view's other display also only shows reusable blocks and still + // filters on the 'info' field. + $this->drupalGet('extra-view-display'); + $assert_session->statusCodeEquals('200'); + $assert_session->responseContains('view-id-block_content'); + $assert_session->pageTextNotContains($after_block1->label()); + $assert_session->pageTextContains($after_block2->label()); + $assert_session->pageTextNotContains($block_non_reusable->label()); + $assert_session->pageTextNotContains($block2_non_reusable->label()); + + // Ensure the Custom Block listing without Views installed shows the only + // reusable blocks. + $this->drupalGet('admin/structure/block/block-content'); + $this->container->get('module_installer')->uninstall(['views_ui', 'views']); + $this->drupalGet('admin/structure/block/block-content'); + $assert_session->statusCodeEquals('200'); + $assert_session->responseNotContains('view-id-block_content'); + $assert_session->pageTextContains($after_block1->label()); + $assert_session->pageTextContains($after_block2->label()); + $assert_session->pageTextNotContains($block_non_reusable->label()); + $assert_session->pageTextNotContains($block2_non_reusable->label()); + + $this->drupalGet('block/' . $after_block1->id()); + $assert_session->statusCodeEquals('200'); + + // Ensure the non-reusable block is not accessible in the form. + $this->drupalGet('block/' . $block_non_reusable->id()); + $assert_session->statusCodeEquals('403'); + + $this->drupalLogout(); + + $this->drupalLogin($this->createUser([ + 'access user profiles', + 'administer blocks', + ])); + $this->drupalGet('block/' . $after_block1->id()); + $assert_session->statusCodeEquals('200'); + + $this->drupalGet('block/' . $block_non_reusable->id()); + $assert_session->statusCodeEquals('403'); + } + +}