Skip to content
Snippets Groups Projects
Commit 80b2b13f authored by Oussama Mubarak's avatar Oussama Mubarak Committed by Adrian Cid Almaguer
Browse files

Resolve #3216266 "Allow alter revision candidates"

parent 0a71dfe7
Branches
Tags
1 merge request!2Resolve #3216266 "Allow alter revision candidates"
......@@ -348,6 +348,10 @@ class NodeRevisionDelete implements NodeRevisionDeleteInterface {
// vid. We excluded the default revision in the where call.
$sub_query->range($content_type_config['minimum_revisions_to_keep'] - 1, $number);
// Allow other modules to alter candidates query.
$sub_query->addTag('node_revision_delete_candidate_revisions');
$sub_query->addTag('node_revision_delete_candidate_revisions_' . $content_type);
$query = $this->connection->select($sub_query, 't');
$query->fields('t', ['vid']);
$query->condition('revision_timestamp', $content_type_config['minimum_age_to_delete'], '<');
......@@ -374,8 +378,10 @@ class NodeRevisionDelete implements NodeRevisionDeleteInterface {
/** @var \Drupal\node\NodeInterface $node */
$node = $this->entityTypeManager->getStorage('node')->load(current($nids));
$content_type = $node->getType();
// Getting the content type config.
$content_type_config = $this->getContentTypeConfigWithRelativeTime($node->getType());
$content_type_config = $this->getContentTypeConfigWithRelativeTime($content_type);
if (!empty($content_type_config)) {
$sub_query = $this->connection->select('node_field_data', 'n');
......@@ -399,6 +405,10 @@ class NodeRevisionDelete implements NodeRevisionDeleteInterface {
// We excluded the default revision in the where call.
$sub_query->range($content_type_config['minimum_revisions_to_keep'] - 1, PHP_INT_MAX);
// Allow other modules to alter candidates query.
$sub_query->addTag('node_revision_delete_candidate_revisions');
$sub_query->addTag('node_revision_delete_candidate_revisions_' . $content_type);
$query = $this->connection->select($sub_query, 't');
$query->fields('t', ['vid']);
$query->condition('revision_timestamp', $content_type_config['minimum_age_to_delete'], '<');
......
name: 'Node Revision Delete module tests'
description: 'Support module for Node Revision Delete related testing.'
package: Testing
type: module
core_version_requirement: ^8.7.7 || ^9.0
dependencies:
- node_revision_delete:node_revision_delete
<?php
/**
* @file
* Provides test hook implementations for node_revision_delete tests.
*
* Mostly borrowed from the taxonomy_test module.
*/
/**
* Implements hook_query_TAG_alter().
*/
function node_revision_delete_test_query_node_revision_delete_candidates_alter() {
$value = \Drupal::state()->get(__FUNCTION__);
if (isset($value)) {
\Drupal::state()->set(__FUNCTION__, ++$value);
}
}
/**
* Implements hook_query_TAG_alter().
*/
function node_revision_delete_test_query_node_revision_delete_candidates_article_alter() {
$value = \Drupal::state()->get(__FUNCTION__);
if (isset($value)) {
\Drupal::state()->set(__FUNCTION__, ++$value);
}
}
/**
* Implements hook_query_TAG_alter().
*/
function node_revision_delete_test_query_node_revision_delete_candidate_revisions_alter() {
$value = \Drupal::state()->get(__FUNCTION__);
if (isset($value)) {
\Drupal::state()->set(__FUNCTION__, ++$value);
}
}
/**
* Implements hook_query_TAG_alter().
*/
function node_revision_delete_test_query_node_revision_delete_candidate_revisions_article_alter() {
$value = \Drupal::state()->get(__FUNCTION__);
if (isset($value)) {
\Drupal::state()->set(__FUNCTION__, ++$value);
}
}
<?php
namespace Drupal\Tests\node_revision_delete\Kernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
/**
* Tests that appropriate query tags are added.
*
* @group node_revision_delete
*/
class NodeRevisionDeleteQueryAlterTest extends KernelTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = [
'node_revision_delete',
'node_revision_delete_test',
'node',
'system',
'user',
];
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
$this->installEntitySchema('node');
$this->installSchema('node', 'node_access');
$this->installEntitySchema('user');
$this->installConfig(['node_revision_delete']);
// Getting the node revision delete service.
$this->nodeRevisionDelete = $this->container->get('node_revision_delete');
}
/**
* Tests that appropriate tags are added when querying the database.
*/
public function testNodeRevisionDeleteQueryAlter() {
// Add article node type.
$node_type = NodeType::create([
'type' => 'article',
'label' => 'Article',
]);
$node_type->save();
$this->nodeRevisionDelete->saveContentTypeConfig('article', 1, 0, 0);
// Add node and revisions.
$revision1 = Node::create([
'type' => 'article',
'title' => 'My article',
]);
$revision1->save();
$revision2 = clone $revision1;
$revision2->setNewRevision();
$revision2->save();
$revision3 = clone $revision2;
$revision3->setNewRevision();
$revision3->save();
$this->setupQueryTagTestHooks();
$this->nodeRevisionDelete->getCandidatesNodes('article');
$this->assertQueryTagTestResult('node_revision_delete_test_query_node_revision_delete_candidates_alter', 1);
$this->assertQueryTagTestResult('node_revision_delete_test_query_node_revision_delete_candidates_article_alter', 1);
$this->nodeRevisionDelete->getCandidatesRevisions('article');
$this->assertQueryTagTestResult('node_revision_delete_test_query_node_revision_delete_candidate_revisions_alter', 1);
$this->assertQueryTagTestResult('node_revision_delete_test_query_node_revision_delete_candidate_revisions_article_alter', 1);
$this->nodeRevisionDelete->getCandidatesRevisionsByNids([$revision1->id()]);
$this->assertQueryTagTestResult('node_revision_delete_test_query_node_revision_delete_candidate_revisions_alter', 2);
$this->assertQueryTagTestResult('node_revision_delete_test_query_node_revision_delete_candidate_revisions_article_alter', 2);
}
/**
* Sets up the hooks in the test module.
*/
protected function setupQueryTagTestHooks() {
$state = $this->container->get('state');
$state->set('node_revision_delete_test_query_node_revision_delete_candidates_alter', 0);
$state->set('node_revision_delete_test_query_node_revision_delete_candidates_article_alter', 0);
$state->set('node_revision_delete_test_query_node_revision_delete_candidate_revisions_alter', 0);
$state->set('node_revision_delete_test_query_node_revision_delete_candidate_revisions_article_alter', 0);
}
/**
* Verifies invocation of the hooks in the test module.
*
* @param string $function
* The name of the query alter hook function.
* @param int $expected_invocations
* The number of times the hook is expected to
* have been invoked.
*/
protected function assertQueryTagTestResult($function, $expected_invocations) {
$state = $this->container->get('state');
$this->assertEquals($expected_invocations, $state->get($function));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment