Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SuiteGeneratorTest.php
Go to the documentation of this file.
1 <?php
7 
8 use AspectMock\Test as AspectMock;
23 
25 {
26 
30  public static function setUpBeforeClass()
31  {
32  AspectMock::double(SuiteGenerator::class, [
33  'clearPreviousSessionConfigEntries' => null,
34  'appendEntriesToConfig' => null
35  ]);
36  }
37 
42  public function setUp()
43  {
44  TestLoggingUtil::getInstance()->setMockLoggingUtil();
45  }
46 
51  public function testGenerateSuite()
52  {
53  $suiteDataArrayBuilder = new SuiteDataArrayBuilder();
54  $mockData = $suiteDataArrayBuilder
55  ->withName('basicTestSuite')
56  ->withAfterHook()
57  ->withBeforeHook()
58  ->includeTests(['simpleTest'])
59  ->includeGroups(['group1'])
60  ->build();
61 
62  $testDataArrayBuilder = new TestDataArrayBuilder();
63  $mockSimpleTest = $testDataArrayBuilder
64  ->withName('simpleTest')
65  ->withTestActions()
66  ->build();
67 
68  $mockTestData = ['tests' => array_merge($mockSimpleTest)];
69  $this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
70 
71  // parse and generate suite object with mocked data
72  $mockSuiteGenerator = SuiteGenerator::getInstance();
73  $mockSuiteGenerator->generateSuite("basicTestSuite");
74 
75  // assert that expected suite is generated
76  TestLoggingUtil::getInstance()->validateMockLogStatement(
77  'info',
78  "suite generated",
79  ['suite' => 'basicTestSuite', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "basicTestSuite"]
80  );
81  }
82 
87  public function testGenerateAllSuites()
88  {
89  $suiteDataArrayBuilder = new SuiteDataArrayBuilder();
90  $mockData = $suiteDataArrayBuilder
91  ->withName('basicTestSuite')
92  ->withAfterHook()
93  ->withBeforeHook()
94  ->includeTests(['simpleTest'])
95  ->includeGroups(['group1'])
96  ->build();
97 
98  $testDataArrayBuilder = new TestDataArrayBuilder();
99  $mockSimpleTest = $testDataArrayBuilder
100  ->withName('simpleTest')
101  ->withTestActions()
102  ->build();
103 
104  $mockTestData = ['tests' => array_merge($mockSimpleTest)];
105  $this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
106 
107  // parse and retrieve suite object with mocked data
108  $exampleTestManifest = new DefaultTestManifest([], "sample" . DIRECTORY_SEPARATOR . "path");
109  $mockSuiteGenerator = SuiteGenerator::getInstance();
110  $mockSuiteGenerator->generateAllSuites($exampleTestManifest);
111 
112  // assert that expected suites are generated
113  TestLoggingUtil::getInstance()->validateMockLogStatement(
114  'info',
115  "suite generated",
116  ['suite' => 'basicTestSuite', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "basicTestSuite"]
117  );
118  }
119 
124  public function testGenerateEmptySuite()
125  {
126  $suiteDataArrayBuilder = new SuiteDataArrayBuilder();
127  $mockData = $suiteDataArrayBuilder
128  ->withName('basicTestSuite')
129  ->build();
130  unset($mockData['suites']['basicTestSuite'][TestObjectExtractor::TEST_BEFORE_HOOK]);
131  unset($mockData['suites']['basicTestSuite'][TestObjectExtractor::TEST_AFTER_HOOK]);
132 
133  $mockTestData = null;
134  $this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
135 
136  // set expected error message
137  $this->expectExceptionMessage("Suites must not be empty. Suite: \"basicTestSuite\"");
138 
139  // parse and generate suite object with mocked data
140  $mockSuiteGenerator = SuiteGenerator::getInstance();
141  $mockSuiteGenerator->generateSuite("basicTestSuite");
142  }
143 
150  private function setMockTestAndSuiteParserOutput($testData, $suiteData)
151  {
152  $property = new \ReflectionProperty(SuiteGenerator::class, 'SUITE_GENERATOR_INSTANCE');
153  $property->setAccessible(true);
154  $property->setValue(null);
155 
156  // clear test object handler value to inject parsed content
157  $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler');
158  $property->setAccessible(true);
159  $property->setValue(null);
160 
161  // clear suite object handler value to inject parsed content
162  $property = new \ReflectionProperty(SuiteObjectHandler::class, 'SUITE_OBJECT_HANLDER_INSTANCE');
163  $property->setAccessible(true);
164  $property->setValue(null);
165 
166  $mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make();
167  $mockSuiteDataParser = AspectMock::double(SuiteDataParser::class, ['readSuiteData' => $suiteData])->make();
168  $mockGroupClass = AspectMock::double(
169  GroupClassGenerator::class,
170  ['generateGroupClass' => 'namespace']
171  )->make();
172  $mockSuiteClass = AspectMock::double(SuiteGenerator::class, ['generateRelevantGroupTests' => null])->make();
173  $instance = AspectMock::double(
174  ObjectManager::class,
175  ['create' => function ($clazz) use (
176  $mockDataParser,
177  $mockSuiteDataParser,
178  $mockGroupClass,
179  $mockSuiteClass
180  ) {
181  if ($clazz == TestDataParser::class) {
182  return $mockDataParser;
183  }
184  if ($clazz == SuiteDataParser::class) {
185  return $mockSuiteDataParser;
186  }
187  if ($clazz == GroupClassGenerator::class) {
188  return $mockGroupClass;
189  }
190  if ($clazz == SuiteGenerator::class) {
191  return $mockSuiteClass;
192  }
193  }]
194  )->make();
195  // bypass the private constructor
196  AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]);
197 
198  $property = new \ReflectionProperty(SuiteGenerator::class, 'groupClassGenerator');
199  $property->setAccessible(true);
200  $property->setValue($instance, $instance);
201  }
202 
206  public static function tearDownAfterClass()
207  {
208  TestLoggingUtil::getInstance()->clearMockLoggingUtil();
209  parent::tearDownAfterClass();
210  }
211 }