| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- <?php namespace GO\Job\Tests;
- use GO\Job;
- use DateTime;
- use GO\FailedJob;
- use GO\Scheduler;
- use PHPUnit\Framework\TestCase;
- class SchedulerTest extends TestCase
- {
- public function testShouldQueueJobs()
- {
- $scheduler = new Scheduler();
- $this->assertEquals(count($scheduler->getQueuedJobs()), 0);
- $scheduler->raw('ls');
- $this->assertEquals(count($scheduler->getQueuedJobs()), 1);
- }
- public function testShouldQueueAPhpScript()
- {
- $scheduler = new Scheduler();
- $script = __DIR__ . '/../test_job.php';
- $this->assertEquals(count($scheduler->getQueuedJobs()), 0);
- $scheduler->php($script);
- $this->assertEquals(count($scheduler->getQueuedJobs()), 1);
- }
- public function testShouldAllowCustomPhpBin()
- {
- $scheduler = new Scheduler();
- $script = __DIR__ . '/../test_job.php';
- // Create fake bin
- $bin = __DIR__ . '/../custom_bin';
- touch($bin);
- $job = $scheduler->php($script, $bin)->inForeground();
- unlink($bin);
- $this->assertEquals($bin . ' ' . $script, $job->compile());
- }
- public function testShouldUseSystemPhpBinIfCustomBinDoesNotExist()
- {
- $scheduler = new Scheduler();
- $script = __DIR__ . '/../test_job.php';
- // Create fake bin
- $bin = '/my/custom/php/bin';
- $job = $scheduler->php($script, $bin)->inForeground();
- $this->assertNotEquals($bin . ' ' . $script, $job->compile());
- $this->assertEquals(PHP_BINARY . ' ' . $script, $job->compile());
- }
- public function testShouldThrowExceptionIfScriptIsNotAString()
- {
- $this->expectException(\InvalidArgumentException::class);
- $scheduler = new Scheduler();
- $scheduler->php(function () {
- return false;
- });
- $scheduler->run();
- }
- public function testShouldMarkJobAsFailedIfScriptPathIsInvalid()
- {
- $scheduler = new Scheduler();
- $scheduler->php('someInvalidPathToAScript');
- $scheduler->run();
- $fail = $scheduler->getFailedJobs();
- $this->assertCount(1, $fail);
- $this->assertContainsOnlyInstancesOf(FailedJob::class, $fail);
- }
- public function testShouldQueueAShellCommand()
- {
- $scheduler = new Scheduler();
- $this->assertEquals(count($scheduler->getQueuedJobs()), 0);
- $scheduler->raw('ls');
- $this->assertEquals(count($scheduler->getQueuedJobs()), 1);
- }
- public function testShouldQueueAFunction()
- {
- $scheduler = new Scheduler();
- $this->assertEquals(count($scheduler->getQueuedJobs()), 0);
- $scheduler->call(function () {
- return true;
- });
- $this->assertEquals(count($scheduler->getQueuedJobs()), 1);
- }
- public function testShouldKeepTrackOfExecutedJobs()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function () {
- return true;
- });
- $this->assertEquals(count($scheduler->getQueuedJobs()), 1);
- $this->assertEquals(count($scheduler->getExecutedJobs()), 0);
- $scheduler->run();
- $this->assertEquals(count($scheduler->getExecutedJobs()), 1);
- }
- public function testShouldPassParametersToAFunction()
- {
- $scheduler = new Scheduler();
- $outputFile = __DIR__ . '/../tmp/output.txt';
- $scheduler->call(function ($phrase) {
- return $phrase;
- }, [
- 'Hello World!',
- ])->output($outputFile);
- @unlink($outputFile);
- $this->assertFalse(file_exists($outputFile));
- $scheduler->run();
- $this->assertNotEquals('Hello', file_get_contents($outputFile));
- $this->assertEquals('Hello World!', file_get_contents($outputFile));
- @unlink($outputFile);
- }
- public function testShouldKeepTrackOfFailedJobs()
- {
- $scheduler = new Scheduler();
- $exception = new \Exception('Something failed');
- $scheduler->call(function () use ($exception) {
- throw $exception;
- });
- $this->assertEquals(count($scheduler->getFailedJobs()), 0);
- $scheduler->run();
- $this->assertEquals(count($scheduler->getExecutedJobs()), 0);
- $this->assertEquals(count($scheduler->getFailedJobs()), 1);
- $failedJob = $scheduler->getFailedJobs()[0];
- $this->assertInstanceOf(FailedJob::class, $failedJob);
- $this->assertSame($exception, $failedJob->getException());
- $this->assertInstanceOf(Job::class, $failedJob->getJob());
- }
- public function testShouldKeepExecutingJobsIfOneFails()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function () {
- throw new \Exception('Something failed');
- });
- $scheduler->call(function () {
- return true;
- });
- $scheduler->run();
- $this->assertEquals(count($scheduler->getExecutedJobs()), 1);
- $this->assertEquals(count($scheduler->getFailedJobs()), 1);
- }
- public function testShouldInjectConfigToTheJobs()
- {
- $schedulerConfig = [
- 'email' => [
- 'subject' => 'My custom subject',
- ],
- ];
- $scheduler = new Scheduler($schedulerConfig);
- $job = $scheduler->raw('ls');
- $this->assertEquals($job->getEmailConfig()['subject'], $schedulerConfig['email']['subject']);
- }
- public function testShouldPrioritizeJobConfigOverSchedulerConfig()
- {
- $schedulerConfig = [
- 'email' => [
- 'subject' => 'My custom subject',
- ],
- ];
- $scheduler = new Scheduler($schedulerConfig);
- $jobConfig = [
- 'email' => [
- 'subject' => 'My job subject',
- ],
- ];
- $job = $scheduler->raw('ls')->configure($jobConfig);
- $this->assertNotEquals($job->getEmailConfig()['subject'], $schedulerConfig['email']['subject']);
- $this->assertEquals($job->getEmailConfig()['subject'], $jobConfig['email']['subject']);
- }
- public function testShouldShowClosuresVerboseOutputAsText()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function ($phrase) {
- return $phrase;
- }, [
- 'Hello World!',
- ]);
- $scheduler->run();
- $this->assertMatchesRegularExpression('/ Executing Closure$/', $scheduler->getVerboseOutput());
- $this->assertMatchesRegularExpression('/ Executing Closure$/', $scheduler->getVerboseOutput('text'));
- }
- public function testShouldShowClosuresVerboseOutputAsHtml()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function ($phrase) {
- return $phrase;
- }, [
- 'Hello World!',
- ]);
- $scheduler->call(function () {
- return true;
- });
- $scheduler->run();
- $this->assertMatchesRegularExpression('/<br>/', $scheduler->getVerboseOutput('html'));
- }
- public function testShouldShowClosuresVerboseOutputAsArray()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function ($phrase) {
- return $phrase;
- }, [
- 'Hello World!',
- ]);
- $scheduler->call(function () {
- return true;
- });
- $scheduler->run();
- $this->assertTrue(is_array($scheduler->getVerboseOutput('array')));
- $this->assertEquals(count($scheduler->getVerboseOutput('array')), 2);
- }
- public function testShouldThrowExceptionWithInvalidOutputType()
- {
- $this->expectException(\InvalidArgumentException::class);
- $scheduler = new Scheduler();
- $scheduler->call(function ($phrase) {
- return $phrase;
- }, [
- 'Hello World!',
- ]);
- $scheduler->call(function () {
- return true;
- });
- $scheduler->run();
- $scheduler->getVerboseOutput('multiline');
- }
- public function testShouldPrioritizeJobsInBackround()
- {
- $scheduler = new Scheduler();
- $scheduler->php(__DIR__ . '/../async_job.php', null, null, 'async_foreground')->then(function () {
- return true;
- });
- $scheduler->php(__DIR__ . '/../async_job.php', null, null, 'async_background');
- $jobs = $scheduler->getQueuedJobs();
- $this->assertEquals('async_background', $jobs[0]->getId());
- $this->assertEquals('async_foreground', $jobs[1]->getId());
- }
- public function testCouldRunTwice()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function () {
- return true;
- });
- $scheduler->run();
- $this->assertCount(1, $scheduler->getExecutedJobs(), 'Number of executed jobs');
- $scheduler->resetRun();
- $scheduler->run();
- $this->assertCount(1, $scheduler->getExecutedJobs(), 'Number of executed jobs');
- }
- public function testClearJobs()
- {
- $scheduler = new Scheduler();
- $scheduler->call(function () {
- return true;
- });
- $this->assertCount(1, $scheduler->getQueuedJobs(), 'Number of queued jobs');
- $scheduler->clearJobs();
- $this->assertCount(0, $scheduler->getQueuedJobs(), 'Number of queued jobs');
- }
- public function testShouldRunDelayedJobsIfDueWhenCreated()
- {
- $scheduler = new Scheduler();
- $currentTime = date('H:i');
- $scheduler->call(function () {
- $s = (int) date('s');
- sleep(60 - $s + 1);
- })->daily($currentTime);
- $scheduler->call(function () {
- // do nothing
- })->daily($currentTime);
- $executed = $scheduler->run();
- $this->assertEquals(2, count($executed));
- }
- public function testShouldRunAtSpecificTime()
- {
- $scheduler = new Scheduler();
- $runTime = new DateTime('2017-09-13 00:00:00');
- $scheduler->call(function () {
- // do nothing
- })->daily('00:00');
- $executed = $scheduler->run($runTime);
- $this->assertEquals(1, count($executed));
- }
- }
|