View source
<?php
namespace Drupal\Tests\system\Functional\Batch;
use Drupal\Core\Url;
use Drupal\Tests\BrowserTestBase;
class ProcessingTest extends BrowserTestBase {
protected static $modules = [
'batch_test',
'test_page_test',
];
protected $defaultTheme = 'classy';
public function testBatchNoForm() {
$this
->drupalGet('batch-test/no-form');
$this
->assertBatchMessages($this
->_resultMessages('batch_1'), 'Batch for step 2 performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_1'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
}
public function testBatchRedirectFinishedCallback() {
$this
->drupalGet('batch-test/finish-redirect');
$this
->assertBatchMessages($this
->_resultMessages('batch_1'), 'Batch for step 2 performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_1'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Test page text.');
$this
->assertSession()
->addressEquals(Url::fromRoute('test_page_test.test_page'));
}
public function testBatchForm() {
$edit = [
'batch' => 'batch_0',
];
$this
->drupalGet('batch-test');
$this
->submitForm($edit, 'Submit');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertBatchMessages($this
->_resultMessages('batch_0'), 'Batch with no operation performed successfully.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
$edit = [
'batch' => 'batch_1',
];
$this
->drupalGet('batch-test');
$this
->submitForm($edit, 'Submit');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertBatchMessages($this
->_resultMessages('batch_1'), 'Batch with simple operations performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_1'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
$edit = [
'batch' => 'batch_2',
];
$this
->drupalGet('batch-test');
$this
->submitForm($edit, 'Submit');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertBatchMessages($this
->_resultMessages('batch_2'), 'Batch with multistep operation performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_2'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
$edit = [
'batch' => 'batch_3',
];
$this
->drupalGet('batch-test');
$this
->submitForm($edit, 'Submit');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertBatchMessages($this
->_resultMessages('batch_3'), 'Batch with simple and multistep operations performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_3'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
$edit = [
'batch' => 'batch_4',
];
$this
->drupalGet('batch-test');
$this
->submitForm($edit, 'Submit');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertBatchMessages($this
->_resultMessages('batch_4'), 'Nested batch performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_4'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
$edit = [
'batch' => [
'batch_4',
'batch_7',
],
];
$this
->drupalGet('batch-test');
$this
->submitForm($edit, 'Submit');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertSession()
->responseContains('Redirection successful.');
$this
->assertBatchMessages($this
->_resultMessages('batch_4'), 'Nested batch performed successfully.');
$this
->assertBatchMessages($this
->_resultMessages('batch_7'), 'Nested batch performed successfully.');
$expected_stack = array_merge($this
->_resultStack('batch_4'), $this
->_resultStack('batch_7'));
$this
->assertEquals($expected_stack, batch_test_stack(), 'Execution order was correct.');
$batch = \Drupal::state()
->get('batch_test_nested_order_multiple_batches');
$this
->assertCount(5, $batch['sets']);
foreach ($batch['sets'] as $index => $batch_set) {
$this
->assertEquals('drupal_batch:' . $batch['id'] . ':' . $index, $batch_set['queue']['name']);
}
$batch_sets = array_values($batch['sets']);
$this
->assertEquals('batch_4', $batch_sets[0]['batch_test_id']);
$this
->assertEquals('batch_2', $batch_sets[1]['batch_test_id']);
$this
->assertEquals('batch_7', $batch_sets[2]['batch_test_id']);
$this
->assertEquals('batch_6', $batch_sets[3]['batch_test_id']);
$this
->assertEquals('batch_5', $batch_sets[4]['batch_test_id']);
}
public function testBatchFormMultistep() {
$this
->drupalGet('batch-test/multistep');
$this
->assertSession()
->assertNoEscaped('<');
$this
->assertSession()
->pageTextContains('step 1');
$this
->submitForm([], 'Submit');
$this
->assertBatchMessages($this
->_resultMessages('batch_1'), 'Batch for step 1 performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_1'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('step 2');
$this
->assertSession()
->assertNoEscaped('<');
$this
->submitForm([], 'Submit');
$this
->assertBatchMessages($this
->_resultMessages('batch_2'), 'Batch for step 2 performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_2'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
$this
->assertSession()
->assertNoEscaped('<');
$this
->drupalGet('batch-test/multistep', [
'query' => [
'big_tree' => 'small_axe',
],
]);
$this
->submitForm([], 'Submit');
$this
->assertSession()
->pageTextContains('step 2');
$this
->assertStringContainsString('batch-test/multistep?big_tree=small_axe', $this
->getUrl(), 'Query argument was persisted and another extra argument was added.');
}
public function testBatchFormMultipleBatches() {
$value = rand(0, 255);
$edit = [
'value' => $value,
];
$this
->drupalGet('batch-test/chained');
$this
->submitForm($edit, 'Submit');
$this
->assertBatchMessages($this
->_resultMessages('chained'), 'Batches defined in separate submit handlers performed successfully.');
$this
->assertEquals($this
->_resultStack('chained', $value), batch_test_stack(), 'Execution order was correct, and $form_state is correctly persisted.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
}
public function testBatchFormProgrammatic() {
$value = rand(0, 255);
$this
->drupalGet('batch-test/programmatic/' . $value);
$this
->assertBatchMessages($this
->_resultMessages('chained'), 'Batches defined in separate submit handlers performed successfully.');
$this
->assertEquals($this
->_resultStack('chained', $value), batch_test_stack(), 'Execution order was correct, and $form_state is correctly persisted.');
$this
->assertSession()
->pageTextContains('Got out of a programmatic batched form.');
}
public function testDrupalFormSubmitInBatch() {
$value = rand(0, 255);
$this
->drupalGet('batch-test/nested-programmatic/' . $value);
$this
->assertEquals([
'mock form submitted with value = ' . $value,
], batch_test_stack(), '\\Drupal::formBuilder()->submitForm() ran successfully within a batch operation.');
}
public function testBatchLargePercentage() {
$this
->drupalGet('batch-test/large-percentage');
$this
->assertBatchMessages($this
->_resultMessages('batch_5'), 'Batch for step 2 performed successfully.');
$this
->assertEquals($this
->_resultStack('batch_5'), batch_test_stack(), 'Execution order was correct.');
$this
->assertSession()
->pageTextContains('Redirection successful.');
}
public function assertBatchMessages($texts, $message) {
$pattern = '|' . implode('.*', $texts) . '|s';
return $this
->assertSession()
->responseMatches($pattern);
}
public function _resultStack($id, $value = 0) {
$stack = [];
switch ($id) {
case 'batch_1':
for ($i = 1; $i <= 10; $i++) {
$stack[] = "op 1 id {$i}";
}
break;
case 'batch_2':
for ($i = 1; $i <= 10; $i++) {
$stack[] = "op 2 id {$i}";
}
break;
case 'batch_3':
for ($i = 1; $i <= 5; $i++) {
$stack[] = "op 1 id {$i}";
}
for ($i = 1; $i <= 5; $i++) {
$stack[] = "op 2 id {$i}";
}
for ($i = 6; $i <= 10; $i++) {
$stack[] = "op 1 id {$i}";
}
for ($i = 6; $i <= 10; $i++) {
$stack[] = "op 2 id {$i}";
}
break;
case 'batch_4':
for ($i = 1; $i <= 5; $i++) {
$stack[] = "op 1 id {$i}";
}
$stack[] = 'setting up batch 2';
for ($i = 6; $i <= 10; $i++) {
$stack[] = "op 1 id {$i}";
}
$stack = array_merge($stack, $this
->_resultStack('batch_2'));
break;
case 'batch_5':
for ($i = 1; $i <= 10; $i++) {
$stack[] = "op 5 id {$i}";
}
break;
case 'batch_6':
for ($i = 1; $i <= 10; $i++) {
$stack[] = "op 6 id {$i}";
}
break;
case 'batch_7':
for ($i = 1; $i <= 5; $i++) {
$stack[] = "op 7 id {$i}";
}
$stack[] = 'setting up batch 6';
$stack[] = 'setting up batch 5';
for ($i = 6; $i <= 10; $i++) {
$stack[] = "op 7 id {$i}";
}
$stack = array_merge($stack, $this
->_resultStack('batch_6'));
$stack = array_merge($stack, $this
->_resultStack('batch_5'));
break;
case 'chained':
$stack[] = 'submit handler 1';
$stack[] = 'value = ' . $value;
$stack = array_merge($stack, $this
->_resultStack('batch_1'));
$stack[] = 'submit handler 2';
$stack[] = 'value = ' . ($value + 1);
$stack = array_merge($stack, $this
->_resultStack('batch_2'));
$stack[] = 'submit handler 3';
$stack[] = 'value = ' . ($value + 2);
$stack[] = 'submit handler 4';
$stack[] = 'value = ' . ($value + 3);
$stack = array_merge($stack, $this
->_resultStack('batch_3'));
break;
}
return $stack;
}
public function _resultMessages($id) {
$messages = [];
$pattern_elapsed = ' \\((\\d+ mins? )?\\d+ secs?\\)';
switch ($id) {
case 'batch_0':
$messages[] = 'results for batch 0' . $pattern_elapsed . '<div class="item-list"><ul><li>none</li></ul></div>';
break;
case 'batch_1':
$messages[] = 'results for batch 1' . $pattern_elapsed . '<div class="item-list"><ul><li>op 1: processed 10 elements</li></ul></div>';
break;
case 'batch_2':
$messages[] = 'results for batch 2' . $pattern_elapsed . '<div class="item-list"><ul><li>op 2: processed 10 elements</li></ul></div>';
break;
case 'batch_3':
$messages[] = 'results for batch 3' . $pattern_elapsed . '<div class="item-list"><ul><li>op 1: processed 10 elements</li><li>op 2: processed 10 elements</li></ul></div>';
break;
case 'batch_4':
$messages[] = 'results for batch 4' . $pattern_elapsed . '<div class="item-list"><ul><li>op 1: processed 10 elements</li></ul></div>';
$messages = array_merge($messages, $this
->_resultMessages('batch_2'));
break;
case 'batch_5':
$messages[] = 'results for batch 5' . $pattern_elapsed . '<div class="item-list"><ul><li>op 5: processed 10 elements</li></ul></div>';
break;
case 'batch_6':
$messages[] = 'results for batch 6' . $pattern_elapsed . '<div class="item-list"><ul><li>op 6: processed 10 elements</li></ul></div>';
break;
case 'batch_7':
$messages[] = 'results for batch 7' . $pattern_elapsed . '<div class="item-list"><ul><li>op 7: processed 10 elements</li></ul></div>';
$messages = array_merge($messages, $this
->_resultMessages('batch_6'));
$messages = array_merge($messages, $this
->_resultMessages('batch_5'));
break;
case 'chained':
$messages = array_merge($messages, $this
->_resultMessages('batch_1'));
$messages = array_merge($messages, $this
->_resultMessages('batch_2'));
$messages = array_merge($messages, $this
->_resultMessages('batch_3'));
break;
}
return $messages;
}
}