Skip to content

Commit b57e7bf

Browse files
author
Alexander Calandra
committed
MQE-978: Create Test Coverage Around SuiteGenerator Class
- Adding unit tests for generateSuite and generateAllSuites - Removed unused code from SuiteGenerator Class
1 parent fb1e4b7 commit b57e7bf

File tree

2 files changed

+154
-35
lines changed

2 files changed

+154
-35
lines changed
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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 on 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 on created suite object
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+
$property = new \ReflectionProperty(DefaultTestManifest::class, 'CLEARED_MANIFESTS');
103+
$property->setAccessible(true);
104+
$property->setValue(["sample/path"]);
105+
106+
// clear test object handler value to inject parsed content
107+
$property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler');
108+
$property->setAccessible(true);
109+
$property->setValue(null);
110+
111+
// clear suite object handler value to inject parsed content
112+
$property = new \ReflectionProperty(SuiteObjectHandler::class, 'SUITE_OBJECT_HANLDER_INSTANCE');
113+
$property->setAccessible(true);
114+
$property->setValue(null);
115+
116+
$mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make();
117+
$mockSuiteDataParser = AspectMock::double(SuiteDataParser::class, ['readSuiteData' => $suiteData])->make();
118+
$mockGroupClass = AspectMock::double(
119+
GroupClassGenerator::class,
120+
['generateGroupClass' => 'namespace']
121+
)->make();
122+
$mockSuiteClass = AspectMock::double(SuiteGenerator::class, ['generateRelevantGroupTests' => null])->make();
123+
$instance = AspectMock::double(
124+
ObjectManager::class,
125+
['create' => function ($clazz) use (
126+
$mockDataParser,
127+
$mockSuiteDataParser,
128+
$mockGroupClass,
129+
$mockSuiteClass
130+
) {
131+
if ($clazz == TestDataParser::class) {
132+
return $mockDataParser;
133+
}
134+
if ($clazz == SuiteDataParser::class) {
135+
return $mockSuiteDataParser;
136+
}
137+
if ($clazz == GroupClassGenerator::class) {
138+
return $mockGroupClass;
139+
}
140+
if ($clazz == SuiteGenerator::class) {
141+
return $mockSuiteClass;
142+
}
143+
}]
144+
)->make();
145+
// bypass the private constructor
146+
AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]);
147+
148+
$property = new \ReflectionProperty(SuiteGenerator::class, 'groupClassGenerator');
149+
$property->setAccessible(true);
150+
$property->setValue($instance, $instance);
151+
152+
}
153+
}

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)