public function testPaymentMethods() { $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this); $invoker(function ($configFile, $moduleName) { $config = simplexml_load_file($configFile); $nodes = $config->xpath('/config/default/payment/*/model') ?: []; $formalModuleName = str_replace('_', '\\', $moduleName); foreach ($nodes as $node) { if (!Classes::isVirtual((string) $node)) { $this->assertStringStartsWith($formalModuleName . '\\Model\\', (string) $node, "'{$node}' payment method is declared in '{$configFile}' module, " . "but doesn't belong to '{$moduleName}' module"); } } }, $this->paymentMethodsDataProvider()); }
/** * Validate DI config file * * @param string $file */ protected function _validateFile($file) { $dom = new \DOMDocument(); $dom->load($file); $data = $this->_mapper->convert($dom); foreach ($data as $instanceName => $parameters) { if (!isset($parameters['parameters']) || empty($parameters['parameters'])) { continue; } if (\Magento\Framework\App\Utility\Classes::isVirtual($instanceName)) { $instanceName = \Magento\Framework\App\Utility\Classes::resolveVirtualType($instanceName); } if (!$this->_classExistsAsReal($instanceName)) { continue; } $reflectionClass = new \ReflectionClass($instanceName); $constructor = $reflectionClass->getConstructor(); if (!$constructor) { $this->fail('Class ' . $instanceName . ' does not have __constructor'); } $parameters = $parameters['parameters']; $classParameters = $constructor->getParameters(); foreach ($classParameters as $classParameter) { $parameterName = $classParameter->getName(); if (array_key_exists($parameterName, $parameters)) { unset($parameters[$parameterName]); } } $message = 'Configuration of ' . $instanceName . ' contains data for non-existed parameters: ' . implode(', ', array_keys($parameters)); $this->assertEmpty($parameters, $message); } }
/** * Check whether specified classes correspond to a file according PSR-0 standard * * Cyclomatic complexity is because of temporary marking test as incomplete * Suppressing "unused variable" because of the "catch" block * * @param array $classes * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ protected function _assertClassesExist($classes, $path) { if (!$classes) { return; } $badClasses = []; $badUsages = []; foreach ($classes as $class) { try { if (strrchr($class, '\\') === false and !Classes::isVirtual($class)) { $badUsages[] = $class; continue; } else { $this->assertTrue(isset(self::$_existingClasses[$class]) || Files::init()->classFileExists($class) || Classes::isVirtual($class) || Classes::isAutogenerated($class)); } self::$_existingClasses[$class] = 1; } catch (\PHPUnit_Framework_AssertionFailedError $e) { $badClasses[] = $class; } } if ($badClasses) { $this->fail("Files not found for following usages in {$path}:\n" . implode("\n", $badClasses)); } if ($badUsages) { $this->fail("Bad usages of classes in {$path}: \n" . implode("\n", $badUsages)); } }