diff --git a/lib/Doctrine/Repositories/FtpExportElementRepository.php b/lib/Doctrine/Repositories/FtpExportElementRepository.php new file mode 100644 index 0000000000..ec7057dd74 --- /dev/null +++ b/lib/Doctrine/Repositories/FtpExportElementRepository.php @@ -0,0 +1,15 @@ +createQueryBuilder('e'); + $qb->where($qb->expr()->gte('e.crash', 'e.nbretry')); + + if (null !== $before) { + $qb->where($qb->expr()->lte('e.created', ':created')); + $qb->setParameter(':created', $before); + } + + return $qb->getQuery()->getResult(); + } + + /** + * Returns a list of exports that can be achieved. + * + * @return array + */ + public function findDoableExports() + { + $dql = 'SELECT f + FROM Entities\FtpExport f + INNER JOIN f.elements e + WHERE e.done = false'; + + $query = $this->_em->createQuery($dql); + + return $query->getResult(); + } + + /** + * Returns the exports initiated by a given user. + * + * @param \User_Adapter $user + * + * @return array + */ + public function findByUser(\User_Adapter $user) + { + return $this->findBy(array('usrId' => $user->get_id())); + } +} diff --git a/tests/Doctrine/Tests/Repositories/FtpExportRepositoryTest.php b/tests/Doctrine/Tests/Repositories/FtpExportRepositoryTest.php new file mode 100644 index 0000000000..a98c7657e0 --- /dev/null +++ b/tests/Doctrine/Tests/Repositories/FtpExportRepositoryTest.php @@ -0,0 +1,231 @@ +setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(2); + + $failure2 = new FtpExport(); + $failure2 + ->setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(7) + ->setNbretry(5); + + $good1 = new FtpExport(); + $good1 + ->setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(3); + + $good2 = new FtpExport(); + $good2 + ->setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(12) + ->setNbretry(23); + + self::$DI['app']['EM']->persist($failure1); + self::$DI['app']['EM']->persist($failure2); + self::$DI['app']['EM']->persist($good1); + self::$DI['app']['EM']->persist($good2); + self::$DI['app']['EM']->flush(); + + $crashed = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findCrashedExports(); + + $this->assertCount(2, $crashed); + $this->assertContains($failure1, $crashed); + $this->assertContains($failure2, $crashed); + } + + public function testFindCrashedExportsWithDate() + { + self::$DI['app']['EM']->getEventManager()->removeEventSubscriber(new TimestampableListener()); + + $failure1 = new FtpExport(); + $failure1 + ->setAddr('Failure 1') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(2) + ->setCreated(new \DateTime('-6 days')); + + $failure2 = new FtpExport(); + $failure2 + ->setAddr('Failure 2') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(2) + ->setCreated(new \DateTime('-7 days')); + + $good1 = new FtpExport(); + $good1 + ->setAddr('Good 1') + ->setUser(self::$DI['user']) + ->setCrash(7) + ->setNbretry(5) + ->setCreated(new \DateTime('-5 days')); + + $good2 = new FtpExport(); + $good2 + ->setAddr('Good 2') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(3); + + $good3 = new FtpExport(); + $good3 + ->setAddr('Good 3') + ->setUser(self::$DI['user']) + ->setCrash(12) + ->setNbretry(23); + + self::$DI['app']['EM']->persist($failure1); + self::$DI['app']['EM']->persist($failure2); + self::$DI['app']['EM']->persist($good1); + self::$DI['app']['EM']->persist($good2); + self::$DI['app']['EM']->persist($good3); + self::$DI['app']['EM']->flush(); + + $crashed = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findCrashedExports(new \DateTime('-6 days')); + + $this->assertCount(2, $crashed); + $this->assertContains($failure1, $crashed); + $this->assertContains($failure2, $crashed); + } + + public function testFindDoableExports() + { + $notDoable1 = new FtpExport(); + $notDoable1 + ->setAddr('Not Doable 1') + ->setUser(self::$DI['user']); + + $elem1 = new FtpExportElement(); + $elem1 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_1']->get_base_id()) + ->setRecordId(self::$DI['record_1']->get_record_id()) + ->setDone(true); + + $elem1->setExport($notDoable1); + $notDoable1->addElement($elem1); + + $notDoable2 = new FtpExport(); + $notDoable2 + ->setAddr('Not Doable 2') + ->setUser(self::$DI['user']); + + $doable1 = new FtpExport(); + $doable1 + ->setAddr('Doable 1') + ->setUser(self::$DI['user']); + + $elem2 = new FtpExportElement(); + $elem2 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_1']->get_base_id()) + ->setRecordId(self::$DI['record_1']->get_record_id()) + ->setDone(true); + + $elem2->setExport($doable1); + $doable1->addElement($elem2); + + $elem3 = new FtpExportElement(); + $elem3 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_2']->get_base_id()) + ->setRecordId(self::$DI['record_2']->get_record_id()) + ->setDone(false); + + $elem3->setExport($doable1); + $doable1->addElement($elem3); + + $doable2 = new FtpExport(); + $doable2 + ->setAddr('Doable 2') + ->setUser(self::$DI['user']); + + $elem4 = new FtpExportElement(); + $elem4 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_1']->get_base_id()) + ->setRecordId(self::$DI['record_1']->get_record_id()) + ->setDone(false); + + $elem4->setExport($doable2); + $doable2->addElement($elem4); + + self::$DI['app']['EM']->persist($notDoable1); + self::$DI['app']['EM']->persist($notDoable2); + self::$DI['app']['EM']->persist($doable1); + self::$DI['app']['EM']->persist($doable2); + self::$DI['app']['EM']->persist($elem1); + self::$DI['app']['EM']->persist($elem2); + self::$DI['app']['EM']->persist($elem3); + self::$DI['app']['EM']->persist($elem4); + + self::$DI['app']['EM']->flush(); + + $doables = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findDoableExports(); + + $this->assertCount(2, $doables); + $this->assertContains($doable1, $doables); + $this->assertContains($doable2, $doables); + } + + public function testFindByUser() + { + $match1 = new FtpExport(); + $match1 + ->setAddr('Match 1') + ->setUser(self::$DI['user']); + + $match2 = new FtpExport(); + $match2 + ->setAddr('Match 2') + ->setUser(self::$DI['user']); + + $noMatch1 = new FtpExport(); + $noMatch1 + ->setAddr('No match 1') + ->setUser(self::$DI['user_alt1']); + + self::$DI['app']['EM']->persist($match1); + self::$DI['app']['EM']->persist($match2); + self::$DI['app']['EM']->persist($noMatch1); + + self::$DI['app']['EM']->flush(); + + $exports = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findByUser(self::$DI['user']); + + $this->assertCount(2, $exports); + $this->assertContains($match1, $exports); + $this->assertContains($match2, $exports); + } +}