3
3
* Copyright © Magento, Inc. All rights reserved.
4
4
* See COPYING.txt for license details.
5
5
*/
6
+ declare (strict_types=1 );
7
+
6
8
namespace tests \unit \Magento \FunctionalTestFramework \Suite ;
7
9
8
- use AspectMock \ Test as AspectMock ;
10
+ use Exception ;
9
11
use Magento \FunctionalTestingFramework \Exceptions \TestReferenceException ;
10
- use Magento \FunctionalTestingFramework \ObjectManager \ ObjectManager ;
12
+ use Magento \FunctionalTestingFramework \ObjectManager ;
11
13
use Magento \FunctionalTestingFramework \ObjectManagerFactory ;
14
+ use Magento \FunctionalTestingFramework \Suite \Service \SuiteGeneratorService ;
12
15
use Magento \FunctionalTestingFramework \Suite \SuiteGenerator ;
13
16
use Magento \FunctionalTestingFramework \Suite \Generators \GroupClassGenerator ;
14
17
use Magento \FunctionalTestingFramework \Suite \Handlers \SuiteObjectHandler ;
18
21
use Magento \FunctionalTestingFramework \Test \Parsers \TestDataParser ;
19
22
use Magento \FunctionalTestingFramework \Util \GenerationErrorHandler ;
20
23
use Magento \FunctionalTestingFramework \Util \Manifest \DefaultTestManifest ;
24
+ use ReflectionProperty ;
21
25
use tests \unit \Util \MagentoTestCase ;
22
26
use Magento \FunctionalTestingFramework \Util \Manifest \TestManifestFactory ;
23
27
use tests \unit \Util \SuiteDataArrayBuilder ;
24
28
use tests \unit \Util \TestDataArrayBuilder ;
25
29
use tests \unit \Util \TestLoggingUtil ;
26
- use tests \unit \Util \MockModuleResolverBuilder ;
27
30
28
31
class SuiteGeneratorTest extends MagentoTestCase
29
32
{
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
-
41
33
/**
42
34
* Before test functionality
43
35
* @return void
44
36
*/
45
- public function setUp (): void
37
+ protected function setUp (): void
46
38
{
47
39
TestLoggingUtil::getInstance ()->setMockLoggingUtil ();
48
- $ resolverMock = new MockModuleResolverBuilder ();
49
- $ resolverMock ->setup ();
50
40
}
51
41
52
42
/**
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
54
47
*/
55
- public function testGenerateSuite ()
48
+ public function testGenerateSuite (): void
56
49
{
57
50
$ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
58
51
$ mockData = $ suiteDataArrayBuilder
@@ -74,20 +67,23 @@ public function testGenerateSuite()
74
67
75
68
// parse and generate suite object with mocked data
76
69
$ mockSuiteGenerator = SuiteGenerator::getInstance ();
77
- $ mockSuiteGenerator ->generateSuite (" basicTestSuite " );
70
+ $ mockSuiteGenerator ->generateSuite (' basicTestSuite ' );
78
71
79
72
// assert that expected suite is generated
80
73
TestLoggingUtil::getInstance ()->validateMockLogStatement (
81
74
'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 ' ]
84
77
);
85
78
}
86
79
87
80
/**
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
89
85
*/
90
- public function testGenerateAllSuites ()
86
+ public function testGenerateAllSuites (): void
91
87
{
92
88
$ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
93
89
$ mockData = $ suiteDataArrayBuilder
@@ -108,22 +104,25 @@ public function testGenerateAllSuites()
108
104
$ this ->setMockTestAndSuiteParserOutput ($ mockTestData , $ mockData );
109
105
110
106
// parse and retrieve suite object with mocked data
111
- $ exampleTestManifest = new DefaultTestManifest ([], " sample " . DIRECTORY_SEPARATOR . " path " );
107
+ $ exampleTestManifest = new DefaultTestManifest ([], ' sample ' . DIRECTORY_SEPARATOR . ' path ' );
112
108
$ mockSuiteGenerator = SuiteGenerator::getInstance ();
113
109
$ mockSuiteGenerator ->generateAllSuites ($ exampleTestManifest );
114
110
115
111
// assert that expected suites are generated
116
112
TestLoggingUtil::getInstance ()->validateMockLogStatement (
117
113
'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 ' ]
120
116
);
121
117
}
122
118
123
119
/**
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
125
124
*/
126
- public function testGenerateEmptySuite ()
125
+ public function testGenerateEmptySuite (): void
127
126
{
128
127
$ testDataArrayBuilder = new TestDataArrayBuilder ();
129
128
$ mockTestData = $ testDataArrayBuilder
@@ -142,17 +141,20 @@ public function testGenerateEmptySuite()
142
141
$ this ->setMockTestAndSuiteParserOutput ($ mockTestData , $ mockData );
143
142
144
143
// 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 ' );
146
145
147
146
// parse and generate suite object with mocked data
148
147
$ mockSuiteGenerator = SuiteGenerator::getInstance ();
149
- $ mockSuiteGenerator ->generateSuite (" basicTestSuite " );
148
+ $ mockSuiteGenerator ->generateSuite (' basicTestSuite ' );
150
149
}
151
150
152
151
/**
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
154
156
*/
155
- public function testInvalidSuiteTestPair ()
157
+ public function testInvalidSuiteTestPair (): void
156
158
{
157
159
// Mock Suite1 => Test1 and Suite2 => Test2
158
160
$ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
@@ -198,9 +200,12 @@ public function testInvalidSuiteTestPair()
198
200
}
199
201
200
202
/**
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
202
207
*/
203
- public function testNonExistentSuiteTestPair ()
208
+ public function testNonExistentSuiteTestPair (): void
204
209
{
205
210
$ testDataArrayBuilder = new TestDataArrayBuilder ();
206
211
$ mockSimpleTest = $ testDataArrayBuilder
@@ -227,9 +232,12 @@ public function testNonExistentSuiteTestPair()
227
232
}
228
233
229
234
/**
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
231
239
*/
232
- public function testGenerateSplitSuiteFromTest ()
240
+ public function testGenerateSplitSuiteFromTest (): void
233
241
{
234
242
$ suiteDataArrayBuilder = new SuiteDataArrayBuilder ();
235
243
$ mockSuiteData = $ suiteDataArrayBuilder
@@ -272,8 +280,8 @@ public function testGenerateSplitSuiteFromTest()
272
280
// assert last split suite group generated
273
281
TestLoggingUtil::getInstance ()->validateMockLogStatement (
274
282
'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 ' ]
277
285
);
278
286
}
279
287
@@ -282,75 +290,117 @@ public function testGenerateSplitSuiteFromTest()
282
290
*
283
291
* @param array $testData
284
292
* @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
286
363
*/
287
- private function setMockTestAndSuiteParserOutput ( $ testData , $ suiteData )
364
+ private function clearMockResolverProperties (): void
288
365
{
289
- $ property = new \ ReflectionProperty (SuiteGenerator::class, 'instance ' );
366
+ $ property = new ReflectionProperty (SuiteGenerator::class, 'instance ' );
290
367
$ property ->setAccessible (true );
291
368
$ property ->setValue (null );
292
369
293
370
// clear test object handler value to inject parsed content
294
- $ property = new \ ReflectionProperty (TestObjectHandler::class, 'testObjectHandler ' );
371
+ $ property = new ReflectionProperty (TestObjectHandler::class, 'testObjectHandler ' );
295
372
$ property ->setAccessible (true );
296
373
$ property ->setValue (null );
297
374
298
375
// clear suite object handler value to inject parsed content
299
- $ property = new \ ReflectionProperty (SuiteObjectHandler::class, 'instance ' );
376
+ $ property = new ReflectionProperty (SuiteObjectHandler::class, 'instance ' );
300
377
$ property ->setAccessible (true );
301
378
$ 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 );
338
379
}
339
380
340
381
/**
341
- * clean up function runs after each test
382
+ * @inheritDoc
342
383
*/
343
- public function tearDown (): void
384
+ protected function tearDown (): void
344
385
{
345
386
GenerationErrorHandler::getInstance ()->reset ();
346
387
}
347
388
348
389
/**
349
- * clean up function runs after all tests
390
+ * @inheritDoc
350
391
*/
351
392
public static function tearDownAfterClass (): void
352
393
{
353
- TestLoggingUtil::getInstance ()->clearMockLoggingUtil ();
354
394
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 ();
355
405
}
356
406
}
0 commit comments