Skip to content

Commit 163b913

Browse files
authored
Merge branch 'develop' into MQE-982
2 parents 7ebd251 + a955ad1 commit 163b913

File tree

2 files changed

+150
-35
lines changed

2 files changed

+150
-35
lines changed
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Tests\unit\Magento\FunctionalTestFramework\Suite;
7+
8+
use AspectMock\Test as AspectMock;
9+
use Magento\FunctionalTestingFramework\ObjectManager\ObjectManager;
10+
use Magento\FunctionalTestingFramework\ObjectManagerFactory;
11+
use Magento\FunctionalTestingFramework\Suite\SuiteGenerator;
12+
use Magento\FunctionalTestingFramework\Suite\Generators\GroupClassGenerator;
13+
use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler;
14+
use Magento\FunctionalTestingFramework\Suite\Parsers\SuiteDataParser;
15+
use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler;
16+
use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser;
17+
use Magento\FunctionalTestingFramework\Util\Manifest\DefaultTestManifest;
18+
use PHPUnit\Framework\TestCase;
19+
use tests\unit\Util\SuiteDataArrayBuilder;
20+
use tests\unit\Util\TestDataArrayBuilder;
21+
22+
class SuiteGeneratorTest extends TestCase
23+
{
24+
25+
/**
26+
* Tests generating a single suite given a set of parsed test data
27+
* @throws \Exception
28+
*/
29+
public function testGenerateSuite()
30+
{
31+
$suiteDataArrayBuilder = new SuiteDataArrayBuilder();
32+
$mockData = $suiteDataArrayBuilder
33+
->withName('basicTestSuite')
34+
->withAfterHook()
35+
->withBeforeHook()
36+
->includeTests(['simpleTest'])
37+
->includeGroups(['group1'])
38+
->build();
39+
40+
$testDataArrayBuilder = new TestDataArrayBuilder();
41+
$mockSimpleTest = $testDataArrayBuilder
42+
->withName('simpleTest')
43+
->withTestActions()
44+
->build();
45+
46+
$mockTestData = ['tests' => array_merge($mockSimpleTest)];
47+
$this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
48+
49+
// parse and generate suite object with mocked data
50+
$mockSuiteGenerator = SuiteGenerator::getInstance();
51+
$mockSuiteGenerator->generateSuite("basicTestSuite");
52+
53+
// assert that expected suite is generated
54+
$this->expectOutputString("Suite basicTestSuite generated to _generated/basicTestSuite." . PHP_EOL);
55+
}
56+
57+
/**
58+
* Tests generating all suites given a set of parsed test data
59+
* @throws \Exception
60+
*/
61+
public function testGenerateAllSuites()
62+
{
63+
$suiteDataArrayBuilder = new SuiteDataArrayBuilder();
64+
$mockData = $suiteDataArrayBuilder
65+
->withName('basicTestSuite')
66+
->withAfterHook()
67+
->withBeforeHook()
68+
->includeTests(['simpleTest'])
69+
->includeGroups(['group1'])
70+
->build();
71+
72+
$testDataArrayBuilder = new TestDataArrayBuilder();
73+
$mockSimpleTest = $testDataArrayBuilder
74+
->withName('simpleTest')
75+
->withTestActions()
76+
->build();
77+
78+
$mockTestData = ['tests' => array_merge($mockSimpleTest)];
79+
$this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
80+
81+
// parse and retrieve suite object with mocked data
82+
$exampleTestManifest = new DefaultTestManifest([], "sample/path");
83+
$mockSuiteGenerator = SuiteGenerator::getInstance();
84+
$mockSuiteGenerator->generateAllSuites($exampleTestManifest);
85+
86+
// assert that expected suites are generated
87+
$this->expectOutputString("Suite basicTestSuite generated to _generated/basicTestSuite." . PHP_EOL);
88+
}
89+
90+
/**
91+
* Function used to set mock for parser return and force init method to run between tests.
92+
*
93+
* @param array $testData
94+
* @throws \Exception
95+
*/
96+
private function setMockTestAndSuiteParserOutput($testData, $suiteData)
97+
{
98+
$property = new \ReflectionProperty(SuiteGenerator::class, 'SUITE_GENERATOR_INSTANCE');
99+
$property->setAccessible(true);
100+
$property->setValue(null);
101+
102+
// clear test object handler value to inject parsed content
103+
$property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler');
104+
$property->setAccessible(true);
105+
$property->setValue(null);
106+
107+
// clear suite object handler value to inject parsed content
108+
$property = new \ReflectionProperty(SuiteObjectHandler::class, 'SUITE_OBJECT_HANLDER_INSTANCE');
109+
$property->setAccessible(true);
110+
$property->setValue(null);
111+
112+
$mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make();
113+
$mockSuiteDataParser = AspectMock::double(SuiteDataParser::class, ['readSuiteData' => $suiteData])->make();
114+
$mockGroupClass = AspectMock::double(
115+
GroupClassGenerator::class,
116+
['generateGroupClass' => 'namespace']
117+
)->make();
118+
$mockSuiteClass = AspectMock::double(SuiteGenerator::class, ['generateRelevantGroupTests' => null])->make();
119+
$instance = AspectMock::double(
120+
ObjectManager::class,
121+
['create' => function ($clazz) use (
122+
$mockDataParser,
123+
$mockSuiteDataParser,
124+
$mockGroupClass,
125+
$mockSuiteClass
126+
) {
127+
if ($clazz == TestDataParser::class) {
128+
return $mockDataParser;
129+
}
130+
if ($clazz == SuiteDataParser::class) {
131+
return $mockSuiteDataParser;
132+
}
133+
if ($clazz == GroupClassGenerator::class) {
134+
return $mockGroupClass;
135+
}
136+
if ($clazz == SuiteGenerator::class) {
137+
return $mockSuiteClass;
138+
}
139+
}]
140+
)->make();
141+
// bypass the private constructor
142+
AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]);
143+
144+
$property = new \ReflectionProperty(SuiteGenerator::class, 'groupClassGenerator');
145+
$property->setAccessible(true);
146+
$property->setValue($instance, $instance);
147+
148+
}
149+
}

