33 * Copyright © Magento, Inc. All rights reserved.
44 * See COPYING.txt for license details.
55 */
6+ declare (strict_types=1 );
7+
68namespace tests \unit \Magento \FunctionalTestFramework \Suite ;
79
8- use AspectMock \ Test as AspectMock ;
10+ use Exception ;
911use Magento \FunctionalTestingFramework \Exceptions \TestReferenceException ;
10- use Magento \FunctionalTestingFramework \ObjectManager \ ObjectManager ;
12+ use Magento \FunctionalTestingFramework \ObjectManager ;
1113use Magento \FunctionalTestingFramework \ObjectManagerFactory ;
14+ use Magento \FunctionalTestingFramework \Suite \Service \SuiteGeneratorService ;
1215use Magento \FunctionalTestingFramework \Suite \SuiteGenerator ;
1316use Magento \FunctionalTestingFramework \Suite \Generators \GroupClassGenerator ;
1417use Magento \FunctionalTestingFramework \Suite \Handlers \SuiteObjectHandler ;
1821use Magento \FunctionalTestingFramework \Test \Parsers \TestDataParser ;
1922use Magento \FunctionalTestingFramework \Util \GenerationErrorHandler ;
2023use Magento \FunctionalTestingFramework \Util \Manifest \DefaultTestManifest ;
24+ use ReflectionProperty ;
2125use tests \unit \Util \MagentoTestCase ;
2226use Magento \FunctionalTestingFramework \Util \Manifest \TestManifestFactory ;
2327use tests \unit \Util \SuiteDataArrayBuilder ;
2428use tests \unit \Util \TestDataArrayBuilder ;
2529use tests \unit \Util \TestLoggingUtil ;
26- use tests \unit \Util \MockModuleResolverBuilder ;
2730
2831class SuiteGeneratorTest extends MagentoTestCase
2932{
30- /**
31- * Setup entry append and clear for Suite Generator
32- */
33- public static function setUpBeforeClass (): void
34- {
35- AspectMock::double (SuiteGenerator::class, [
36- 'clearPreviousSessionConfigEntries ' => null ,
37- 'appendEntriesToConfig ' => null
38- ]);
39- }
40-
4133 /**
4234 * Before test functionality
4335 * @return void
4436 */
45- public function setUp (): void
37+ protected function setUp (): void
4638 {
4739 TestLoggingUtil::getInstance ()->setMockLoggingUtil ();
48- $ resolverMock = new MockModuleResolverBuilder ();
49- $ resolverMock ->setup ();
5040 }
5141
5242 /**
53- * Tests generating a single suite given a set of parsed test data
43+ * Tests generating a single suite given a set of parsed test data.
44+ *
45+ * @return void
46+ * @throws Exception
5447 */
55- public function testGenerateSuite ()
48+ public function testGenerateSuite (): void
5649 {
5750 $ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
5851 $ mockData = $ suiteDataArrayBuilder
@@ -74,20 +67,23 @@ public function testGenerateSuite()
7467
7568 // parse and generate suite object with mocked data
7669 $ mockSuiteGenerator = SuiteGenerator::getInstance ();
77- $ mockSuiteGenerator ->generateSuite (" basicTestSuite " );
70+ $ mockSuiteGenerator ->generateSuite (' basicTestSuite ' );
7871
7972 // assert that expected suite is generated
8073 TestLoggingUtil::getInstance ()->validateMockLogStatement (
8174 'info ' ,
82- " suite generated " ,
83- ['suite ' => 'basicTestSuite ' , 'relative_path ' => " _generated " . DIRECTORY_SEPARATOR . " basicTestSuite " ]
75+ ' suite generated ' ,
76+ ['suite ' => 'basicTestSuite ' , 'relative_path ' => ' _generated ' . DIRECTORY_SEPARATOR . ' basicTestSuite ' ]
8477 );
8578 }
8679
8780 /**
88- * Tests generating all suites given a set of parsed test data
81+ * Tests generating all suites given a set of parsed test data.
82+ *
83+ * @return void
84+ * @throws Exception
8985 */
90- public function testGenerateAllSuites ()
86+ public function testGenerateAllSuites (): void
9187 {
9288 $ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
9389 $ mockData = $ suiteDataArrayBuilder
@@ -108,22 +104,25 @@ public function testGenerateAllSuites()
108104 $ this ->setMockTestAndSuiteParserOutput ($ mockTestData , $ mockData );
109105
110106 // parse and retrieve suite object with mocked data
111- $ exampleTestManifest = new DefaultTestManifest ([], " sample " . DIRECTORY_SEPARATOR . " path " );
107+ $ exampleTestManifest = new DefaultTestManifest ([], ' sample ' . DIRECTORY_SEPARATOR . ' path ' );
112108 $ mockSuiteGenerator = SuiteGenerator::getInstance ();
113109 $ mockSuiteGenerator ->generateAllSuites ($ exampleTestManifest );
114110
115111 // assert that expected suites are generated
116112 TestLoggingUtil::getInstance ()->validateMockLogStatement (
117113 'info ' ,
118- " suite generated " ,
119- ['suite ' => 'basicTestSuite ' , 'relative_path ' => " _generated " . DIRECTORY_SEPARATOR . " basicTestSuite " ]
114+ ' suite generated ' ,
115+ ['suite ' => 'basicTestSuite ' , 'relative_path ' => ' _generated ' . DIRECTORY_SEPARATOR . ' basicTestSuite ' ]
120116 );
121117 }
122118
123119 /**
124- * Tests attempting to generate a suite with no included/excluded tests and no hooks
120+ * Tests attempting to generate a suite with no included/excluded tests and no hooks.
121+ *
122+ * @return void
123+ * @throws Exception
125124 */
126- public function testGenerateEmptySuite ()
125+ public function testGenerateEmptySuite (): void
127126 {
128127 $ testDataArrayBuilder = new TestDataArrayBuilder ();
129128 $ mockTestData = $ testDataArrayBuilder
@@ -142,17 +141,20 @@ public function testGenerateEmptySuite()
142141 $ this ->setMockTestAndSuiteParserOutput ($ mockTestData , $ mockData );
143142
144143 // set expected error message
145- $ this ->expectExceptionMessage (" Suite basicTestSuite is not defined in xml or is invalid " );
144+ $ this ->expectExceptionMessage (' Suite basicTestSuite is not defined in xml or is invalid ' );
146145
147146 // parse and generate suite object with mocked data
148147 $ mockSuiteGenerator = SuiteGenerator::getInstance ();
149- $ mockSuiteGenerator ->generateSuite (" basicTestSuite " );
148+ $ mockSuiteGenerator ->generateSuite (' basicTestSuite ' );
150149 }
151150
152151 /**
153- * Tests generating all suites with a suite containing invalid test reference
152+ * Tests generating all suites with a suite containing invalid test reference.
153+ *
154+ * @return void
155+ * @throws TestReferenceException
154156 */
155- public function testInvalidSuiteTestPair ()
157+ public function testInvalidSuiteTestPair (): void
156158 {
157159 // Mock Suite1 => Test1 and Suite2 => Test2
158160 $ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
@@ -198,9 +200,12 @@ public function testInvalidSuiteTestPair()
198200 }
199201
200202 /**
201- * Tests generating all suites with a non-existing suite
203+ * Tests generating all suites with a non-existing suite.
204+ *
205+ * @return void
206+ * @throws TestReferenceException
202207 */
203- public function testNonExistentSuiteTestPair ()
208+ public function testNonExistentSuiteTestPair (): void
204209 {
205210 $ testDataArrayBuilder = new TestDataArrayBuilder ();
206211 $ mockSimpleTest = $ testDataArrayBuilder
@@ -227,9 +232,12 @@ public function testNonExistentSuiteTestPair()
227232 }
228233
229234 /**
230- * Tests generating split suites for parallel test generation
235+ * Tests generating split suites for parallel test generation.
236+ *
237+ * @return void
238+ * @throws TestReferenceException
231239 */
232- public function testGenerateSplitSuiteFromTest ()
240+ public function testGenerateSplitSuiteFromTest (): void
233241 {
234242 $ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
235243 $ mockSuiteData = $ suiteDataArrayBuilder
@@ -272,8 +280,8 @@ public function testGenerateSplitSuiteFromTest()
272280 // assert last split suite group generated
273281 TestLoggingUtil::getInstance ()->validateMockLogStatement (
274282 'info ' ,
275- " suite generated " ,
276- ['suite ' => 'mockSuite_1_G ' , 'relative_path ' => " _generated " . DIRECTORY_SEPARATOR . " mockSuite_1_G " ]
283+ ' suite generated ' ,
284+ ['suite ' => 'mockSuite_1_G ' , 'relative_path ' => ' _generated ' . DIRECTORY_SEPARATOR . ' mockSuite_1_G ' ]
277285 );
278286 }
279287
@@ -282,75 +290,117 @@ public function testGenerateSplitSuiteFromTest()
282290 *
283291 * @param array $testData
284292 * @param array $suiteData
285- * @throws \Exception
293+ * @throws Exception
294+ */
295+ private function setMockTestAndSuiteParserOutput (array $ testData , array $ suiteData ): void
296+ {
297+ $ this ->clearMockResolverProperties ();
298+ $ mockSuiteGeneratorService = $ this ->createMock (SuiteGeneratorService::class);
299+ $ mockSuiteGeneratorService
300+ ->method ('clearPreviousSessionConfigEntries ' )
301+ ->willReturn (null );
302+
303+ $ mockSuiteGeneratorService
304+ ->method ('appendEntriesToConfig ' )
305+ ->willReturn (null );
306+
307+ $ suiteGeneratorServiceProperty = new ReflectionProperty (SuiteGeneratorService::class, 'INSTANCE ' );
308+ $ suiteGeneratorServiceProperty ->setAccessible (true );
309+ $ suiteGeneratorServiceProperty ->setValue ($ mockSuiteGeneratorService );
310+
311+ $ mockDataParser = $ this ->createMock (TestDataParser::class);
312+ $ mockDataParser
313+ ->method ('readTestData ' )
314+ ->willReturn ($ testData );
315+
316+ $ mockSuiteDataParser = $ this ->createMock (SuiteDataParser::class);
317+ $ mockSuiteDataParser
318+ ->method ('readSuiteData ' )
319+ ->willReturn ($ suiteData );
320+
321+ $ mockGroupClass = $ this ->createMock (GroupClassGenerator::class);
322+ $ mockGroupClass
323+ ->method ('generateGroupClass ' )
324+ ->willReturn ('namespace ' );
325+
326+ $ objectManager = ObjectManagerFactory::getObjectManager ();
327+
328+ $ objectManagerMockInstance = $ this ->createMock (ObjectManager::class);
329+ $ objectManagerMockInstance
330+ ->method ('create ' )
331+ ->will (
332+ $ this ->returnCallback (
333+ function (string $ class , array $ arguments = []) use (
334+ $ mockDataParser ,
335+ $ mockSuiteDataParser ,
336+ $ mockGroupClass ,
337+ $ objectManager
338+ ) {
339+ if ($ class == TestDataParser::class) {
340+ return $ mockDataParser ;
341+ }
342+ if ($ class == SuiteDataParser::class) {
343+ return $ mockSuiteDataParser ;
344+ }
345+ if ($ class == GroupClassGenerator::class) {
346+ return $ mockGroupClass ;
347+ }
348+
349+ return $ objectManager ->create ($ class , $ arguments );
350+ }
351+ )
352+ );
353+
354+ $ objectManagerProperty = new ReflectionProperty (ObjectManager::class, 'instance ' );
355+ $ objectManagerProperty ->setAccessible (true );
356+ $ objectManagerProperty ->setValue ($ objectManagerMockInstance );
357+ }
358+
359+ /**
360+ * Function used to clear mock properties.
361+ *
362+ * @return void
286363 */
287- private function setMockTestAndSuiteParserOutput ( $ testData , $ suiteData )
364+ private function clearMockResolverProperties (): void
288365 {
289- $ property = new \ ReflectionProperty (SuiteGenerator::class, 'instance ' );
366+ $ property = new ReflectionProperty (SuiteGenerator::class, 'instance ' );
290367 $ property ->setAccessible (true );
291368 $ property ->setValue (null );
292369
293370 // clear test object handler value to inject parsed content
294- $ property = new \ ReflectionProperty (TestObjectHandler::class, 'testObjectHandler ' );
371+ $ property = new ReflectionProperty (TestObjectHandler::class, 'testObjectHandler ' );
295372 $ property ->setAccessible (true );
296373 $ property ->setValue (null );
297374
298375 // clear suite object handler value to inject parsed content
299- $ property = new \ ReflectionProperty (SuiteObjectHandler::class, 'instance ' );
376+ $ property = new ReflectionProperty (SuiteObjectHandler::class, 'instance ' );
300377 $ property ->setAccessible (true );
301378 $ property ->setValue (null );
302-
303- $ mockDataParser = AspectMock::double (TestDataParser::class, ['readTestData ' => $ testData ])->make ();
304- $ mockSuiteDataParser = AspectMock::double (SuiteDataParser::class, ['readSuiteData ' => $ suiteData ])->make ();
305- $ mockGroupClass = AspectMock::double (
306- GroupClassGenerator::class,
307- ['generateGroupClass ' => 'namespace ' ]
308- )->make ();
309- $ mockSuiteClass = AspectMock::double (SuiteGenerator::class, ['generateRelevantGroupTests ' => null ])->make ();
310- $ instance = AspectMock::double (
311- ObjectManager::class,
312- ['create ' => function ($ clazz ) use (
313- $ mockDataParser ,
314- $ mockSuiteDataParser ,
315- $ mockGroupClass ,
316- $ mockSuiteClass
317- ) {
318- if ($ clazz == TestDataParser::class) {
319- return $ mockDataParser ;
320- }
321- if ($ clazz == SuiteDataParser::class) {
322- return $ mockSuiteDataParser ;
323- }
324- if ($ clazz == GroupClassGenerator::class) {
325- return $ mockGroupClass ;
326- }
327- if ($ clazz == SuiteGenerator::class) {
328- return $ mockSuiteClass ;
329- }
330- }]
331- )->make ();
332- // bypass the private constructor
333- AspectMock::double (ObjectManagerFactory::class, ['getObjectManager ' => $ instance ]);
334-
335- $ property = new \ReflectionProperty (SuiteGenerator::class, 'groupClassGenerator ' );
336- $ property ->setAccessible (true );
337- $ property ->setValue ($ instance , $ instance );
338379 }
339380
340381 /**
341- * clean up function runs after each test
382+ * @inheritDoc
342383 */
343- public function tearDown (): void
384+ protected function tearDown (): void
344385 {
345386 GenerationErrorHandler::getInstance ()->reset ();
346387 }
347388
348389 /**
349- * clean up function runs after all tests
390+ * @inheritDoc
350391 */
351392 public static function tearDownAfterClass (): void
352393 {
353- TestLoggingUtil::getInstance ()->clearMockLoggingUtil ();
354394 parent ::tearDownAfterClass ();
395+
396+ $ objectManagerProperty = new ReflectionProperty (ObjectManager::class, 'instance ' );
397+ $ objectManagerProperty ->setAccessible (true );
398+ $ objectManagerProperty ->setValue (null );
399+
400+ $ suiteGeneratorServiceProperty = new ReflectionProperty (SuiteGeneratorService::class, 'INSTANCE ' );
401+ $ suiteGeneratorServiceProperty ->setAccessible (true );
402+ $ suiteGeneratorServiceProperty ->setValue (null );
403+
404+ TestLoggingUtil::getInstance ()->clearMockLoggingUtil ();
355405 }
356406}
0 commit comments