--- /dev/null
+<?php
+
+namespace Drupal\Tests\filter\Unit;
+
+use Drupal\simpletest\AssertHelperTrait;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\filter\FilterUninstallValidator
+ * @group filter
+ */
+class FilterUninstallValidatorTest extends UnitTestCase {
+
+ use AssertHelperTrait;
+
+ /**
+ * @var \Drupal\filter\FilterUninstallValidator|\PHPUnit_Framework_MockObject_MockObject
+ */
+ protected $filterUninstallValidator;
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp() {
+ parent::setUp();
+ $this->filterUninstallValidator = $this->getMockBuilder('Drupal\filter\FilterUninstallValidator')
+ ->disableOriginalConstructor()
+ ->setMethods(['getFilterDefinitionsByProvider', 'getEnabledFilterFormats'])
+ ->getMock();
+ $this->filterUninstallValidator->setStringTranslation($this->getStringTranslationStub());
+ }
+
+ /**
+ * @covers ::validate
+ */
+ public function testValidateNoPlugins() {
+ $this->filterUninstallValidator->expects($this->once())
+ ->method('getFilterDefinitionsByProvider')
+ ->willReturn([]);
+ $this->filterUninstallValidator->expects($this->never())
+ ->method('getEnabledFilterFormats');
+
+ $module = $this->randomMachineName();
+ $expected = [];
+ $reasons = $this->filterUninstallValidator->validate($module);
+ $this->assertSame($expected, $this->castSafeStrings($reasons));
+ }
+
+ /**
+ * @covers ::validate
+ */
+ public function testValidateNoFormats() {
+ $this->filterUninstallValidator->expects($this->once())
+ ->method('getFilterDefinitionsByProvider')
+ ->willReturn([
+ 'test_filter_plugin' => [
+ 'id' => 'test_filter_plugin',
+ 'provider' => 'filter_test',
+ ],
+ ]);
+ $this->filterUninstallValidator->expects($this->once())
+ ->method('getEnabledFilterFormats')
+ ->willReturn([]);
+
+ $module = $this->randomMachineName();
+ $expected = [];
+ $reasons = $this->filterUninstallValidator->validate($module);
+ $this->assertSame($expected, $this->castSafeStrings($reasons));
+ }
+
+ /**
+ * @covers ::validate
+ */
+ public function testValidateNoMatchingFormats() {
+ $this->filterUninstallValidator->expects($this->once())
+ ->method('getFilterDefinitionsByProvider')
+ ->willReturn([
+ 'test_filter_plugin1' => [
+ 'id' => 'test_filter_plugin1',
+ 'provider' => 'filter_test',
+ ],
+ 'test_filter_plugin2' => [
+ 'id' => 'test_filter_plugin2',
+ 'provider' => 'filter_test',
+ ],
+ 'test_filter_plugin3' => [
+ 'id' => 'test_filter_plugin3',
+ 'provider' => 'filter_test',
+ ],
+ 'test_filter_plugin4' => [
+ 'id' => 'test_filter_plugin4',
+ 'provider' => 'filter_test',
+ ],
+ ]);
+
+ $filter_plugin_enabled = $this->getMockForAbstractClass('Drupal\filter\Plugin\FilterBase', [['status' => TRUE], '', ['provider' => 'filter_test']]);
+ $filter_plugin_disabled = $this->getMockForAbstractClass('Drupal\filter\Plugin\FilterBase', [['status' => FALSE], '', ['provider' => 'filter_test']]);
+
+ // The first format has 2 matching and enabled filters, but the loop breaks
+ // after finding the first one.
+ $filter_plugin_collection1 = $this->getMockBuilder('Drupal\filter\FilterPluginCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filter_plugin_collection1->expects($this->exactly(3))
+ ->method('has')
+ ->willReturnMap([
+ ['test_filter_plugin1', FALSE],
+ ['test_filter_plugin2', TRUE],
+ ['test_filter_plugin3', TRUE],
+ ['test_filter_plugin4', TRUE],
+ ]);
+ $filter_plugin_collection1->expects($this->exactly(2))
+ ->method('get')
+ ->willReturnMap([
+ ['test_filter_plugin2', $filter_plugin_disabled],
+ ['test_filter_plugin3', $filter_plugin_enabled],
+ ['test_filter_plugin4', $filter_plugin_enabled],
+ ]);
+
+ $filter_format1 = $this->getMock('Drupal\filter\FilterFormatInterface');
+ $filter_format1->expects($this->once())
+ ->method('filters')
+ ->willReturn($filter_plugin_collection1);
+ $filter_format1->expects($this->once())
+ ->method('label')
+ ->willReturn('Filter Format 1 Label');
+
+ // The second filter format only has one matching and enabled filter.
+ $filter_plugin_collection2 = $this->getMockBuilder('Drupal\filter\FilterPluginCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filter_plugin_collection2->expects($this->exactly(4))
+ ->method('has')
+ ->willReturnMap([
+ ['test_filter_plugin1', FALSE],
+ ['test_filter_plugin2', FALSE],
+ ['test_filter_plugin3', FALSE],
+ ['test_filter_plugin4', TRUE],
+ ]);
+ $filter_plugin_collection2->expects($this->exactly(1))
+ ->method('get')
+ ->with('test_filter_plugin4')
+ ->willReturn($filter_plugin_enabled);
+
+ $filter_format2 = $this->getMock('Drupal\filter\FilterFormatInterface');
+ $filter_format2->expects($this->once())
+ ->method('filters')
+ ->willReturn($filter_plugin_collection2);
+ $filter_format2->expects($this->once())
+ ->method('label')
+ ->willReturn('Filter Format 2 Label');
+ $this->filterUninstallValidator->expects($this->once())
+ ->method('getEnabledFilterFormats')
+ ->willReturn([
+ 'test_filter_format1' => $filter_format1,
+ 'test_filter_format2' => $filter_format2,
+ ]);
+
+ $expected = [
+ 'Provides a filter plugin that is in use in the following filter formats: <em class="placeholder">Filter Format 1 Label, Filter Format 2 Label</em>'
+ ];
+ $reasons = $this->filterUninstallValidator->validate($this->randomMachineName());
+ $this->assertSame($expected, $this->castSafeStrings($reasons));
+ }
+
+}