reviewer-1.2.x-dev/tests/src/Kernel/TaskTest.php

tests/src/Kernel/TaskTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\reviewer\Kernel;

use Drupal\KernelTests\KernelTestBase;
use Drupal\reviewer\Reviewer\Action;
use Drupal\reviewer\Reviewer\Checklist\ChecklistInterface;
use Drupal\reviewer\Reviewer\Result\CollectionResultInterface;
use Drupal\reviewer\Reviewer\Result\IndividualResultInterface;
use Drupal\reviewer\Reviewer\Result\Result;
use Drupal\reviewer\Reviewer\Result\ResultInterface;
use Drupal\reviewer\Reviewer\Status\Status;
use Drupal\reviewer\Reviewer\Task\TaskBase;
use Drupal\reviewer_test\Plugin\reviewer\Task\TestFixableTask;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\Group;

/**
 * Test task methods.
 */
#[Group('reviewer')]
#[CoversClass(TaskBase::class)]
final class TaskTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'reviewer',
    'reviewer_test',
  ];

  private readonly ResultInterface $pass;

  private readonly ResultInterface $fixed;

  private readonly ResultInterface $ignored;

  private readonly ResultInterface $fail;

  private readonly CollectionResultInterface $collection;

  /**
   * Task constructor arguments.
   *
   * @var object[]
   */
  private readonly array $taskConstructorArguments;

  /**
   * {@inheritdoc}
   *
   * @throws \Exception
   * @throws \PHPUnit\Framework\MockObject\Exception
   */
  protected function setUp(): void {
    parent::setUp();
    $this->pass = new Result('pass', Status::Pass, 'Pass');
    $this->fixed = new Result('fixed', Status::Fixed, 'Fixed');
    $this->ignored = new Result('ignored', Status::IgnoredFailure, 'Ignored');
    $this->fail = new Result('fail', Status::Fail, 'Fail');
    $this->collection = $this->container->get('reviewer.factory.result')->createCollection('collection', [
      'pass' => $this->pass,
      'ignored' => $this->ignored,
      'fail' => $this->fail,
    ]);
    $this->taskConstructorArguments = [
      $this->container->get('entity_display.repository'),
      $this->container->get('entity_field.manager'),
      $this->container->get('entity_type.manager'),
      $this->container->get('config.factory'),
      $this->container->get('module_handler'),
      $this->container->get('reviewer.factory.result'),
      $this->container->get('reviewer.evaluator.status'),
      $this->container->get('reviewer.factory.status'),
    ];
  }

  /**
   * Test running the task.
   *
   * @throws \Exception
   */
  public function testRun(): void {
    $met_dependency = $this
      ->getMockBuilder(TaskBase::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['getModuleDependencies', 'check', 'getId', 'resultId'])
      ->getMock();
    $met_dependency->method('getModuleDependencies')->willReturn(['reviewer']);
    $met_dependency->method('check')->willReturn($this->pass);
    $met_dependency->method('getId')->willReturn('met_dependency');
    $met_dependency->method('resultId')->willReturn('met_dependency');
    $met_dependency->run(Action::Check);
    self::assertCount(1, $met_dependency->getResults()->getAll());
    self::assertSame($met_dependency->getResults()->getStatus(), Status::Pass, 'Pass');

    $unmet_dependency = $this
      ->getMockBuilder(TaskBase::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['getModuleDependencies', 'check', 'getId', 'resultId'])
      ->getMock();
    $unmet_dependency->method('getModuleDependencies')->willReturn(['does_not_exist']);
    $unmet_dependency->method('check')->willReturn($this->pass);
    $unmet_dependency->method('getId')->willReturn('unmet_dependency');
    $unmet_dependency->method('resultId')->willReturn('unmet_dependency');
    $unmet_dependency->run(Action::Check);
    self::assertCount(1, $unmet_dependency->getResults()->getAll());
    self::assertSame($unmet_dependency->getResults()->getStatus(), Status::NotRun);

    $pass = $this
      ->getMockBuilder(TaskBase::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'getId', 'resultId', 'getModuleDependencies'])
      ->getMock();
    $pass->method('check')->willReturn($this->pass);
    $pass->method('getId')->willReturn('pass');
    $pass->method('resultId')->willReturn('pass');
    $pass->method('getModuleDependencies')->willReturn([]);
    $pass->run(Action::Check);
    self::assertSame($pass->getResults()->getId(), 'pass');
    self::assertCount(1, $pass->getResults()->getAll());
    self::assertSame($pass->getResults()->getStatus(), Status::Pass);

    $collection = $this
      ->getMockBuilder(TaskBase::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'getId', 'resultId', 'getModuleDependencies'])
      ->getMock();
    $collection->method('check')->willReturn($this->collection);
    $collection->method('getId')->willReturn('collection');
    $collection->method('resultId')->willReturn('collection');
    $collection->method('getModuleDependencies')->willReturn([]);
    $collection->run(Action::Check);
    self::assertSame($collection->getResults()->getId(), 'collection');
    self::assertCount(3, $collection->getResults()->getAll());
    self::assertSame($collection->getResults()->getStatus(), Status::Fail);

    $error = $this
      ->getMockBuilder(TaskBase::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'getId', 'resultId', 'getModuleDependencies'])
      ->getMock();
    $error->method('check')->willThrowException(new \Exception('Error'));
    $error->method('getId')->willReturn('error');
    $error->method('resultId')->willReturn('error');
    $error->method('getModuleDependencies')->willReturn([]);
    $error->run(Action::Check);
    self::assertSame($error->getResults()->getId(), 'error');
    self::assertCount(1, $error->getResults()->getAll());
    self::assertSame($error->getResults()->getStatus(), Status::Error);
    $error_result = $error->getResults()->get('error');
    self::assertInstanceOf(IndividualResultInterface::class, $error_result);
    self::assertSame('Error', $error_result->getMessage());

    $fixed = $this
      ->getMockBuilder(TestFixableTask::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'fix', 'getId', 'resultId', 'getModuleDependencies'])
      ->getMock();
    $fixed->method('check')->willReturn($this->fail);
    $fixed->method('fix')->willReturn($this->fixed);
    $fixed->method('getId')->willReturn('fixed');
    $fixed->method('resultId')->willReturn('fixed');
    $fixed->method('getModuleDependencies')->willReturn([]);
    $fixed->run(Action::Fix);
    self::assertSame($fixed->getResults()->getId(), 'fixed');
    self::assertCount(1, $pass->getResults()->getAll());
    self::assertSame($fixed->getResults()->getStatus(), Status::Fixed);

    $pass_fix = $this
      ->getMockBuilder(TestFixableTask::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'fix', 'getId', 'resultId', 'getModuleDependencies'])
      ->getMock();
    $pass_fix->method('check')->willReturn($this->pass);
    $pass_fix->method('fix')->willReturn($this->fixed);
    $pass_fix->method('getId')->willReturn('fixed');
    $pass_fix->method('resultId')->willReturn('fixed');
    $pass_fix->method('getModuleDependencies')->willReturn([]);
    $pass_fix->run(Action::Fix);
    self::assertCount(1, $pass_fix->getResults()->getAll());
    self::assertSame($pass_fix->getResults()->getStatus(), Status::Pass);

    $ignored_fix = $this
      ->getMockBuilder(TestFixableTask::class)
      ->enableOriginalConstructor()
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'fix', 'getId', 'resultId', 'getModuleDependencies'])
      ->getMock();
    $ignored_fix->method('check')->willReturn($this->ignored);
    $ignored_fix->method('fix')->willReturn($this->fixed);
    $ignored_fix->method('getId')->willReturn('fixed');
    $ignored_fix->method('resultId')->willReturn('fixed');
    $ignored_fix->method('getModuleDependencies')->willReturn([]);
    $ignored_fix->run(Action::Fix);
    self::assertCount(1, $ignored_fix->getResults()->getAll());
    self::assertSame($ignored_fix->getResults()->getStatus(), Status::IgnoredFailure);
  }

  /**
   * Test that the task ID is generated correctly.
   *
   * @throws \PHPUnit\Framework\MockObject\Exception
   * @throws \ReflectionException
   */
  public function testGetId(): void {
    $checklist = $this->createMock(ChecklistInterface::class);
    $checklist->method('getId')->willReturn('checklist');
    $task = $this
      ->getMockBuilder(TaskBase::class)
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'getAttributeId'])
      ->getMock();
    $task->method('check')->willReturn($this->createMock(ResultInterface::class));
    $task->method('getAttributeId')->willReturn('task');
    $reflection = (new \ReflectionClass($task))->getParentClass();
    if ($reflection) {
      $reflection->getProperty('checklist')->setValue($task, $checklist);
    }

    self::assertSame('checklist.task', $task->getId());
  }

  /**
   * Test result ID generation.
   *
   * @throws \PHPUnit\Framework\MockObject\Exception
   * @throws \ReflectionException
   */
  public function testResultId(): void {
    $task = $this
      ->getMockBuilder(TaskBase::class)
      ->setConstructorArgs($this->taskConstructorArguments)
      ->onlyMethods(['check', 'getAttributeId'])
      ->getMock();
    $task->method('check')->willReturn($this->createMock(ResultInterface::class));
    $task->method('getAttributeId')->willReturn('task');
    $checklist = $this->createMock(ChecklistInterface::class);
    $checklist->method('getId')->willReturn('checklist');
    $reflection = (new \ReflectionClass($task))->getParentClass();
    if ($reflection) {
      $reflection->getProperty('checklist')->setValue($task, $checklist);
    }

    self::assertSame('checklist.task', $task->resultId());
    self::assertSame('checklist.task.variant', $task->resultId('variant'));
  }

}

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

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