diff --git a/core/modules/aggregator/aggregator.services.yml b/core/modules/aggregator/aggregator.services.yml index 639ed2d..e486b54 100644 --- a/core/modules/aggregator/aggregator.services.yml +++ b/core/modules/aggregator/aggregator.services.yml @@ -1,10 +1,10 @@ services: plugin.manager.aggregator.fetcher: class: Drupal\aggregator\Plugin\AggregatorPluginManager - arguments: [fetcher, '@container.namespaces'] + arguments: [fetcher, '@container.namespaces', '@cache.cache', '@language_manager'] plugin.manager.aggregator.parser: class: Drupal\aggregator\Plugin\AggregatorPluginManager - arguments: [parser, '@container.namespaces'] + arguments: [parser, '@container.namespaces', '@cache.cache', '@language_manager'] plugin.manager.aggregator.processor: class: Drupal\aggregator\Plugin\AggregatorPluginManager - arguments: [processor, '@container.namespaces'] + arguments: [processor, '@container.namespaces', '@cache.cache', '@language_manager'] diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php index bb46647..4d67770 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/SettingsForm.php @@ -7,9 +7,12 @@ namespace Drupal\aggregator\Form; -use Drupal\system\SystemConfigFormBase; -use Drupal\Core\Config\ConfigFactory; use Drupal\aggregator\Plugin\AggregatorPluginManager; +use Drupal\Component\Utility\String; +use Drupal\Core\Form\FormInterface; +use Drupal\Core\Config\ConfigFactory; +use Drupal\Core\StringTranslation\TranslationManager; +use Drupal\system\SystemConfigFormBase; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -18,6 +21,20 @@ class SettingsForm extends SystemConfigFormBase { /** + * The configuration object factory. + * + * @var \Drupal\Core\Config\ConfigFactory + */ + protected $configFactory; + + /** + * The string translation service. + * + * @var \Drupal\Core\StringTranslation\TranslationManager + */ + protected $string_translation; + + /** * The aggregator plugin managers. * * @var array @@ -25,6 +42,13 @@ class SettingsForm extends SystemConfigFormBase { protected $managers = array(); /** + * The instantiated plugin instances. + * + * @var array + */ + protected $instances = array(); + + /** * The aggregator plugin definitions. * * @var array @@ -40,6 +64,8 @@ class SettingsForm extends SystemConfigFormBase { * * @param \Drupal\Core\Config\ConfigFactory $config_factory * The factory for configuration objects. + * @param \Drupal\Core\StringTranslation\TranslationManager $string_translation + * The string translation service. * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $fetcher_manager * The aggregator fetcher plugin manager. * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $parser_manager @@ -47,8 +73,9 @@ class SettingsForm extends SystemConfigFormBase { * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $processor_manager * The aggregator processor plugin manager. */ - public function __construct(ConfigFactory $config_factory, AggregatorPluginManager $fetcher_manager, AggregatorPluginManager $parser_manager, AggregatorPluginManager $processor_manager) { + public function __construct(ConfigFactory $config_factory, TranslationManager $string_translation, AggregatorPluginManager $fetcher_manager, AggregatorPluginManager $parser_manager, AggregatorPluginManager $processor_manager) { $this->configFactory = $config_factory; + $this->translation = $string_translation; $this->managers = array( 'fetcher' => $fetcher_manager, 'parser' => $parser_manager, @@ -57,7 +84,7 @@ public function __construct(ConfigFactory $config_factory, AggregatorPluginManag // Get all available fetcher, parser and processor definitions. foreach (array('fetcher', 'parser', 'processor') as $type) { foreach ($this->managers[$type]->getDefinitions() as $id => $definition) { - $this->definitions[$type][$id] = format_string('@title @description', array('@title' => $definition['title'], '@description' => $definition['description'])); + $this->definitions[$type][$id] = String::format('@title @description', array('@title' => $definition['title'], '@description' => $definition['description'])); } } } @@ -68,6 +95,7 @@ public function __construct(ConfigFactory $config_factory, AggregatorPluginManag public static function create(ContainerInterface $container) { return new static( $container->get('config.factory'), + $container->get('string_translation'), $container->get('plugin.manager.aggregator.fetcher'), $container->get('plugin.manager.aggregator.parser'), $container->get('plugin.manager.aggregator.processor') @@ -75,14 +103,14 @@ public static function create(ContainerInterface $container) { } /** - * Implements \Drupal\Core\Form\FormInterface::getFormID(). + * {@inheritdoc} */ public function getFormID() { return 'aggregator_admin_form'; } /** - * Implements \Drupal\Core\Form\FormInterface::buildForm(). + * {@inheritdoc} */ public function buildForm(array $form, array &$form_state) { $config = $this->configFactory->get('aggregator.settings'); @@ -90,11 +118,11 @@ public function buildForm(array $form, array &$form_state) { // Global aggregator settings. $form['aggregator_allowed_html_tags'] = array( '#type' => 'textfield', - '#title' => t('Allowed HTML tags'), + '#title' => $this->translation->translate('Allowed HTML tags'), '#size' => 80, '#maxlength' => 255, '#default_value' => $config->get('items.allowed_html'), - '#description' => t('A space-separated list of HTML tags allowed in the content of feed items. Disallowed tags are stripped from the content.'), + '#description' => $this->translation->translate('A space-separated list of HTML tags allowed in the content of feed items. Disallowed tags are stripped from the content.'), ); // Only show basic configuration if there are actually options. @@ -102,8 +130,8 @@ public function buildForm(array $form, array &$form_state) { if (count($this->definitions['fetcher']) > 1) { $basic_conf['aggregator_fetcher'] = array( '#type' => 'radios', - '#title' => t('Fetcher'), - '#description' => t('Fetchers download data from an external source. Choose a fetcher suitable for the external source you would like to download from.'), + '#title' => $this->translation->translate('Fetcher'), + '#description' => $this->translation->translate('Fetchers download data from an external source. Choose a fetcher suitable for the external source you would like to download from.'), '#options' => $this->definitions['fetcher'], '#default_value' => $config->get('fetcher'), ); @@ -111,8 +139,8 @@ public function buildForm(array $form, array &$form_state) { if (count($this->definitions['parser']) > 1) { $basic_conf['aggregator_parser'] = array( '#type' => 'radios', - '#title' => t('Parser'), - '#description' => t('Parsers transform downloaded data into standard structures. Choose a parser suitable for the type of feeds you would like to aggregate.'), + '#title' => $this->translation->translate('Parser'), + '#description' => $this->translation->translate('Parsers transform downloaded data into standard structures. Choose a parser suitable for the type of feeds you would like to aggregate.'), '#options' => $this->definitions['parser'], '#default_value' => $config->get('parser'), ); @@ -120,8 +148,8 @@ public function buildForm(array $form, array &$form_state) { if (count($this->definitions['processor']) > 1) { $basic_conf['aggregator_processors'] = array( '#type' => 'checkboxes', - '#title' => t('Processors'), - '#description' => t('Processors act on parsed feed data, for example they store feed items. Choose the processors suitable for your task.'), + '#title' => $this->translation->translate('Processors'), + '#description' => $this->translation->translate('Processors act on parsed feed data, for example they store feed items. Choose the processors suitable for your task.'), '#options' => $this->definitions['processor'], '#default_value' => $config->get('processors'), ); @@ -129,35 +157,71 @@ public function buildForm(array $form, array &$form_state) { if (count($basic_conf)) { $form['basic_conf'] = array( '#type' => 'details', - '#title' => t('Basic configuration'), - '#description' => t('For most aggregation tasks, the default settings are fine.'), + '#title' => $this->translation->translate('Basic configuration'), + '#description' => $this->translation->translate('For most aggregation tasks, the default settings are fine.'), '#collapsed' => FALSE, ); $form['basic_conf'] += $basic_conf; } + // Call buildForm() on the active fetcher and parser. + foreach (array('fetcher', 'parser') as $type) { + $active = $config->get($type); + if (array_key_exists($active, $this->definitions[$type])) { + $instance = $this->managers[$type]->createInstance($active); + if ($instance instanceof FormInterface) { + $form = $instance->buildForm($form, $form_state); + // Store the instance for validate and submit handlers. + $this->instances[] = $instance; + } + } + } + // Implementing processor plugins will expect an array at $form['processors']. $form['processors'] = array(); - // Call settingsForm() for each active processor. + // Call buildForm() for each active processor. foreach ($this->definitions['processor'] as $id => $definition) { if (in_array($id, $config->get('processors'))) { - $form = $this->managers['processor']->createInstance($id)->settingsForm($form, $form_state); + $instance = $this->managers['processor']->createInstance($id); + if ($instance instanceof FormInterface) { + $form = $instance->buildForm($form, $form_state); + // Store the instance for validate and submit handlers. + $this->instances[] = $instance; + } } } - return parent::buildForm($form, $form_state); + + // @todo remove in https://drupal.org/node/2018411 or after its in. + $form['actions']['#type'] = 'actions'; + $form['actions']['submit'] = array( + '#type' => 'submit', + '#value' => $this->translation->translate('Save configuration'), + '#button_type' => 'primary', + ); + $form['#theme'] = 'system_config_form'; + return $form; } /** - * Implements \Drupal\Core\Form\FormInterface::submitForm(). + * {@inheritdoc} + */ + public function validateForm(array &$form, array &$form_state) { + parent::validateForm($form, $form_state); + // Let active plugins validate their settings. + foreach ($this->instances as $instance) { + $instance->validateForm($form, $form_state); + } + } + + /** + * {@inheritdoc} */ public function submitForm(array &$form, array &$form_state) { parent::submitForm($form, $form_state); $config = $this->configFactory->get('aggregator.settings'); - // Let active processors save their settings. - foreach ($this->definitions['processor'] as $id => $definition) { - if (in_array($id, $config->get('processors'))) { - $this->managers['processor']->createInstance($id)->settingsSubmit($form, $form_state); - } + // Let active plugins save their settings. + foreach ($this->instances as $instance) { + $instance->submitForm($form, $form_state); } $config->set('items.allowed_html', $form_state['values']['aggregator_allowed_html_tags']); diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php index 12e41cd..043f3fc 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginManager.php @@ -7,16 +7,14 @@ namespace Drupal\aggregator\Plugin; -use Drupal\Component\Plugin\PluginManagerBase; -use Drupal\Component\Plugin\Factory\DefaultFactory; -use Drupal\Core\Language\Language; -use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery; -use Drupal\Core\Plugin\Discovery\CacheDecorator; +use Drupal\Core\Cache\CacheBackendInterface; +use Drupal\Core\Language\LanguageManager; +use Drupal\Core\Plugin\DefaultPluginManager; /** * Manages aggregator plugins. */ -class AggregatorPluginManager extends PluginManagerBase { +class AggregatorPluginManager extends DefaultPluginManager { /** * Constructs a AggregatorPluginManager object. @@ -25,9 +23,13 @@ class AggregatorPluginManager extends PluginManagerBase { * The plugin type, for example fetcher. * @param \Traversable $namespaces * An object that implements \Traversable which contains the root paths - * keyed by the corresponding namespace to look for plugin implementations, + * keyed by the corresponding namespace to look for plugin implementations. + * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend + * Cache backend instance to use. + * @param \Drupal\Core\Language\LanguageManager $language_manager + * The language manager. */ - public function __construct($type, \Traversable $namespaces) { + public function __construct($type, \Traversable $namespaces, CacheBackendInterface $cache_backend, LanguageManager $language_manager) { $type_annotations = array( 'fetcher' => 'Drupal\aggregator\Annotation\AggregatorFetcher', 'parser' => 'Drupal\aggregator\Annotation\AggregatorParser', @@ -38,8 +40,8 @@ public function __construct($type, \Traversable $namespaces) { 'Drupal\aggregator\Annotation' => DRUPAL_ROOT . '/core/modules/aggregator/lib', ); - $this->discovery = new AnnotatedClassDiscovery("aggregator/$type", $namespaces, $annotation_namespaces, $type_annotations[$type]); - $this->discovery = new CacheDecorator($this->discovery, "aggregator_$type:" . language(Language::TYPE_INTERFACE)->langcode); - $this->factory = new DefaultFactory($this->discovery); + parent::__construct("aggregator/$type", $namespaces, $annotation_namespaces, $type_annotations[$type]); + $this->setCacheBackend($cache_backend, $language_manager, "aggregator_$type"); } + } diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginSettingsBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginSettingsBase.php new file mode 100644 index 0000000..d4dcf52 --- /dev/null +++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/AggregatorPluginSettingsBase.php @@ -0,0 +1,31 @@ +httpClient = $http_client; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) { + return new static($container->get('http_default_client')); + } /** - * Implements \Drupal\aggregator\Plugin\FetcherInterface::fetch(). + * {@inheritdoc} */ public function fetch(Feed $feed) { - // @todo: Inject the http client. - $request = \Drupal::httpClient()->get($feed->url->value); + $request = $this->httpClient->get($feed->url->value); $feed->source_string = FALSE; // Generate conditional GET headers. diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php index 79d9d07..3cca4bc 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/processor/DefaultProcessor.php @@ -7,12 +7,14 @@ namespace Drupal\aggregator\Plugin\aggregator\processor; -use Drupal\Component\Plugin\PluginBase; +use Drupal\aggregator\Annotation\AggregatorProcessor; +use Drupal\aggregator\Plugin\AggregatorPluginSettingsBase; use Drupal\aggregator\Plugin\ProcessorInterface; use Drupal\aggregator\Plugin\Core\Entity\Feed; -use Drupal\aggregator\Annotation\AggregatorProcessor; use Drupal\Core\Annotation\Translation; use Drupal\Core\Database\Database; +use Drupal\Core\Config\ConfigFactory; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Defines a default processor implementation. @@ -25,13 +27,44 @@ * description = @Translation("Creates lightweight records from feed items.") * ) */ -class DefaultProcessor extends PluginBase implements ProcessorInterface { +class DefaultProcessor extends AggregatorPluginSettingsBase implements ProcessorInterface { + + /** + * Contains the configuration object factory. + * + * @var \Drupal\Core\Config\ConfigFactory + */ + protected $configFactory; + + /** + * Constructs a DefaultProcessor object. + * + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param array $plugin_definition + * The plugin implementation definition. + * @param \Drupal\Core\Config\ConfigFactory $config + * The configuration factory object. + */ + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactory $config) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + $this->configFactory = $config; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) { + return new static($configuration, $plugin_id, $plugin_definition, $container->get('config.factory')); + } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsForm(). + * {@inheritdoc} */ - public function settingsForm(array $form, array &$form_state) { - $config = config('aggregator.settings'); + public function buildForm(array $form, array &$form_state) { + $config = $this->configFactory->get('aggregator.settings'); $processors = $config->get('processors'); $info = $this->getPluginDefinition(); $items = drupal_map_assoc(array(3, 5, 10, 15, 20, 25), array($this, 'formatItems')); @@ -84,10 +117,10 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsSubmit(). + * {@inheritdoc} */ - public function settingsSubmit(array $form, array &$form_state) { - $config = config('aggregator.settings'); + public function submitForm(array &$form, array &$form_state) { + $config = $this->configFactory->get('aggregator.settings'); $config->set('items.expire', $form_state['values']['aggregator_clear']) ->set('items.teaser_length', $form_state['values']['aggregator_teaser_length']) ->set('source.list_max', $form_state['values']['aggregator_summary_items']) @@ -96,7 +129,7 @@ public function settingsSubmit(array $form, array &$form_state) { } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::process(). + * {@inheritdoc} */ public function process(Feed $feed) { if (!is_array($feed->items)) { @@ -147,7 +180,7 @@ public function process(Feed $feed) { } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::remove(). + * {@inheritdoc} */ public function remove(Feed $feed) { $iids = Database::getConnection()->query('SELECT iid FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->id()))->fetchCol(); @@ -164,7 +197,7 @@ public function remove(Feed $feed) { * Expires items from a feed depending on expiration settings. */ public function postProcess(Feed $feed) { - $aggregator_clear = config('aggregator.settings')->get('items.expire'); + $aggregator_clear = $this->configFactory->get('aggregator.settings')->get('items.expire'); if ($aggregator_clear != AGGREGATOR_CLEAR_NEVER) { // Remove all items that are older than flush item timer. diff --git a/core/modules/aggregator/tests/Drupal/aggregator/Tests/Plugin/AggregatorPluginSettingsBaseTest.php b/core/modules/aggregator/tests/Drupal/aggregator/Tests/Plugin/AggregatorPluginSettingsBaseTest.php new file mode 100644 index 0000000..7523f9d --- /dev/null +++ b/core/modules/aggregator/tests/Drupal/aggregator/Tests/Plugin/AggregatorPluginSettingsBaseTest.php @@ -0,0 +1,119 @@ + 'Aggregator plugin settings tests', + 'description' => 'Test settings configuration of individual aggregator plugins.', + 'group' => 'Aggregator', + ); + } + + public function setUp() { + $this->configFactory = $this->getConfigFactoryStub( + array( + 'aggregator.settings' => array( + 'processors' => array('aggregator_test'), + ), + 'aggregator_test.settings' => array(), + ) + ); + foreach (array('fetcher', 'parser', 'processor') as $type) { + $this->managers[$type] = $this->getMockBuilder('Drupal\aggregator\Plugin\AggregatorPluginManager') + ->disableOriginalConstructor() + ->getMock(); + $this->managers[$type]->expects($this->once()) + ->method('getDefinitions') + ->will($this->returnValue(array('aggregator_test' => array('title' => '', 'description' => '')))); + } + + $this->settingsForm = new SettingsForm( + $this->configFactory, + $this->getStringTranslationStub(), + $this->managers['fetcher'], + $this->managers['parser'], + $this->managers['processor'] + ); + } + + /** + * Test for AggregatorPluginSettingsBase. + * + * Ensure that the settings form calls build, validate and submit methods on + * plugins that extend AggregatorPluginSettingsBase. + */ + public function testSettingsForm() { + // Emulate a form state of a sumbitted form. + $form_state = array('values' => array('aggregator_allowed_html_tags' => '')); + + $test_processor = $this->getMock( + 'Drupal\aggregator_test\Plugin\aggregator\processor\TestProcessor', + array('buildForm', 'validateForm', 'submitForm'), + array(array(), 'aggregator_test', array(), $this->configFactory) + ); + $test_processor->expects($this->at(0)) + ->method('buildForm') + ->with($this->anything(), $form_state) + ->will($this->returnArgument(0)); + $test_processor->expects($this->at(1)) + ->method('validateForm') + ->with($this->anything(), $form_state); + $test_processor->expects($this->at(2)) + ->method('submitForm') + ->with($this->anything(), $form_state); + $this->managers['processor']->expects($this->once()) + ->method('createInstance') + ->with($this->equalTo('aggregator_test')) + ->will($this->returnValue($test_processor)); + $form = $this->settingsForm->buildForm(array(), $form_state); + $this->settingsForm->validateForm($form, $form_state); + $this->settingsForm->submitForm($form, $form_state); + } + +} + +} + +// @todo Remove after https://drupal.org/node/1830588 is in. +namespace { + if (!function_exists('drupal_set_message')) { + function drupal_set_message() {} + } +} diff --git a/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php b/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php index d08a272..5e5fb8c 100644 --- a/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php +++ b/core/modules/aggregator/tests/modules/aggregator_test/lib/Drupal/aggregator_test/Plugin/aggregator/processor/TestProcessor.php @@ -7,11 +7,13 @@ namespace Drupal\aggregator_test\Plugin\aggregator\processor; -use Drupal\Component\Plugin\PluginBase; +use Drupal\aggregator\Plugin\AggregatorPluginSettingsBase; use Drupal\aggregator\Plugin\ProcessorInterface; use Drupal\aggregator\Plugin\Core\Entity\Feed; use Drupal\aggregator\Annotation\AggregatorProcessor; use Drupal\Core\Annotation\Translation; +use Drupal\Core\Config\ConfigFactory; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Defines a default processor implementation. @@ -24,14 +26,44 @@ * description = @Translation("Test generic processor functionality.") * ) */ -class TestProcessor extends PluginBase implements ProcessorInterface { +class TestProcessor extends AggregatorPluginSettingsBase implements ProcessorInterface { /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsForm(). + * Contains the configuration object factory. + * + * @var \Drupal\Core\Config\ConfigFactory */ - public function settingsForm(array $form, array &$form_state) { - $config = config('aggregator.settings'); - $processors = $config->get('processors'); + protected $configFactory; + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) { + return new static($configuration, $plugin_id, $plugin_definition, $container->get('config.factory')); + } + + /** + * Constructs a DefaultProcessor object. + * + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param array $plugin_definition + * The plugin implementation definition. + * @param \Drupal\Core\Config\ConfigFactory $config + * The configuration factory object. + */ + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactory $config) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + $this->configFactory = $config; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, array &$form_state) { + $processors = $this->configFactory->get('aggregator.settings')->get('processors'); $info = $this->getPluginDefinition(); $form['processors'][$info['id']] = array( @@ -46,22 +78,22 @@ public function settingsForm(array $form, array &$form_state) { '#type' => 'number', '#min' => 1, '#max' => 1000, - '#default_value' => config('aggregator_test.settings')->get('items.dummy_length'), + '#default_value' => $this->configFactory->get('aggregator_test.settings')->get('items.dummy_length'), ); return $form; } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::settingsSubmit(). + * {@inheritdoc} */ - public function settingsSubmit(array $form, array &$form_state) { - config('aggregator_test.settings') + public function submitForm(array &$form, array &$form_state) { + $this->configFactory->get('aggregator_test.settings') ->set('items.dummy_length', $form_state['values']['dummy_length']) ->save(); } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::process(). + * {@inheritdoc} */ public function process(Feed $feed) { foreach ($feed->items as &$item) { @@ -71,7 +103,7 @@ public function process(Feed $feed) { } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::remove(). + * {@inheritdoc} */ public function remove(Feed $feed) { // Append a random number, just to change the feed description. @@ -79,7 +111,7 @@ public function remove(Feed $feed) { } /** - * Implements \Drupal\aggregator\Plugin\ProcessorInterface::postProcess(). + * {@inheritdoc} */ public function postProcess(Feed $feed) { // Double the refresh rate. diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php index 1856011..b2e9d4a 100644 --- a/core/tests/Drupal/Tests/UnitTestCase.php +++ b/core/tests/Drupal/Tests/UnitTestCase.php @@ -134,4 +134,20 @@ public function getConfigStorageStub(array $configs) { return $config_storage; } + /** + * Returns a stub translation manager that just returns the passed string. + * + * @return \PHPUnit_Framework_MockObject_MockBuilder + * A MockBuilder object of \Drupal\Core\StringTranslation\TranslationManager + */ + public function getStringTranslationStub() { + $translation = $this->getMockBuilder('Drupal\Core\StringTranslation\TranslationManager') + ->disableOriginalConstructor() + ->getMock(); + $translation->expects($this->any()) + ->method('translate') + ->will($this->returnArgument(0)); + return $translation; + } + }