function DevelStateEditorTest::testStateEdit

Same name and namespace in other branches
  1. 4.x tests/src/Functional/DevelStateEditorTest.php \Drupal\Tests\devel\Functional\DevelStateEditorTest::testStateEdit()

Tests state edit.

File

tests/src/Functional/DevelStateEditorTest.php, line 101

Class

DevelStateEditorTest
Tests devel state editor.

Namespace

Drupal\Tests\devel\Functional

Code

public function testStateEdit() : void {
    // Create some state variables for the test.
    $this->state
        ->set('devel.simple', 0);
    $this->state
        ->set('devel.array', [
        'devel' => 'value',
    ]);
    $this->state
        ->set('devel.object', $this->randomObject());
    // Ensure that state edit form is accessible only by users with the
    // adequate permissions.
    $this->drupalLogin($this->develUser);
    $this->drupalGet('devel/state/edit/devel.simple');
    $this->assertSession()
        ->statusCodeEquals(403);
    $this->drupalLogin($this->adminUser);
    // Ensure that accessing an un-existent state variable cause a warning
    // message.
    $this->drupalGet('devel/state/edit/devel.unknown');
    $this->assertSession()
        ->pageTextContains(strtr('State @name does not exist in the system.', [
        '@name' => 'devel.unknown',
    ]));
    // Ensure that state variables that contain simple type can be edited and
    // saved.
    $this->drupalGet('devel/state/edit/devel.simple');
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertSession()
        ->pageTextContains(strtr('Edit state variable: @name', [
        '@name' => 'devel.simple',
    ]));
    $input = $this->assertSession()
        ->fieldExists('edit-new-value');
    $this->assertFalse($input->hasAttribute('disabled'));
    $button = $this->assertSession()
        ->buttonExists('edit-submit');
    $this->assertFalse($button->hasAttribute('disabled'));
    $edit = [
        'new_value' => 1,
    ];
    $this->submitForm($edit, 'Save');
    $this->assertSession()
        ->pageTextContains(strtr('Variable @name was successfully edited.', [
        '@name' => 'devel.simple',
    ]));
    $this->assertEquals(1, $this->state
        ->get('devel.simple'));
    // Ensure that state variables that contain array can be edited and saved
    // and the new value is properly validated.
    $this->drupalGet('devel/state/edit/devel.array');
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertSession()
        ->pageTextContains(strtr('Edit state variable: @name', [
        '@name' => 'devel.array',
    ]));
    $input = $this->assertSession()
        ->fieldExists('edit-new-value');
    $this->assertFalse($input->hasAttribute('disabled'));
    $button = $this->assertSession()
        ->buttonExists('edit-submit');
    $this->assertFalse($button->hasAttribute('disabled'));
    // Try to save an invalid yaml input.
    $edit = [
        'new_value' => 'devel: \'value updated',
    ];
    $this->submitForm($edit, 'Save');
    $this->assertSession()
        ->pageTextContains('Invalid input:');
    $edit = [
        'new_value' => 'devel: \'value updated\'',
    ];
    $this->submitForm($edit, 'Save');
    $this->assertSession()
        ->pageTextContains(strtr('Variable @name was successfully edited.', [
        '@name' => 'devel.array',
    ]));
    $this->assertEquals([
        'devel' => 'value updated',
    ], $this->state
        ->get('devel.array'));
    // Ensure that state variables that contain objects cannot be edited.
    $this->drupalGet('devel/state/edit/devel.object');
    $this->assertSession()
        ->statusCodeEquals(200);
    $this->assertSession()
        ->pageTextContains(strtr('Edit state variable: @name', [
        '@name' => 'devel.object',
    ]));
    $this->assertSession()
        ->pageTextContains(strtr('Only simple structures are allowed to be edited. State @name contains objects.', [
        '@name' => 'devel.object',
    ]));
    $this->assertSession()
        ->fieldDisabled('edit-new-value');
    $button = $this->assertSession()
        ->buttonExists('edit-submit');
    $this->assertTrue($button->hasAttribute('disabled'));
    // Ensure that the cancel link works as expected.
    $this->clickLink('Cancel');
    $this->assertSession()
        ->addressEquals('devel/state');
}