Passed
Push — master ( 59ab14...8278b6 )
by Alexander
06:48
created

TestCase::removeAssets()   B

Complexity

Conditions 7
Paths 5

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 12
c 1
b 0
f 0
nc 5
nop 1
dl 0
loc 21
rs 8.8333
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Assets\Tests;
6
7
use Yiisoft\Composer\Config\Builder;
8
use PHPUnit\Framework\TestCase as BaseTestCase;
9
use Psr\Container\ContainerInterface;
10
use Psr\Log\LoggerInterface;
11
use Yiisoft\Aliases\Aliases;
12
use Yiisoft\Assets\AssetBundle;
13
use Yiisoft\Assets\AssetManager;
14
use Yiisoft\Assets\AssetPublisher;
15
use Yiisoft\Files\FileHelper;
16
use Yiisoft\Di\Container;
17
18
abstract class TestCase extends BaseTestCase
19
{
20
    /**
21
     * @var ContainerInterface $container
22
     */
23
    private $container;
24
25
    /**
26
     * @var Aliases $aliases
27
     */
28
    protected $aliases;
29
30
    /**
31
     * @var AssetManager $assetManager
32
     */
33
    protected $assetManager;
34
35
    /**
36
     * @var AssetPublisher $assetPublisher
37
     */
38
    protected $publisher;
39
40
    /**
41
     * @var LoggerInterface $logger
42
     */
43
    protected $logger;
44
45
    /**
46
     * setUp
47
     *
48
     * @return void
49
     */
50
    protected function setUp(): void
51
    {
52
        parent::setUp();
53
54
        $config = require Builder::path('tests');
55
56
        $this->container = new Container($config);
57
58
        $this->aliases = $this->container->get(Aliases::class);
59
        $this->assetManager = $this->container->get(AssetManager::class);
60
        $this->logger = $this->container->get(LoggerInterface::class);
61
        $this->publisher = $this->container->get(AssetPublisher::class);
62
63
        $this->removeAssets('@basePath');
64
    }
65
66
    /**
67
     * tearDown
68
     *
69
     * @return void
70
     */
71
    protected function tearDown(): void
72
    {
73
        $this->container = null;
74
        parent::tearDown();
75
    }
76
77
    /**
78
     * Asserting two strings equality ignoring line endings.
79
     * @param string $expected
80
     * @param string $actual
81
     * @param string $message
82
     *
83
     * @return void
84
     */
85
    protected function assertEqualsWithoutLE(string $expected, string $actual, string $message = ''): void
86
    {
87
        $expected = str_replace("\r\n", "\n", $expected);
88
        $actual = str_replace("\r\n", "\n", $actual);
89
90
        $this->assertEquals($expected, $actual, $message);
91
    }
92
93
    protected function removeAssets(string $basePath): void
94
    {
95
        $handle = opendir($dir = $this->aliases->get($basePath));
96
97
        if ($handle === false) {
98
            throw new \Exception("Unable to open directory: $dir");
99
        }
100
101
        while (($file = readdir($handle)) !== false) {
102
            if ($file === '.' || $file === '..' || $file === '.gitignore') {
103
                continue;
104
            }
105
            $path = $dir . DIRECTORY_SEPARATOR . $file;
106
            if (is_dir($path)) {
107
                FileHelper::removeDirectory($path);
108
            } else {
109
                FileHelper::unlink($path);
110
            }
111
        }
112
113
        closedir($handle);
114
    }
115
116
    /**
117
     * Verify sources publish files assetbundle.
118
     *
119
     * @param string $type
120
     * @param AssetBundle $bundle
121
     *
122
     * @return void
123
     */
124
    protected function sourcesPublishVerifyFiles(string $type, AssetBundle $bundle): void
125
    {
126
        foreach ($bundle->$type as $filename) {
127
            $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename;
128
            $sourceFile = $this->aliases->get($bundle->sourcePath) . DIRECTORY_SEPARATOR . $filename;
129
130
            $this->assertFileExists($publishedFile);
131
            $this->assertFileEquals($publishedFile, $sourceFile);
132
        }
133
134
        $this->assertDirectoryExists($bundle->basePath . DIRECTORY_SEPARATOR . $type);
135
    }
136
137
    /**
138
     * Properly removes symlinked directory under Windows, MacOS and Linux.
139
     *
140
     * @param string $file path to symlink
141
     *
142
     * @return bool
143
     */
144
    protected function unlink(string $file): bool
145
    {
146
        return FileHelper::unlink($file);
147
    }
148
}
149