public function testVerifyReturnIsSkippedIfNotInstanceOfResult() { $e = new Event('some-event', ['arg1' => 1, 'arg2' => 2]); $mockCallback1 = $this->getMock('stdClass', ['callback']); $mockCallback1->expects($this->once())->method('callback')->with($e)->will($this->returnValue(null)); $this->eventDispatcher->insertVerifier('some-event', [$mockCallback1, 'callback']); $this->eventDispatcher->dispatch($e); $this->assertEquals([], iterator_to_array($this->results)); }
/** * @param EventDispatcher $eventDispatcher */ public function attach(EventDispatcher $eventDispatcher) { $studentClient = CouchDBClient::create(['dbname' => static::$studentDb]); $solutionClient = CouchDBClient::create(['dbname' => static::$solutionDb]); $studentClient->createDatabase($studentClient->getDatabase()); $solutionClient->createDatabase($solutionClient->getDatabase()); $eventDispatcher->listen('verify.start', function (Event $e) use($studentClient, $solutionClient) { $e->getParameter('exercise')->seed($studentClient); $this->replicateDbFromStudentToSolution($studentClient, $solutionClient); }); $eventDispatcher->listen('run.start', function (Event $e) use($studentClient) { $e->getParameter('exercise')->seed($studentClient); }); $eventDispatcher->listen('cli.verify.reference-execute.pre', function (CliExecuteEvent $e) { $e->prependArg('phpschool'); }); $eventDispatcher->listen(['cli.verify.student-execute.pre', 'cli.run.student-execute.pre'], function (CliExecuteEvent $e) { $e->prependArg('phpschool-student'); }); $eventDispatcher->insertVerifier('verify.finish', function (Event $e) use($studentClient) { $verifyResult = $e->getParameter('exercise')->verify($studentClient); if (false === $verifyResult) { return Failure::fromNameAndReason($this->getName(), 'Database verification failed'); } return Success::fromCheck($this); }); $eventDispatcher->listen(['cli.verify.reference-execute.fail', 'verify.finish', 'run.finish'], function (Event $e) use($studentClient, $solutionClient) { $studentClient->deleteDatabase(static::$studentDb); $solutionClient->deleteDatabase(static::$solutionDb); }); }
public function testListenersAndVerifiersAreCalledInOrderOfAttachment() { $e1 = new Event('first-event', ['arg1' => 1, 'arg2' => 2]); $counter = 0; $this->eventDispatcher->insertVerifier('first-event', function (Event $e) use(&$counter) { $this->assertEquals(0, $counter); $counter++; }); $this->eventDispatcher->listen('first-event', function (Event $e) use(&$counter) { $this->assertEquals(1, $counter); $counter++; }); $this->eventDispatcher->dispatch($e1); }
/** * Here we attach to various events to seed, verify and inject the DSN's * to the student & reference solution programs's CLI arguments. * * @param EventDispatcher $eventDispatcher */ public function attach(EventDispatcher $eventDispatcher) { if (file_exists($this->databaseDirectory)) { throw new \RuntimeException(sprintf('Database directory: "%s" already exists', $this->databaseDirectory)); } mkdir($this->databaseDirectory, 0777, true); try { $db = new PDO($this->userDsn); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (\PDOException $e) { rmdir($this->databaseDirectory); throw $e; } $eventDispatcher->listen('verify.start', function (Event $e) use($db) { $e->getParameter('exercise')->seed($db); //make a copy - so solution can modify without effecting database user has access to copy($this->userDatabasePath, $this->solutionDatabasePath); }); $eventDispatcher->listen('run.start', function (Event $e) use($db) { $e->getParameter('exercise')->seed($db); }); $eventDispatcher->listen('cli.verify.reference-execute.pre', function (CliExecuteEvent $e) { $e->prependArg($this->solutionDsn); }); $eventDispatcher->listen(['cli.verify.student-execute.pre', 'cli.run.student-execute.pre'], function (CliExecuteEvent $e) { $e->prependArg($this->userDsn); }); $eventDispatcher->insertVerifier('verify.finish', function (Event $e) use($db) { $verifyResult = $e->getParameter('exercise')->verify($db); if (false === $verifyResult) { return Failure::fromNameAndReason($this->getName(), 'Database verification failed'); } return new Success('Database Verification Check'); }); $eventDispatcher->listen(['cli.verify.reference-execute.fail', 'verify.finish', 'run.finish'], function (Event $e) use($db) { unset($db); @unlink($this->userDatabasePath); @unlink($this->solutionDatabasePath); rmdir($this->databaseDirectory); }); }