Completed
Push — master ( 9017e2...865595 )
by Alexander
03:30
created

ViewTest::testDefaultParameterIsPassedToView()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

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