ai_upgrade_assistant-0.2.0-alpha2/tests/src/Unit/Service/NodeVisitor/ServiceVisitorTest.php

tests/src/Unit/Service/NodeVisitor/ServiceVisitorTest.php
<?php

namespace Drupal\Tests\ai_upgrade_assistant\Unit\Service\NodeVisitor;

use Drupal\Tests\UnitTestCase;
use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;
use Drupal\ai_upgrade_assistant\Service\NodeVisitor\ServiceVisitor;

/**
 * Tests the service visitor.
 *
 * @group ai_upgrade_assistant
 */
class ServiceVisitorTest extends UnitTestCase {

  /**
   * The PHP parser.
   *
   * @var \PhpParser\Parser
   */
  protected $parser;

  /**
   * The node traverser.
   *
   * @var \PhpParser\NodeTraverser
   */
  protected $traverser;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
    $this->traverser = new NodeTraverser();
  }

  /**
   * Tests static service call detection.
   */
  public function testStaticServiceCallDetection() {
    $code = <<<'EOT'
<?php
$entity_manager = \Drupal::service('entity.manager');
$plugin_manager = \Drupal::service('plugin.manager.entity');
$url_generator = \Drupal::service('url_generator');
EOT;

    $visitor = new ServiceVisitor();
    $this->traverser->addVisitor($visitor);
    
    $ast = $this->parser->parse($code);
    $this->traverser->traverse($ast);
    
    $findings = $visitor->getFindings();
    $this->assertCount(3, $findings);
    
    $this->assertEquals('entity.manager', $findings[0]['service']);
    $this->assertTrue($findings[0]['deprecated']);
    $this->assertTrue($findings[0]['critical']);
    $this->assertEquals('entity_type.manager', $findings[0]['replacement']);
  }

  /**
   * Tests service injection detection.
   */
  public function testServiceInjectionDetection() {
    $code = <<<'EOT'
<?php
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class MyService implements ContainerInjectionInterface {
  protected $entityManager;
  protected $database;

  public function __construct($entity_manager, $database) {
    $this->entityManager = $entity_manager;
    $this->database = $database;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity.manager'),
      $container->get('database')
    );
  }
}
EOT;

    $visitor = new ServiceVisitor();
    $this->traverser->addVisitor($visitor);
    
    $ast = $this->parser->parse($code);
    $this->traverser->traverse($ast);
    
    $findings = $visitor->getFindings();
    $this->assertCount(1, $findings);
    
    $this->assertEquals('service_injection', $findings[0]['type']);
    $this->assertTrue($findings[0]['container_inject']);
    $this->assertContains('entity.manager', $findings[0]['injected_services']);
    $this->assertNotEmpty($findings[0]['deprecated_services']);
  }

  /**
   * Tests Drupal 11 service changes detection.
   */
  public function testDrupal11ServiceChangesDetection() {
    $code = <<<'EOT'
<?php
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class MyService implements ContainerInjectionInterface {
  protected $entityTypeManager;
  protected $database;

  public function __construct($entity_type_manager, $database) {
    $this->entityTypeManager = $entity_type_manager;
    $this->database = $database;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_type.manager'),
      $container->get('database')
    );
  }
}
EOT;

    $visitor = new ServiceVisitor();
    $this->traverser->addVisitor($visitor);
    
    $ast = $this->parser->parse($code);
    $this->traverser->traverse($ast);
    
    $findings = $visitor->getFindings();
    $this->assertNotEmpty($findings);
    
    $this->assertNotEmpty($findings[0]['drupal11_services']);
    $found_d11_changes = false;
    foreach ($findings[0]['drupal11_services'] as $service) {
      if ($service['service'] === 'entity_type.manager') {
        $found_d11_changes = true;
        $this->assertNotEmpty($service['changes']['changes']);
        break;
      }
    }
    $this->assertTrue($found_d11_changes, 'Should detect Drupal 11 service changes');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc