Passed
Pull Request — master (#75)
by
unknown
12:45 queued 47s
created

ViewTest   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 16
eloc 81
c 0
b 0
f 0
dl 0
loc 161
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A testExceptionOnRenderFile() 0 26 2
A testRelativePathInView() 0 23 1
A testDefaultParameterIsPassedToView() 0 9 1
A testPlaceholderSalt() 0 8 1
A tearDown() 0 4 1
B createFileStructure() 0 15 7
A testLocalizedDirectory() 0 23 1
A testDefaultParameterIsOverwrittenByLocalParameter() 0 11 1
A setUp() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\View\Tests;
6
7
use hiqdev\composer\config\Builder;
8
use Yiisoft\Di\Container;
9
use Yiisoft\Files\FileHelper;
10
use Yiisoft\View\DynamicContentAwareInterface;
11
use Yiisoft\View\DynamicContentAwareTrait;
12
use Yiisoft\View\Theme;
13
use Yiisoft\View\View;
14
15
/**
16
 * ViewTest.
17
 */
18
final class ViewTest extends \Yiisoft\View\Tests\TestCase
19
{
20
    /**
21
     * @var string path for the test files.
22
     */
23
    private $testViewPath = '';
24
25
    public function setUp(): void
26
    {
27
        parent::setUp();
28
29
        $this->testViewPath = sys_get_temp_dir() . '/' . str_replace('\\', '_', get_class($this)) . uniqid('', false);
30
31
        FileHelper::createDirectory($this->testViewPath);
32
    }
33
34
    public function tearDown(): void
35
    {
36
        parent::tearDown();
37
        FileHelper::removeDirectory($this->testViewPath);
38
    }
39
40
    /**
41
     * @see https://github.com/yiisoft/yii2/issues/13058
42
     */
43
    public function testExceptionOnRenderFile(): void
44
    {
45
        $view = $this->createView($this->testViewPath);
46
47
        $exceptionViewFile = $this->testViewPath . DIRECTORY_SEPARATOR . 'exception.php';
48
        file_put_contents($exceptionViewFile, <<<'PHP'
49
<h1>Exception</h1>
50
<?php throw new Exception('Test Exception'); ?>
51
PHP
52
        );
53
        $normalViewFile = $this->testViewPath . DIRECTORY_SEPARATOR . 'no-exception.php';
54
        file_put_contents($normalViewFile, <<<'PHP'
55
<h1>No Exception</h1>
56
PHP
57
        );
58
59
        $obInitialLevel = ob_get_level();
60
61
        try {
62
            $view->renderFile($exceptionViewFile);
63
        } catch (\Exception $e) {
64
            // shutdown exception
65
        }
66
        $view->renderFile($normalViewFile);
67
68
        $this->assertEquals($obInitialLevel, ob_get_level());
69
    }
70
71
    public function testRelativePathInView(): void
72
    {
73
        $themePath = $this->testViewPath . '/theme1';
74
        FileHelper::createDirectory($themePath);
75
76
        $baseView = "{$this->testViewPath}/theme1/base.php";
77
        file_put_contents($baseView, <<<'PHP'
78
<?= $this->render("sub") ?>
79
PHP
80
        );
81
82
        $subView = "{$this->testViewPath}/sub.php";
83
        $subViewContent = 'subviewcontent';
84
        file_put_contents($subView, $subViewContent);
85
86
        $view = $this->createView(
87
            $this->testViewPath,
88
            new Theme([
89
                $this->testViewPath => $themePath,
90
            ])
91
        );
92
93
        $this->assertSame($subViewContent, $view->render('//base'));
94
    }
95
96
    public function testLocalizedDirectory(): void
97
    {
98
        $view = $this->createView($this->testViewPath);
99
        $this->createFileStructure([
100
            'views' => [
101
                'faq.php' => 'English FAQ',
102
                'de-DE' => [
103
                    'faq.php' => 'German FAQ',
104
                ],
105
            ],
106
        ], $this->testViewPath);
107
        $viewFile = $this->testViewPath . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'faq.php';
108
        $sourceLanguage = 'en-US';
109
110
        // Source language and target language are same. The view path should be unchanged.
111
        $currentLanguage = $sourceLanguage;
112
        $this->assertSame($viewFile, $view->localize($viewFile, $currentLanguage, $sourceLanguage));
113
114
        // Source language and target language are different. The view path should be changed.
115
        $currentLanguage = 'de-DE';
116
        $this->assertSame(
117
            $this->testViewPath . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . $currentLanguage . DIRECTORY_SEPARATOR . 'faq.php',
118
            $view->localize($viewFile, $currentLanguage, $sourceLanguage)
119
        );
120
    }
121
122
    /**
123
     * Creates test files structure.
124
     * @param string $baseDirectory base directory path.
125
     * @param array $items file system objects to be created in format: objectName => objectContent
126
     * Arrays specifies directories, other values - files.
127
     */
128
    private function createFileStructure(array $items, string $baseDirectory = null): void
129
    {
130
        foreach ($items as $name => $content) {
131
            $itemName = $baseDirectory . '/' . $name;
132
            if (\is_array($content)) {
133
                if (isset($content[0], $content[1]) && $content[0] === 'symlink') {
134
                    symlink($baseDirectory . DIRECTORY_SEPARATOR . $content[1], $itemName);
135
                } else {
136
                    if (!mkdir($itemName, 0777, true) && !is_dir($itemName)) {
137
                        throw new \RuntimeException(sprintf('Directory "%s" was not created', $itemName));
138
                    }
139
                    $this->createFileStructure($content, $itemName);
140
                }
141
            } else {
142
                file_put_contents($itemName, $content);
143
            }
144
        }
145
    }
146
147
    public function testDefaultParameterIsPassedToView(): void
148
    {
149
        $config = require Builder::path('tests');
150
151
        $container = new Container($config);
152
        $view = $container->get(View::class);
153
        $view->setDefaultParameters(['parameter' => 'default_parameter']);
154
        $output = $view->render('//parameters');
155
        $this->assertStringContainsString('default_parameter', $output);
156
    }
157
158
    public function testDefaultParameterIsOverwrittenByLocalParameter(): void
159
    {
160
        $config = require Builder::path('tests');
161
162
        $container = new Container($config);
163
        $view = $container->get(View::class);
164
        $view->setDefaultParameters(['parameter' => 'default_parameter']);
165
        $output = $view->render('//parameters', [
166
            'parameter' => 'local_parameter',
167
        ]);
168
        $this->assertStringContainsString('local_parameter', $output);
169
    }
170
171
    public function testPlaceholderSalt(): void
172
    {
173
        $config = require Builder::path('tests');
174
175
        $container = new Container($config);
176
        $view = $container->get(View::class);
177
        $view->setPlaceholderSalt('apple');
178
        $this->assertSame(md5('apple'), $view->getPlaceholderSignature());
179
    }
180
}
181