Skip to content

Commit 6542213

Browse files
fixed query to find pending executions
1 parent b6fd363 commit 6542213

File tree

2 files changed

+228
-10
lines changed

2 files changed

+228
-10
lines changed

src/Entity/TaskExecutionRepository.php

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -129,18 +129,15 @@ public function findByTaskUuid($taskUuid)
129129
/**
130130
* {@inheritdoc}
131131
*/
132-
public function findScheduled(\DateTime $dateTime = null)
132+
public function findScheduled()
133133
{
134-
if ($dateTime === null) {
135-
$dateTime = new \DateTime();
136-
}
137-
138-
return $this->createQueryBuilder('e')
134+
$query = $this->createQueryBuilder('e')
139135
->innerJoin('e.task', 't')
140-
->where('e.status = :status AND e.scheduleTime < :dateTime')
136+
->where('e.status = :status')
137+
->andWhere('e.scheduleTime < CURRENT_TIMESTAMP()')
141138
->setParameter('status', TaskStatus::PLANNED)
142-
->setParameter('dateTime', $dateTime)
143-
->getQuery()
144-
->getResult();
139+
->getQuery();
140+
141+
return $query->getResult();
145142
}
146143
}
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
<?php
2+
3+
namespace Task\TaskBundle\Tests\Functional\Command;
4+
5+
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
6+
use Doctrine\Common\DataFixtures\ProxyReferenceRepository;
7+
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
8+
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
9+
use Task\Storage\TaskExecutionRepositoryInterface;
10+
use Task\TaskBundle\Entity\Task;
11+
use Task\TaskBundle\Entity\TaskExecution;
12+
use Task\TaskBundle\Tests\Functional\TestHandler;
13+
use Task\TaskStatus;
14+
15+
/**
16+
* Tests for TaskExecutionRepository.
17+
*/
18+
class TaskExecutionRepositoryTest extends KernelTestCase
19+
{
20+
/**
21+
* @var TaskExecutionRepositoryInterface
22+
*/
23+
protected $taskExecutionRepository;
24+
25+
/**
26+
* @var TaskExecutionRepositoryInterface
27+
*/
28+
protected $taskRepository;
29+
30+
public function setUp()
31+
{
32+
self::bootKernel();
33+
34+
$this->purgeDatabase();
35+
36+
$this->taskExecutionRepository = self::$kernel->getContainer()->get('task.storage.task_execution');
37+
$this->taskRepository = self::$kernel->getContainer()->get('task.storage.task');
38+
}
39+
40+
public function testSave(Task $task = null, \DateTime $scheduleTime = null, $status = TaskStatus::PLANNED)
41+
{
42+
if (!$scheduleTime) {
43+
$scheduleTime = new \DateTime();
44+
}
45+
46+
if (!$task) {
47+
$task = $this->createTask();
48+
$this->taskRepository->save($task);
49+
}
50+
51+
$execution = $this->createTaskExecution($task, $scheduleTime, $status);
52+
$this->taskExecutionRepository->save($execution);
53+
54+
$result = $this->taskExecutionRepository->findByUuid($execution->getUuid());
55+
56+
$this->assertEquals($execution->getUuid(), $result->getUuid());
57+
$this->assertEquals($scheduleTime, $result->getScheduleTime());
58+
$this->assertEquals($status, $result->getStatus());
59+
$this->assertEquals($task->getUuid(), $result->getTask()->getUuid());
60+
61+
return $execution;
62+
}
63+
64+
public function testRemove()
65+
{
66+
$execution = $this->testSave();
67+
68+
$this->taskExecutionRepository->remove($execution);
69+
70+
$this->assertNull($this->taskExecutionRepository->findByUuid($execution->getUuid()));
71+
}
72+
73+
public function testFindAll()
74+
{
75+
$task = $this->createTask();
76+
$this->taskRepository->save($task);
77+
78+
$executions = [];
79+
for ($i = 0; $i < 3; ++$i) {
80+
$execution = $this->testSave($task);
81+
$executions[$execution->getUuid()] = $execution;
82+
}
83+
84+
$result = $this->taskExecutionRepository->findAll();
85+
86+
$this->assertCount(3, $result);
87+
foreach ($result as $item) {
88+
$this->assertArrayHasKey($item->getUuid(), $executions);
89+
unset($executions[$item->getUuid()]);
90+
}
91+
}
92+
93+
public function testFindAllPaginated()
94+
{
95+
$task = $this->createTask();
96+
$this->taskRepository->save($task);
97+
98+
$executions = [];
99+
for ($i = 0; $i < 3; ++$i) {
100+
$execution = $this->testSave($task);
101+
$executions[$execution->getUuid()] = $execution;
102+
}
103+
104+
$result = $this->taskExecutionRepository->findAll(1, 2);
105+
106+
$this->assertCount(2, $result);
107+
foreach ($result as $item) {
108+
$this->assertArrayHasKey($item->getUuid(), $executions);
109+
unset($executions[$item->getUuid()]);
110+
}
111+
112+
$result = $this->taskExecutionRepository->findAll(2, 2);
113+
114+
$this->assertCount(1, $result);
115+
foreach ($result as $item) {
116+
$this->assertArrayHasKey($item->getUuid(), $executions);
117+
unset($executions[$item->getUuid()]);
118+
}
119+
120+
$this->assertEmpty($executions);
121+
}
122+
123+
public function testFindPending()
124+
{
125+
$execution = $this->testSave();
126+
$this->assertNotNull($this->taskExecutionRepository->findPending($execution->getTask()));
127+
128+
$execution = $this->testSave(null, null, TaskStatus::RUNNING);
129+
$this->assertNotNull($this->taskExecutionRepository->findPending($execution->getTask()));
130+
131+
$execution = $this->testSave(null, null, TaskStatus::COMPLETED);
132+
$this->assertNull($this->taskExecutionRepository->findPending($execution->getTask()));
133+
134+
$execution = $this->testSave(null, null, TaskStatus::FAILED);
135+
$this->assertNull($this->taskExecutionRepository->findPending($execution->getTask()));
136+
}
137+
138+
public function testFindByUuid()
139+
{
140+
$execution = $this->testSave();
141+
142+
$result = $this->taskExecutionRepository->findByUuid($execution->getUuid());
143+
$this->assertEquals($execution->getUuid(), $result->getUuid());
144+
}
145+
146+
public function testFindByTask()
147+
{
148+
$execution = $this->testSave();
149+
150+
$result = $this->taskExecutionRepository->findByTask($execution->getTask());
151+
152+
$this->assertCount(1, $result);
153+
$this->assertEquals($execution->getTask()->getUuid(), $result[0]->getTask()->getUuid());
154+
}
155+
156+
public function testFindByTaskUuid()
157+
{
158+
$execution = $this->testSave();
159+
160+
$result = $this->taskExecutionRepository->findByTaskUuid($execution->getTask()->getUuid());
161+
162+
$this->assertCount(1, $result);
163+
$this->assertEquals($execution->getTask()->getUuid(), $result[0]->getTask()->getUuid());
164+
}
165+
166+
public function testFindScheduledPast()
167+
{
168+
$task = $this->createTask();
169+
$this->taskRepository->save($task);
170+
171+
$execution = $this->testSave($task, new \DateTime('-1 hour'));
172+
173+
$result = $this->taskExecutionRepository->findScheduled();
174+
175+
$this->assertCount(1, $result);
176+
$this->assertEquals($execution->getUuid(), $result[0]->getUuid());
177+
}
178+
179+
public function testFindScheduledFuture()
180+
{
181+
$task = $this->createTask();
182+
$this->taskRepository->save($task);
183+
184+
$this->testSave($task, new \DateTime('+1 hour'));
185+
186+
$this->assertEmpty($this->taskExecutionRepository->findScheduled());
187+
}
188+
189+
private function createTask($handlerClass = TestHandler::class)
190+
{
191+
return new Task($handlerClass);
192+
}
193+
194+
private function createTaskExecution(Task $task, \DateTime $scheduleTime, $status = TaskStatus::PLANNED)
195+
{
196+
$execution = new TaskExecution($task, $task->getHandlerClass(), $scheduleTime);
197+
$execution->setStatus($status);
198+
199+
return $execution;
200+
}
201+
202+
protected function purgeDatabase()
203+
{
204+
$manager = self::$kernel->getContainer()->get('doctrine.orm.entity_manager');
205+
$connection = $manager->getConnection();
206+
207+
if ($connection->getDriver() instanceof \Doctrine\DBAL\Driver\PDOMySql\Driver) {
208+
$connection->executeUpdate('SET foreign_key_checks = 0;');
209+
}
210+
211+
$purger = new ORMPurger();
212+
$executor = new ORMExecutor($manager, $purger);
213+
$referenceRepository = new ProxyReferenceRepository($manager);
214+
$executor->setReferenceRepository($referenceRepository);
215+
$executor->purge();
216+
217+
if ($connection->getDriver() instanceof \Doctrine\DBAL\Driver\PDOMySql\Driver) {
218+
$connection->executeUpdate('SET foreign_key_checks = 1;');
219+
}
220+
}
221+
}

0 commit comments

Comments
 (0)