From faa8545fcf8aa1104b0eb5828b5d2ae667fa3bd5 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 15 Jun 2021 18:48:42 +0300 Subject: [PATCH] fixes and tests --- application/Espo/Core/Job/JobScheduler.php | 20 ++- tests/unit/Espo/Core/Job/JobSchedulerTest.php | 167 ++++++++++++++++++ tests/unit/testClasses/Core/Job/TestJob.php | 38 ++++ 3 files changed, 218 insertions(+), 7 deletions(-) create mode 100644 tests/unit/Espo/Core/Job/JobSchedulerTest.php create mode 100644 tests/unit/testClasses/Core/Job/TestJob.php diff --git a/application/Espo/Core/Job/JobScheduler.php b/application/Espo/Core/Job/JobScheduler.php index e4158c8acb..b100eab370 100644 --- a/application/Espo/Core/Job/JobScheduler.php +++ b/application/Espo/Core/Job/JobScheduler.php @@ -126,10 +126,10 @@ class JobScheduler */ public function setTime(?DateTimeInterface $time): self { - $this->time = null; + $this->time = $time; - if (!is_null($time)) { - $this->time = DateTimeImmutable::createFromInterface($time); + if (!is_null($time) && !$time instanceof DateTimeImmutable) { + $this->time = DateTimeImmutable::createFromMutable($time); } return $this; @@ -171,7 +171,7 @@ class JobScheduler throw new RuntimeException("Class name is not set."); } - if ($this->group && $this->queue !== null) { + if ($this->group && $this->queue === null) { throw new RuntimeException("A group can't be set w/o queue."); } @@ -181,13 +181,19 @@ class JobScheduler $time = $time->add($this->delay); } + $data = $this->data; + + if (!$data) { + $data = JobData::create(); + } + return $this->entityManager->createEntity(JobEntity::ENTITY_TYPE, [ 'className' => $this->className, 'queue' => $this->queue, 'group' => $this->group, - 'targetType' => $this->data->getTargetType(), - 'targetId' => $this->data->getTargetId(), - 'data' => $this->data->getRaw(), + 'targetType' => $data->getTargetType(), + 'targetId' => $data->getTargetId(), + 'data' => $data->getRaw(), 'executeTime' => $time->format(DateTime::SYSTEM_DATE_TIME_FORMAT), ]); } diff --git a/tests/unit/Espo/Core/Job/JobSchedulerTest.php b/tests/unit/Espo/Core/Job/JobSchedulerTest.php new file mode 100644 index 0000000000..481bf32e19 --- /dev/null +++ b/tests/unit/Espo/Core/Job/JobSchedulerTest.php @@ -0,0 +1,167 @@ +entityManager = $this->createMock(EntityManager::class); + } + + public function testSchedule1(): void + { + $scheduler = new JobScheduler($this->entityManager); + + $jobEntity = $this->createMock(JobEntity::class); + + $time = new DateTimeImmutable(); + + $delay = DateInterval::createFromDateString('1 minute'); + + $this->entityManager + ->expects($this->once()) + ->method('createEntity') + ->with( + JobEntity::ENTITY_TYPE, + [ + 'className' => TestJob::class, + 'queue' => QueueName::Q0, + 'group' => 'test-group', + 'data' => (object) [ + 'test' => '1', + ], + 'executeTime' => $time->modify('+1 minute')->format(DateTime::SYSTEM_DATE_TIME_FORMAT), + 'targetId' => null, + 'targetType' => null, + ] + ) + ->willReturn($jobEntity); + + $jobEntityReturned = $scheduler + ->setClassName(TestJob::class) + ->setQueue(QueueName::Q0) + ->setGroup('test-group') + ->setData([ + 'test' => '1', + ]) + ->setTime($time) + ->setDelay($delay) + ->schedule(); + + $this->assertSame($jobEntityReturned, $jobEntity); + } + + public function testSchedule2(): void + { + $scheduler = new JobScheduler($this->entityManager); + + $jobEntity = $this->createMock(JobEntity::class); + + $time = new DateTimeImmutable(); + + $this->entityManager + ->expects($this->once()) + ->method('createEntity') + ->with( + JobEntity::ENTITY_TYPE, + [ + 'className' => TestJob::class, + 'queue' => null, + 'group' => null, + 'data' => (object) [ + 'test' => '1', + ], + 'executeTime' => $time->format(DateTime::SYSTEM_DATE_TIME_FORMAT), + 'targetId' => 'test-id', + 'targetType' => 'TestType', + ] + ) + ->willReturn($jobEntity); + + $data = JobData + ::create([ + 'test' => '1', + ]) + ->withTargetId('test-id') + ->withTargetType('TestType'); + + $jobEntityReturned = $scheduler + ->setClassName(TestJob::class) + ->setData($data) + ->setTime($time) + ->schedule(); + + $this->assertSame($jobEntityReturned, $jobEntity); + } + + public function testSchedule3(): void + { + $scheduler = new JobScheduler($this->entityManager); + + $jobEntity = $this->createMock(JobEntity::class); + + $this->entityManager + ->expects($this->once()) + ->method('createEntity') + ->with( + JobEntity::ENTITY_TYPE, + $this->callback( + function (array $data): bool { + return is_string($data['executeTime']); + } + ) + ) + ->willReturn($jobEntity); + + + $jobEntityReturned = $scheduler + ->setClassName(TestJob::class) + ->schedule(); + + $this->assertSame($jobEntityReturned, $jobEntity); + } +} diff --git a/tests/unit/testClasses/Core/Job/TestJob.php b/tests/unit/testClasses/Core/Job/TestJob.php new file mode 100644 index 0000000000..be5b693803 --- /dev/null +++ b/tests/unit/testClasses/Core/Job/TestJob.php @@ -0,0 +1,38 @@ +