mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-11-04 06:11:37 +01:00 
			
		
		
		
	Adds support for PHP8.0, dropping support for PHP7.0 and below.
Backwards incompatible changes:
- Dropped support for php asp tags in templates (removed from php since php7.0)
- Dropped deprecated API calls that where only accessible through SmartyBC
- Dropped support for {php} and {include_php} tags and embedded PHP in templates. Embedded PHP will now be passed through as is.
- Removed all PHP_VERSION_ID and compare_version checks and conditional code blocks that are now no longer required
- Dropped deprecated SMARTY_RESOURCE_CHAR_SET and SMARTY_RESOURCE_DATE_FORMAT constants
- Dropped deprecated Smarty::muteExpectedErrors and Smarty::unmuteExpectedErrors API methods
- Dropped deprecated $smarty->getVariable() method. Use $smarty->getTemplateVars() instead.
- $smarty->registerResource() no longer accepts an array of callback functions
See the changelog for more details.
Switched CI from Travis to Github CI.
		
	
		
			
				
	
	
		
			455 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			455 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Smarty PHPunit tests for deleting compiled templates
 | 
						|
 *
 | 
						|
 * @package PHPunit
 | 
						|
 * @author  Uwe Tews
 | 
						|
 * @author  Rodney Rehm
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * class for delete compiled template tests
 | 
						|
 *
 | 
						|
 * @runTestsInSeparateProcess
 | 
						|
 * @preserveGlobalState disabled
 | 
						|
 * @backupStaticAttributes enabled
 | 
						|
 */
 | 
						|
