-
Notifications
You must be signed in to change notification settings - Fork 132
/
Copy pathTestObjectHandler.php
176 lines (158 loc) · 5.31 KB
/
TestObjectHandler.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\FunctionalTestingFramework\Test\Handlers;
use Magento\FunctionalTestingFramework\Exceptions\Collector\ExceptionCollector;
use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException;
use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException;
use Magento\FunctionalTestingFramework\Exceptions\XmlException;
use Magento\FunctionalTestingFramework\ObjectManager\ObjectHandlerInterface;
use Magento\FunctionalTestingFramework\ObjectManagerFactory;
use Magento\FunctionalTestingFramework\Test\Objects\TestObject;
use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser;
use Magento\FunctionalTestingFramework\Test\Util\ObjectExtensionUtil;
use Magento\FunctionalTestingFramework\Test\Util\TestObjectExtractor;
use Magento\FunctionalTestingFramework\Test\Util\AnnotationExtractor;
use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil;
use PHP_CodeSniffer\Tokenizers\PHP;
/**
* Class TestObjectHandler
*/
class TestObjectHandler implements ObjectHandlerInterface
{
/**
* Test Object Handler
*
* @var TestObjectHandler
*/
private static $testObjectHandler;
/**
* Array contains all test objects indexed by name
*
* @var TestObject[] $tests
*/
private $tests = [];
/**
* Instance of ObjectExtensionUtil class
*
* @var ObjectExtensionUtil
*/
private $extendUtil;
/**
* Singleton method to return TestObjectHandler.
*
* @return TestObjectHandler
* @throws XmlException
*/
public static function getInstance()
{
if (!self::$testObjectHandler) {
self::$testObjectHandler = new TestObjectHandler();
self::$testObjectHandler->initTestData();
}
return self::$testObjectHandler;
}
/**
* TestObjectHandler constructor.
*/
private function __construct()
{
$this->extendUtil = new ObjectExtensionUtil();
}
/**
* Takes a test name and returns the corresponding test.
*
* @param string $testName
* @return TestObject
* @throws TestReferenceException
*/
public function getObject($testName)
{
if (!array_key_exists($testName, $this->tests)) {
throw new TestReferenceException("Test ${testName} not defined in xml.");
}
$testObject = $this->tests[$testName];
return $this->extendTest($testObject);
}
/**
* Returns all tests parsed from xml indexed by testName.
*
* @return array
*/
public function getAllObjects()
{
$testObjects = [];
foreach ($this->tests as $testName => $test) {
$testObjects[$testName] = $this->extendTest($test);
}
return $testObjects;
}
/**
* Returns tests tagged with the group name passed to the method.
*
* @param string $groupName
* @return TestObject[]
*/
public function getTestsByGroup($groupName)
{
$relevantTests = [];
foreach ($this->tests as $test) {
/** @var TestObject $test */
if (in_array($groupName, $test->getAnnotationByName('group'))) {
$relevantTests[$test->getName()] = $this->extendTest($test);
continue;
}
}
return $relevantTests;
}
/**
* This method reads all Test.xml files into objects and stores them in an array for future access.
*
* @return void
* @SuppressWarnings(PHPMD.UnusedPrivateMethod)
* @throws XmlException
*/
private function initTestData()
{
$testDataParser = ObjectManagerFactory::getObjectManager()->create(TestDataParser::class);
$parsedTestArray = $testDataParser->readTestData();
$testObjectExtractor = new TestObjectExtractor();
if (!$parsedTestArray) {
trigger_error("Could not parse any test in xml.", E_USER_NOTICE);
return;
}
$exceptionCollector = new ExceptionCollector();
foreach ($parsedTestArray as $testName => $testData) {
if (!is_array($testData)) {
continue;
}
try {
$this->tests[$testName] = $testObjectExtractor->extractTestData($testData);
} catch (XmlException $exception) {
$exceptionCollector->addError(self::class, $exception->getMessage());
}
}
$exceptionCollector->throwException();
$testObjectExtractor->getAnnotationExtractor()->validateStoryTitleUniqueness();
$testObjectExtractor->getAnnotationExtractor()->validateTestCaseIdTitleUniqueness();
}
/**
* This method checks if the test is extended and creates a new test object accordingly
*
* @param TestObject $testObject
* @return TestObject
* @throws TestFrameworkException
*/
private function extendTest($testObject)
{
if ($testObject->getParentName() !== null) {
if ($testObject->getParentName() == $testObject->getName()) {
throw new TestFrameworkException("Mftf Test can not extend from itself: " . $testObject->getName());
}
return $this->extendUtil->extendTest($testObject);
}
return $testObject;
}
}