src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,7 @@ public static function getInstance()
7474
*/
7575
public function generateAllSuites($testManifest)
7676
{
77-
$suites = array_keys(SuiteObjectHandler::getInstance()->getAllObjects());
78-
if ($testManifest != null) {
79-
$suites = $testManifest->getSuiteConfig();
80-
}
77+
$suites = $testManifest->getSuiteConfig();
8178

8279
foreach ($suites as $suiteName => $suiteContent) {
8380
$firstElement = array_values($suiteContent)[0];
@@ -94,37 +91,6 @@ public function generateAllSuites($testManifest)
9491
}
9592
}
9693

97-
/**
98-
* Returns an array of tests contained within suites as keys pointed at the name of their corresponding suite.
99-
*
100-
* @return array
101-
*/
102-
public function getTestsReferencedInSuites()
103-
{
104-
$testsReferencedInSuites = [];
105-
$suites = SuiteObjectHandler::getInstance()->getAllObjects();
106-
107-
// see if we have a specific suite configuration.
108-
if (!empty($this->suiteReferences)) {
109-
$suites = array_intersect_key($suites, $this->suiteReferences);
110-
}
111-
112-
foreach ($suites as $suite) {
113-
/** @var SuiteObject $suite */
114-
$test_keys = array_keys($suite->getTests());
115-
116-
// see if we need to filter which tests we'll be generating.
117-
if (array_key_exists($suite->getName(), $this->suiteReferences)) {
118-
$test_keys = $this->suiteReferences[$suite->getName()] ?? $test_keys;
119-
}
120-
121-
$testToSuiteName = array_fill_keys($test_keys, [$suite->getName()]);
122-
$testsReferencedInSuites = array_merge_recursive($testsReferencedInSuites, $testToSuiteName);
123-
}
124-
125-
return $testsReferencedInSuites;
126-
}
127-
12894
/**
12995
* Function which takes a suite name and generates corresponding dir, test files, group class, and updates
13096
* yml configuration for group run.

0 commit comments

Comments
 (0)