class ClearCompiledTest extends PHPUnit_Smarty
 | 
						|
{
 | 
						|
    public $methodName = null;
 | 
						|
    public function setUp(): void
 | 
						|
    {
 | 
						|
        $this->setUpSmarty(dirname(__FILE__));
 | 
						|
        $this->smarty->addTemplateDir('./templates_2/');
 | 
						|
        $this->methodName = 'clearCompiledTemplate';
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    public function testInit()
 | 
						|
    {
 | 
						|
        $this->cleanDirs();
 | 
						|
    }
 | 
						|
    // helpers
 | 
						|
    /**
 | 
						|
     * clear $smarty->compile_dir
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function clearFiles()
 | 
						|
    {
 | 
						|
        $this->cleanCompileDir();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * list of compiled files
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $_files = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * generate compiled files
 | 
						|
     *
 | 
						|
     * @uses $_files to store references
 | 
						|
     * @return array list of files array( id => path )
 | 
						|
     */
 | 
						|
    protected function makeFiles()
 | 
						|
    {
 | 
						|
        $this->_files = array();
 | 
						|
        $directory_length = strlen($this->getSmartyObj()->getCompileDir());
 | 
						|
        $templates = array(
 | 
						|
            'helloworld.tpl'                => array(null, 'compile1', 'compile2'),
 | 
						|
            'helloworld2.tpl'               => array(null, 'compile1', 'compile2'),
 | 
						|
            'ambiguous/case1/foobar.tpl'    => array(null, 'compile1', 'compile2'),
 | 
						|
            '[1]ambiguous/case1/foobar.tpl' => array(null, 'compile1', 'compile2'),
 | 
						|
        );
 | 
						|
 | 
						|
        foreach ($templates as $template => $compile_ids) {
 | 
						|
            foreach ($compile_ids as $compile_id) {
 | 
						|
                $tpl = $this->getSmartyObj()->createTemplate($template, null, $compile_id);
 | 
						|
                $tpl->fetch();
 | 
						|
                $this->_files[$template . '#' . $compile_id] = substr($tpl->compiled->filepath, $directory_length);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        // TODO
 | 
						|
        //Smarty::$_resource_cache = array();
 | 
						|
        //$this->getSmartyObj()->_cache['template_objects'] = array();
 | 
						|
 | 
						|
        return $this->_files;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Transform $id to $path
 | 
						|
     *
 | 
						|
     * @param  array $keys IDs like "template#compile_id"
 | 
						|
     *
 | 
						|
     * @return array list of (sorted) compiled file paths
 | 
						|
     */
 | 
						|
    protected function expectFiles($keys)
 | 
						|
    {
 | 
						|
        $files = array();
 | 
						|
        foreach ($keys as $key) {
 | 
						|
            if (isset($this->_files[$key])) {
 | 
						|
                $files[] = $this->_files[$key];
 | 
						|
            }
 | 
						|
        }
 | 
						|
        sort($files);
 | 
						|
 | 
						|
        return $files;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * update mtime of compiled files
 | 
						|
     *
 | 
						|
     * @param  array  $keys   IDs like "template#compile_id"
 | 
						|
     * @param  string $offset time offset added to time()
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function touchFiles($keys, $offset = 0)
 | 
						|
    {
 | 
						|
        $base = $this->getSmartyObj()->getCompileDir();
 | 
						|
        $time = time();
 | 
						|
        foreach ($keys as $key) {
 | 
						|
            if (isset($this->_files[$key])) {
 | 
						|
                file_put_contents($base . $this->_files[$key], ' #');
 | 
						|
                touch($base . $this->_files[$key], $time + $offset);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        clearstatcache();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * find all compiled files
 | 
						|
     *
 | 
						|
     * @return array list of (sorted) compiled file paths
 | 
						|
     */
 | 
						|
    protected function getFiles()
 | 
						|
    {
 | 
						|
        $directory = realpath($this->getSmartyObj()->getCompileDir());
 | 
						|
        if (!$directory) {
 | 
						|
            return array();
 | 
						|
        }
 | 
						|
 | 
						|
        $directory_length = strlen($directory);
 | 
						|
        $files = array();
 | 
						|
 | 
						|
        $di = new RecursiveDirectoryIterator($directory);
 | 
						|
        $it = new RecursiveIteratorIterator($di);
 | 
						|
        foreach ($it as $file) {
 | 
						|
            $_file = $file->__toString();
 | 
						|
            // skip anything with a /. in it.
 | 
						|
            if (preg_match("#[\\\\/]\.#", $_file) || substr((string)$file,-4) === '.txt' || !$file->isFile()) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
 | 
						|
            $files[] = substr($file->__toString(), $directory_length + 1);
 | 
						|
        }
 | 
						|
        sort($files);
 | 
						|
 | 
						|
        return $files;
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate(null, null, null)
 | 
						|
    public function testClearAll()
 | 
						|
    {
 | 
						|
        $this->runClearAll(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearAll()
 | 
						|
    {
 | 
						|
        $this->runClearAll(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearAll($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array();
 | 
						|
        $this->assertEquals(12, $this->getSmartyObj()->{$this->methodName}());
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate($template, null, null)
 | 
						|
    public function testClearTemplate()
 | 
						|
    {
 | 
						|
        $this->runClearTemplate(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearTemplate()
 | 
						|
    {
 | 
						|
        $this->runClearTemplate(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testClearOtherTemplate()
 | 
						|
    {
 | 
						|
        $this->runClearOtherTemplate(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearOtherTemplate()
 | 
						|
    {
 | 
						|
        $this->runClearOtherTemplate(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearTemplate($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile1', 'helloworld2.tpl#compile2',
 | 
						|
            'ambiguous/case1/foobar.tpl#', 'ambiguous/case1/foobar.tpl#compile1', 'ambiguous/case1/foobar.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile1', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $this->assertEquals(3, $this->getSmartyObj()->{$this->methodName}('helloworld.tpl'));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearOtherTemplate($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array_keys($this->_files);
 | 
						|
        $this->assertEquals(0, $this->getSmartyObj()->{$this->methodName}('foobar.tpl'));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate(null, $cache_id, null)
 | 
						|
    public function testClearCompileid()
 | 
						|
    {
 | 
						|
        $this->runClearCompileid(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearCompileid()
 | 
						|
    {
 | 
						|
        $this->runClearCompileid(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testClearOtherCompileid()
 | 
						|
    {
 | 
						|
        $this->runClearOtherCompileid(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearOtherCompileid()
 | 
						|
    {
 | 
						|
        $this->runClearOtherCompileid(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearCompileid($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld.tpl#', 'helloworld.tpl#compile2',
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile2',
 | 
						|
            'ambiguous/case1/foobar.tpl#', 'ambiguous/case1/foobar.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $count = $this->getSmartyObj()->{$this->methodName}(null, 'compile1');
 | 
						|
        $this->assertEquals(4, $count);
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearOtherCompileid($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array_keys($this->_files);
 | 
						|
        $this->assertEquals(0, $this->getSmartyObj()->{$this->methodName}(null, 'other'));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate(null, null, $expired)
 | 
						|
    public function testClearExpired()
 | 
						|
    {
 | 
						|
        $this->runClearExpired(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearExpired()
 | 
						|
    {
 | 
						|
        $this->runClearExpired(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearExpired($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array('helloworld.tpl#', 'helloworld2.tpl#');
 | 
						|
        $this->touchFiles(array_diff(array_keys($this->_files), $expected), - 1000);
 | 
						|
        $this->assertEquals(10, $this->getSmartyObj()->{$this->methodName}(null, null, 500));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate($template, null, $expired)
 | 
						|
    public function testClearTemplateExpired()
 | 
						|
    {
 | 
						|
        $this->runClearTemplateExpired(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearTemplateExpired()
 | 
						|
    {
 | 
						|
        $this->runClearTemplateExpired(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearTemplateExpired($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld.tpl#', 'helloworld.tpl#compile2',
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile1', 'helloworld2.tpl#compile2',
 | 
						|
            'ambiguous/case1/foobar.tpl#', 'ambiguous/case1/foobar.tpl#compile1', 'ambiguous/case1/foobar.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile1', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $this->touchFiles(array('helloworld.tpl#compile1'), - 1000);
 | 
						|
        $this->assertEquals(1, $this->getSmartyObj()->{$this->methodName}("helloworld.tpl", null, 500));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate($template, $cache_id, $expired)
 | 
						|
    public function testClearTemplateCacheidExpired()
 | 
						|
    {
 | 
						|
        $this->runClearTemplateCacheidExpired(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearTemplateCacheidExpired()
 | 
						|
    {
 | 
						|
        $this->runClearTemplateCacheidExpired(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearTemplateCacheidExpired($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld.tpl#', 'helloworld.tpl#compile2',
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile1', 'helloworld2.tpl#compile2',
 | 
						|
            'ambiguous/case1/foobar.tpl#', 'ambiguous/case1/foobar.tpl#compile1', 'ambiguous/case1/foobar.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile1', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $this->touchFiles(array('helloworld.tpl#compile1', 'helloworld.tpl#compile2'), - 1000);
 | 
						|
        $this->assertEquals(1, $this->getSmartyObj()->{$this->methodName}("helloworld.tpl", "compile1", 500));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate(null, $cache_id, $expired)
 | 
						|
    public function testClearCacheidExpired()
 | 
						|
    {
 | 
						|
        $this->runClearCacheidExpired(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearCacheidExpired()
 | 
						|
    {
 | 
						|
        $this->runClearCacheidExpired(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearCacheidExpired($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld.tpl#', 'helloworld.tpl#compile2',
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile1', 'helloworld2.tpl#compile2',
 | 
						|
            'ambiguous/case1/foobar.tpl#', 'ambiguous/case1/foobar.tpl#compile1', 'ambiguous/case1/foobar.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile1', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $this->touchFiles(array('helloworld.tpl#compile1'), - 1000);
 | 
						|
        $this->assertEquals(1, $this->getSmartyObj()->{$this->methodName}(null, "compile1", 500));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    // Smarty::clearCompiledTemplate($template, $cache_id, null)
 | 
						|
    public function testClearTemplateCacheid()
 | 
						|
    {
 | 
						|
        $this->runClearTemplateCacheid(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsClearTemplateCacheid()
 | 
						|
    {
 | 
						|
        $this->runClearTemplateCacheid(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearTemplateCacheid($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld.tpl#', 'helloworld.tpl#compile2',
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile1', 'helloworld2.tpl#compile2',
 | 
						|
            'ambiguous/case1/foobar.tpl#', 'ambiguous/case1/foobar.tpl#compile1', 'ambiguous/case1/foobar.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile1', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $this->assertEquals(1, $this->getSmartyObj()->{$this->methodName}("helloworld.tpl", "compile1"));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
 | 
						|
    public function testClearAmbiguousTemplate()
 | 
						|
    {
 | 
						|
        $this->runClearAmbiguousTemplate(false);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSubsAmbiguousTemplate()
 | 
						|
    {
 | 
						|
        $this->runClearAmbiguousTemplate(true);
 | 
						|
    }
 | 
						|
 | 
						|
    public function runClearAmbiguousTemplate($useSubDirs)
 | 
						|
    {
 | 
						|
        $this->getSmartyObj()->setUseSubDirs($useSubDirs);
 | 
						|
        $this->clearFiles();
 | 
						|
        $this->makeFiles();
 | 
						|
 | 
						|
        // TODO: uwe.tews - shouldn't clearCompiledTemplate("foo.tpl") remove "{$template_dir[0]}/foo.tpl" AND "{$template_dir[1]}/foo.tpl"?
 | 
						|
        // currently it kills only the first one found (through regular template file identification methods)
 | 
						|
 | 
						|
        $expected = array(
 | 
						|
            'helloworld.tpl#', 'helloworld.tpl#compile1', 'helloworld.tpl#compile2',
 | 
						|
            'helloworld2.tpl#', 'helloworld2.tpl#compile1', 'helloworld2.tpl#compile2',
 | 
						|
            '[1]ambiguous/case1/foobar.tpl#', '[1]ambiguous/case1/foobar.tpl#compile1', '[1]ambiguous/case1/foobar.tpl#compile2',
 | 
						|
        );
 | 
						|
        $this->assertEquals(3, $this->getSmartyObj()->{$this->methodName}("ambiguous/case1/foobar.tpl"));
 | 
						|
 | 
						|
        $this->assertEquals($this->expectFiles($expected), $this->getFiles());
 | 
						|
        $this->clearFiles();
 | 
						|
    }
 | 
						|
}
 |