View source
<?php
namespace Drupal\Tests\ultimate_cron\Functional;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\Traits\Core\CronRunTrait;
use Drupal\ultimate_cron\Entity\CronJob;
class CronJobFormTest extends BrowserTestBase {
use CronRunTrait;
public static $modules = array(
'ultimate_cron',
'block',
'cron_queue_test',
);
protected $adminUser;
protected $jobName;
protected $jobId = 'system_cron';
protected $defaultTheme = 'classy';
public function testManageJob() {
$this
->drupalPlaceBlock('local_tasks_block');
$this
->drupalPlaceBlock('local_actions_block');
$this->adminUser = $this
->drupalCreateUser(array(
'administer ultimate cron',
'administer site configuration',
));
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertResponse('200');
$this
->assertText('Every 15 min');
$this
->assertText('Never');
$this
->drupalGet('admin/config/system/cron/jobs/manage/' . $this->jobId);
$this
->assertResponse('200');
$job = CronJob::load($this->jobId);
$old_job_name = $job
->label();
$this->jobName = 'edited job name';
$edit = array(
'title' => $this->jobName,
);
$this
->drupalPostForm(NULL, $edit, t('Save'));
$this
->assertText('Never');
$this
->assertText(t('job @name has been updated.', array(
'@name' => $this->jobName,
)));
$this
->cronRun();
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertText(\Drupal::service('date.formatter')
->format(\Drupal::state()
->get('system.cron_last'), 'short'), 'Created Cron jobs have been run.');
$this
->assertNoText("Never");
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertNoText($old_job_name);
$this
->assertText($this->jobName);
$this
->clickLink(t('Edit'));
$this
->drupalPostForm(NULL, [
'scheduler[configuration][rules][0]' => '0+@ */6 * * *',
], t('Save'));
$this
->assertText('Every 6 hours');
$this
->clickLink(t('Disable'), 0);
$this
->assertText('This cron job will no longer be executed.');
$this
->drupalPostForm(NULL, NULL, t('Disable'));
$this
->assertText(t('Disabled cron job @name.', array(
'@name' => $this->jobName,
)));
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[6]', 'Disabled');
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li[1]/a', 'Enable');
$this
->assertNoFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li[1]/a', 'Run');
$this
->clickLink(t('Enable'), 0);
$this
->assertText('This cron job will be executed again.');
$this
->drupalPostForm(NULL, NULL, t('Enable'));
$this
->assertText(t('Enabled cron job @name.', array(
'@name' => $this->jobName,
)));
$this
->drupalGet('admin/config/system/cron/jobs');
$expected_checkmark_image_url = file_url_transform_relative(file_create_url('core/misc/icons/73b355/check.svg'));
$this
->assertEquals($expected_checkmark_image_url, $this
->xpath('//table/tbody/tr[1]/td[6]/img')[0]
->getAttribute('src'));
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li[1]/a', 'Run');
$edit = array(
'status' => FALSE,
);
$this
->drupalPostForm('admin/config/system/cron/jobs/manage/' . $this->jobId, $edit, t('Save'));
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[6]', 'Disabled');
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li[1]/a', 'Enable');
$this
->assertNoFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li[1]/a', 'Run');
$edit = array(
'status' => TRUE,
);
$this
->drupalPostForm('admin/config/system/cron/jobs/manage/' . $this->jobId, $edit, t('Save'));
$this
->assertEquals($expected_checkmark_image_url, $this
->xpath('//table/tbody/tr[1]/td[6]/img')[0]
->getAttribute('src'));
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li[1]/a', 'Run');
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->clickLink(t('Edit'), 0);
$job_configuration = array(
'scheduler[id]' => 'crontab',
);
$this
->drupalPostForm(NULL, $job_configuration, t('Save'));
$this
->drupalPostForm('admin/config/system/cron/jobs/manage/' . $this->jobId, [
'scheduler[configuration][rules][0]' => '0+@ * * * *',
], t('Save'));
$this
->assertText('0+@ * * * *');
$this
->clickLink('Edit');
$this
->drupalPostForm(NULL, [
'scheduler[configuration][rules][0]' => '*//15+@ *-2 * * *',
], t('Save'));
$this
->assertText('Rule is invalid');
$this
->assertTitle('Edit job | Drupal');
$this
->assertNoLink('Delete');
$job = CronJob::load($this->jobId);
$job
->setCallback('non_existing_function')
->save();
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[6]', 'Missing');
$this
->assertFieldByXPath('//table/tbody/tr[1]/td[8]/div/div/ul/li/a', 'Delete');
$this
->clickLink(t('Delete'), 0);
$this
->drupalPostForm(NULL, NULL, t('Delete'));
$this
->assertText(t('The cron job @name has been deleted.', array(
'@name' => $job
->label(),
)));
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertNoText($job
->label());
$job = CronJob::load('ultimate_cron_cron');
$log_entries = $job
->getLogEntries();
$log_entry = reset($log_entries);
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->clickLink('Logs');
$xpath = $this
->xpath('//tbody/tr[@class="odd"]/td');
$start_time = \Drupal::service('date.formatter')
->format($log_entry->start_time, 'custom', 'Y-m-d H:i:s');
$end_time = \Drupal::service('date.formatter')
->format($log_entry->end_time, 'custom', 'Y-m-d H:i:s');
$this
->assertEqual($xpath[1]
->getText(), $start_time);
$this
->assertEqual($xpath[2]
->getText(), $end_time);
$this
->assertEqual($xpath[3]
->getText(), $log_entry->message ?: $log_entry
->formatInitMessage());
$this
->assertEqual($xpath[4]
->getText(), '00:00');
$this
->config('ultimate_cron.settings')
->set('queue.enabled', TRUE)
->save();
\Drupal::service('ultimate_cron.discovery')
->discoverCronJobs();
$this
->drupalGet('admin/config/system/cron/jobs');
$this
->assertText('Queue: Broken queue test');
$this
->drupalGet('admin/config/system/cron/jobs/manage/ultimate_cron_queue_cron_queue_test_broken_queue');
$this
->assertFieldByName('title', 'Queue: Broken queue test');
$this
->drupalPostForm(NULL, [], 'Save');
$this
->assertText('job Queue: Broken queue test has been updated.');
}
}