/
QueryCounter.php
80 lines (63 loc) · 2.22 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
70
71
72
73
74
75
76
77
78
79
80
<?php
declare(strict_types=1);
/*
* This file is part of the Liip/FunctionalTestBundle
*
* (c) Lukas Kahwe Smith <smith@pooteeweet.org>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Liip\FunctionalTestBundle;
use Doctrine\Common\Annotations\Reader;
use Liip\FunctionalTestBundle\Annotations\QueryCount;
use Liip\FunctionalTestBundle\Exception\AllowedQueriesExceededException;
final class QueryCounter
{
/** @var int */
private $defaultMaxCount;
/** @var Reader */
private $annotationReader;
public function __construct(?int $defaultMaxCount, Reader $annotationReader)
{
$this->defaultMaxCount = $defaultMaxCount;
$this->annotationReader = $annotationReader;
}
public function checkQueryCount(int $actualQueryCount): void
{
$maxQueryCount = $this->getMaxQueryCount();
if (null === $maxQueryCount) {
return;
}
if ($actualQueryCount > $maxQueryCount) {
throw new AllowedQueriesExceededException(
"Allowed amount of queries ($maxQueryCount) exceeded (actual: $actualQueryCount)."
);
}
}
private function getMaxQueryCount(): ?int
{
$maxQueryCount = $this->getMaxQueryAnnotation();
if (null !== $maxQueryCount) {
return $maxQueryCount;
}
return $this->defaultMaxCount;
}
private function getMaxQueryAnnotation(): ?int
{
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 && isset($annotationClass->maxQueries)) {
/* @var $annotations \Liip\FunctionalTestBundle\Annotations\QueryCount */
return $annotationClass->maxQueries;
}
}
}
}
return null;
}
}