-
Notifications
You must be signed in to change notification settings - Fork 132
/
Copy pathPageObjectHandler.php
132 lines (114 loc) · 3.97 KB
/
PageObjectHandler.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
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\FunctionalTestingFramework\Page\Handlers;
use Magento\FunctionalTestingFramework\ObjectManager\ObjectHandlerInterface;
use Magento\FunctionalTestingFramework\ObjectManagerFactory;
use Magento\FunctionalTestingFramework\Page\Objects\PageObject;
use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil;
use Magento\FunctionalTestingFramework\Util\Validation\NameValidationUtil;
use Magento\FunctionalTestingFramework\XmlParser\PageParser;
use Magento\FunctionalTestingFramework\Exceptions\XmlException;
class PageObjectHandler implements ObjectHandlerInterface
{
const PAGE = 'page';
const SECTION = 'section';
const URL = 'url';
const MODULE = 'module';
const PARAMETERIZED = 'parameterized';
const AREA = 'area';
const FILENAME = 'filename';
const NAME_BLACKLIST_ERROR_MSG = "Page names cannot contain non alphanumeric characters.\tPage='%s'";
/**
* The singleton instance of this class
*
* @var PageObjectHandler
*/
private static $INSTANCE;
/**
* Array containing all page objects
*
* @var PageObject[]
*/
private $pageObjects = [];
/**
* Private constructor
*
* @throws XmlException
*/
private function __construct()
{
$objectManager = ObjectManagerFactory::getObjectManager();
$parser = $objectManager->get(PageParser::class);
$parserOutput = $parser->getData(self::PAGE);
if (!$parserOutput) {
// No *Page.xml files found so give up
return;
}
$pageNameValidator = new NameValidationUtil();
foreach ($parserOutput as $pageName => $pageData) {
if (preg_match('/[^a-zA-Z0-9_]/', $pageName)) {
throw new XmlException(sprintf(self::NAME_BLACKLIST_ERROR_MSG, $pageName));
}
$filename = $pageData[self::FILENAME] ?? null;
$pageNameValidator->validateAffixes($pageName, NameValidationUtil::PAGE, $filename);
$area = $pageData[self::AREA] ?? null;
$url = $pageData[self::URL] ?? null;
if ($area == 'admin') {
$url = ltrim($url, "/");
}
$module = $pageData[self::MODULE] ?? null;
$sectionNames = array_keys($pageData[self::SECTION] ?? []);
$urlContainsMustaches = strpos($url, "{{") !== false && strpos($url, "}}") !== false;
$parameterized = $pageData[self::PARAMETERIZED] ?? $urlContainsMustaches ?? false;
$filename = $pageData[self::FILENAME] ?? null;
$deprecated = $pageData[self::OBJ_DEPRECATED] ?? null;
if ($deprecated !== null) {
LoggingUtil::getInstance()->getLogger(self::class)->deprecation(
$deprecated,
["pageName" => $filename, "deprecatedPage" => $deprecated]
);
}
$this->pageObjects[$pageName] =
new PageObject($pageName, $url, $module, $sectionNames, $parameterized, $area, $filename, $deprecated);
}
$pageNameValidator->summarize(NameValidationUtil::PAGE . " name");
}
/**
* Singleton method to return PageObjectHandler.
*
* @return PageObjectHandler
* @throws XmlException
*/
public static function getInstance()
{
if (!self::$INSTANCE) {
self::$INSTANCE = new PageObjectHandler();
}
return self::$INSTANCE;
}
/**
* Return a page object by name
*
* @param string $name
* @return PageObject|null
*/
public function getObject($name)
{
if (array_key_exists($name, $this->pageObjects)) {
return $this->getAllObjects()[$name];
}
return null;
}
/**
* Return all page objects
*
* @return PageObject[]
*/
public function getAllObjects()
{
return $this->pageObjects;
}
}