forked from liip/LiipFunctionalTestBundle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQueryCounter.php
69 lines (54 loc) · 1.99 KB
/
QueryCounter.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
namespace Liip\FunctionalTestBundle;
use Doctrine\Common\Annotations\Reader;
use Liip\FunctionalTestBundle\Annotations\QueryCount;
use Liip\FunctionalTestBundle\Exception\AllowedQueriesExceededException;
class QueryCounter
{
/** @var integer */
private $defaultMaxCount;
/** @var \Doctrine\Common\Annotations\AnnotationReader */
private $annotationReader;
public function __construct($defaultMaxCount, Reader $annotationReader)
{
$this->defaultMaxCount = $defaultMaxCount;
$this->annotationReader = $annotationReader;
}
public function checkQueryCount($actualQueryCount)
{
$maxQueryCount = $this->getMaxQueryCount();
if (null === $maxQueryCount) {
return;
}
if ($actualQueryCount > $maxQueryCount) {
throw new AllowedQueriesExceededException(
"Allowed amount of queries ($maxQueryCount) exceeded (actual: $actualQueryCount)."
);
}
}
private function getMaxQueryCount()
{
$maxQueryCount = $this->getMaxQueryAnnotation();
if (false !== $maxQueryCount) {
return $maxQueryCount;
}
return $this->defaultMaxCount;
}
private function getMaxQueryAnnotation()
{
foreach (debug_backtrace() as $step) {
if ('test' === substr($step['function'], 0, 4)) { //TODO: handle tests with the @test annotation
$annotations = $this->annotationReader->getMethodAnnotations(
new \ReflectionMethod($step['class'], $step['function'])
);
foreach ($annotations as $annotationClass) {
if ($annotationClass instanceof QueryCount AND isset($annotationClass->maxQueries)) {
/** @var $annotations \Liip\FunctionalTestBundle\Annotations\QueryCount */
return $annotationClass->maxQueries;
}
}
}
}
return false;
}
}