1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Test\Js;
/**
* Duplicating the same namespace in the "use" below is a workaround to comply with
* \Magento\Test\Integrity\ClassesTest::testClassReferences()
*/
use Magento\Framework\App\Utility\AggregateInvoker;
use Magento\Framework\App\Utility\Files;
/**
* JSHint static code analysis tests for javascript files
*/
class LiveCodeTest extends \PHPUnit_Framework_TestCase
{
/**
* @var string
*/
protected static $_reportFile = '';
/**
* @var array
*/
protected static $_whiteListJsFiles = [];
/**
* @var array
*/
protected static $_blackListJsFiles = [];
/**
* @static Return all files under a path
* @param string $path
* @return array
*/
protected static function _scanJsFile($path)
{
if (is_file($path)) {
return [$path];
}
$path = $path == '' ? __DIR__ : $path;
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
$regexIterator = new \RegexIterator($iterator, '/\\.js$/');
$filePaths = [];
foreach ($regexIterator as $filePath) {
$filePaths[] = $filePath->getPathname();
}
return $filePaths;
}
/**
* @static Setup report file, black list and white list
*
*/
public static function setUpBeforeClass()
{
$reportDir = BP . '/dev/tests/static/report';
if (!is_dir($reportDir)) {
mkdir($reportDir);
}
self::$_reportFile = $reportDir . '/js_report.txt';
@unlink(self::$_reportFile);
$whiteList = Files::init()->readLists(__DIR__ . '/_files/jshint/whitelist/*.txt');
$blackList = Files::init()->readLists(__DIR__ . '/_files/jshint/blacklist/*.txt');
foreach ($blackList as $listFiles) {
self::$_blackListJsFiles = array_merge(self::$_blackListJsFiles, self::_scanJsFile($listFiles));
}
foreach ($whiteList as $listFiles) {
self::$_whiteListJsFiles = array_merge(self::$_whiteListJsFiles, self::_scanJsFile($listFiles));
}
$blackListJsFiles = self::$_blackListJsFiles;
$filter = function ($value) use ($blackListJsFiles) {
return !in_array($value, $blackListJsFiles);
};
self::$_whiteListJsFiles = array_filter(self::$_whiteListJsFiles, $filter);
}
public function testCodeJsHint()
{
return; // Avoid "Failing task since test cases were expected but none were found."
$this->markTestIncomplete('MAGETWO-27639: Enhance JavaScript Static Tests');
$invoker = new AggregateInvoker($this);
$invoker(
/**
* @param string $filename
*/
function ($filename) {
$cmd = new \Magento\TestFramework\Inspection\JsHint\Command($filename, self::$_reportFile);
$result = false;
try {
$result = $cmd->canRun();
} catch (\Exception $e) {
$this->markTestSkipped($e->getMessage());
}
if ($result) {
$this->assertTrue($cmd->run([]), $cmd->getLastRunMessage());
}
},
$this->codeJsHintDataProvider()
);
}
/**
* Build data provider array with command, js file name, and option
* @return array
*/
public function codeJsHintDataProvider()
{
self::setUpBeforeClass();
$map = function ($value) {
return [$value];
};
return array_map($map, self::$_whiteListJsFiles);
}
}