Source of file ThemeContext.php
Size: 3,608 Bytes - Last Modified: 2021-12-23T10:28:18+00:00
/var/www/docs.ssmods.com/process/src/tests/behat/src/ThemeContext.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | <?php namespace SilverStripe\CMS\Tests\Behaviour; use Behat\Behat\Context\Context; use SilverStripe\BehatExtension\Context\MainContextAwareTrait; /** * Context used to create fixtures in the SilverStripe ORM. */ class ThemeContext implements Context { use MainContextAwareTrait; protected $restoreFiles = []; protected $restoreDirectories = []; /** * Create a test theme * * @Given /^a theme "(?<theme>[^"]+)"/ * @param string $theme */ public function stepCreateTheme($theme) { if (!preg_match('/^[0-9a-zA-Z_-]+$/', $theme)) { throw new \InvalidArgumentException("Bad theme '$theme'"); } $this->requireDir(BASE_PATH . '/themes'); $this->requireDir(BASE_PATH . '/themes/' . $theme); $this->requireDir(BASE_PATH . '/themes/' . $theme . '/templates'); } /** * Create a template within a test theme * * @Given /^a template "(?<template>[^"]+)" in theme "(?<theme>[^"]+)" with content "(?<content>[^"]+)"/ * @param string $template * @param string $theme * @param string $content */ public function stepCreateTemplate($template, $theme, $content) { if (!preg_match('/^[0-9a-zA-Z_-]+$/', $theme)) { throw new \InvalidArgumentException("Bad theme '$theme'"); } if (!preg_match('/^(Layout\/)?[0-9a-zA-Z_-]+\.ss$/', $template)) { throw new \InvalidArgumentException("Bad template '$template'"); } $this->stepCreateTheme($theme); $this->requireFile(BASE_PATH . '/themes/' . $theme . '/templates/' . $template, $content); } protected function requireFile($filename, $content) { // Already exists if (file_exists($filename)) { // If the content is different, remember old content for restoration $origContent = file_get_contents($filename); if ($origContent != $content) { file_put_contents($filename, $content); $this->restoreFiles[$filename] = $origContent; } // Doesn't exist, mark it for deletion after test } else { file_put_contents($filename, $content); $this->restoreFiles[$filename] = null; } } protected function requireDir($dirname) { // Directory doesn't exist, create it and mark it for deletion if (!file_exists($dirname)) { mkdir($dirname); $this->restoreDirectories[] = $dirname; } } /** * Clean up any theme manipulation * * @AfterScenario */ public function cleanThemesAfterScenario() { // Restore any created/modified files. // - If modified, revert then to original contnet // - If created, delete them if ($this->restoreFiles) { foreach ($this->restoreFiles as $file => $origContent) { if ($origContent === null) { unlink($file); } else { file_put_contents($file, $origContent); } } $this->restoreFiles = []; } // Restore any created directories: that is, delete them if ($this->restoreDirectories) { // Flip the order so that nested direcotires are unlinked() first $this->restoreDirectories = array_reverse($this->restoreDirectories); foreach ($this->restoreDirectories as $dir) { rmdir($dir); } $this->restoreDirectories = []; } } } |