RequiredStatesTest.php

Same filename and directory in other branches
  1. 9 core/modules/workflows/tests/src/Kernel/RequiredStatesTest.php
  2. 8.9.x core/modules/workflows/tests/src/Kernel/RequiredStatesTest.php
  3. 10 core/modules/workflows/tests/src/Kernel/RequiredStatesTest.php

Namespace

Drupal\Tests\workflows\Kernel

File

core/modules/workflows/tests/src/Kernel/RequiredStatesTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\workflows\Kernel;

use Drupal\KernelTests\KernelTestBase;
use Drupal\workflows\Entity\Workflow;
use Drupal\workflows\Exception\RequiredStateMissingException;

/**
 * Tests Workflow type's required states and configuration initialization.
 *
 * @coversDefaultClass \Drupal\workflows\Plugin\WorkflowTypeBase
 *
 * @group workflows
 */
class RequiredStatesTest extends KernelTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'workflows',
        'workflow_type_test',
    ];
    
    /**
     * @covers ::getRequiredStates
     * @covers ::__construct
     */
    public function testGetRequiredStates() : void {
        $workflow = Workflow::create([
            'id' => 'test',
            'label' => 'Test workflow',
            'type' => 'workflow_type_required_state_test',
        ]);
        $workflow->save();
        $this->assertEquals([
            'fresh',
            'rotten',
        ], $workflow->getTypePlugin()
            ->getRequiredStates());
        // Ensure that the workflow has the default configuration.
        $this->assertTrue($workflow->getTypePlugin()
            ->hasState('rotten'));
        $this->assertTrue($workflow->getTypePlugin()
            ->hasState('fresh'));
        $this->assertTrue($workflow->getTypePlugin()
            ->hasTransitionFromStateToState('fresh', 'rotten'));
    }
    
    /**
     * @covers \Drupal\workflows\Entity\Workflow::preSave
     */
    public function testDeleteRequiredStateAPI() : void {
        $workflow = Workflow::create([
            'id' => 'test',
            'label' => 'Test workflow',
            'type' => 'workflow_type_required_state_test',
        ]);
        $workflow->save();
        // Ensure that required states can't be deleted.
        $this->expectException(RequiredStateMissingException::class);
        $this->expectExceptionMessage("Required State Type Test' requires states with the ID 'fresh' in workflow 'test'");
        $workflow->getTypePlugin()
            ->deleteState('fresh');
        $workflow->save();
    }
    
    /**
     * @covers \Drupal\workflows\Entity\Workflow::preSave
     */
    public function testNoStatesRequiredStateAPI() : void {
        $workflow = Workflow::create([
            'id' => 'test',
            'type' => 'workflow_type_required_state_test',
            'type_settings' => [
                'states' => [],
            ],
        ]);
        $this->expectException(RequiredStateMissingException::class);
        $this->expectExceptionMessage("Required State Type Test' requires states with the ID 'fresh', 'rotten' in workflow 'test'");
        $workflow->save();
    }
    
    /**
     * Ensures that initialized configuration can be changed.
     */
    public function testChangeRequiredStateAPI() : void {
        $workflow = Workflow::create([
            'id' => 'test',
            'label' => 'Test workflow',
            'type' => 'workflow_type_required_state_test',
        ]);
        $workflow->save();
        // Ensure states added by default configuration can be changed.
        $this->assertEquals('Fresh', $workflow->getTypePlugin()
            ->getState('fresh')
            ->label());
        $workflow->getTypePlugin()
            ->setStateLabel('fresh', 'Fresher');
        $workflow->save();
        $this->assertEquals('Fresher', $workflow->getTypePlugin()
            ->getState('fresh')
            ->label());
        // Ensure transitions can be altered.
        $workflow->getTypePlugin()
            ->addState('cooked', 'Cooked')
            ->setTransitionFromStates('rot', [
            'fresh',
            'cooked',
        ]);
        $workflow->save();
        $this->assertTrue($workflow->getTypePlugin()
            ->hasTransitionFromStateToState('fresh', 'rotten'));
        $this->assertTrue($workflow->getTypePlugin()
            ->hasTransitionFromStateToState('cooked', 'rotten'));
        $workflow->getTypePlugin()
            ->setTransitionFromStates('rot', [
            'cooked',
        ]);
        $workflow->save();
        $this->assertFalse($workflow->getTypePlugin()
            ->hasTransitionFromStateToState('fresh', 'rotten'));
        $this->assertTrue($workflow->getTypePlugin()
            ->hasTransitionFromStateToState('cooked', 'rotten'));
        // Ensure the default configuration does not cause ordering issues.
        $workflow->getTypePlugin()
            ->addTransition('cook', 'Cook', [
            'fresh',
        ], 'cooked');
        $workflow->save();
        $this->assertSame([
            'cooked',
            'fresh',
            'rotten',
        ], array_keys($workflow->getTypePlugin()
            ->getConfiguration()['states']));
        $this->assertSame([
            'cook',
            'rot',
        ], array_keys($workflow->getTypePlugin()
            ->getConfiguration()['transitions']));
        // Ensure that transitions can be deleted.
        $workflow->getTypePlugin()
            ->deleteTransition('rot');
        $workflow->save();
        $this->assertFalse($workflow->getTypePlugin()
            ->hasTransition('rot'));
    }

}

Classes

Title Deprecated Summary
RequiredStatesTest Tests Workflow type's required states and configuration initialization.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.