RoundCube Webmail
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

187 lines
5.2 KiB

<?php
namespace Roundcube\Tests;
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| A class for easier testing of code that uses rcmail_output classes |
+-----------------------------------------------------------------------+
| Author: Aleksander Machniak <alec@alec.pl> |
+-----------------------------------------------------------------------+
*/
/**
* A class for easier testing of code that uses rcmail_output classes
*/
class OutputHtmlMock extends \rcmail_output_html
{
public const E_EXIT = 101;
public const E_REDIRECT = 102;
public $output;
public $headers = [];
public $errorCode;
public $errorMessage;
public $template = '';
/**
* Redirect to a certain url
*
* @param mixed $p Either a string with the action or url parameters as key-value pairs
* @param int $delay Delay in seconds
* @param bool $secure Redirect to secure location (see rcmail::url())
*/
#[\Override]
public function redirect($p = [], $delay = 1, $secure = false)
{
if (!empty($this->env['extwin'])) {
$p['extwin'] = 1;
}
$location = $this->app->url($p, false, false, $secure);
// header('Location: ' . $location);
throw new ExitException("Location: {$location}", self::E_REDIRECT);
}
/**
* Send the request output to the client.
* This will either parse a skin template.
*
* @param string $templ Template name
* @param bool $exit True if script should terminate (default)
*/
#[\Override]
public function send($templ = null, $exit = true)
{
$this->template = $templ;
parent::send($templ, false);
if ($exit) {
throw new ExitException('Output sent', self::E_EXIT);
}
}
/**
* A helper to send output to the browser and exit
*
* @param string $body The output body
* @param array $headers Headers
*/
#[\Override]
public function sendExit($body = '', $headers = [])
{
foreach ($headers as $header) {
$this->header($header);
}
$this->output .= $body;
throw new ExitException('Output sent', self::E_EXIT);
}
/**
* A helper to send HTTP error code and message to the browser, and exit.
*
* @param int $code The HTTP error code
* @param string $message The HTTP error message
*/
#[\Override]
public function sendExitError($code, $message = '')
{
$this->errorCode = $code;
$this->errorMessage = $message;
throw new ExitException('Output sent (error)', self::E_EXIT);
}
/**
* Process template and write to stdOut
*
* @param string $template HTML template content
*/
#[\Override]
public function write($template = '')
{
ob_start();
parent::write($template);
$this->output = ob_get_contents();
ob_end_clean();
}
/**
* Parse a specific skin template and deliver to stdout (or return)
*
* @param string $name Template name
* @param bool $exit Exit script
* @param bool $write Don't write to stdout, return parsed content instead
*
* @see http://php.net/manual/en/function.exit.php
*/
#[\Override]
public function parse($name = 'main', $exit = true, $write = true)
{
// ob_start();
parent::parse($name, false, $write);
// $this->output = ob_get_contents();
// ob_end_clean();
if ($exit) {
throw new ExitException('Output sent', self::E_EXIT);
}
}
/**
* Delete all stored env variables and commands
*/
#[\Override]
public function reset($all = false)
{
parent::reset($all);
$this->headers = [];
$this->output = null;
$this->template = null;
$this->errorCode = null;
$this->errorMessage = null;
}
/**
* A wrapper for header() function, so it can be replaced for automated tests
*
* @param string $header The header string
* @param bool $replace Replace previously set header?
*/
#[\Override]
public function header($header, $replace = true)
{
$this->headers[] = $header;
}
/**
* Return the output
*/
public function getOutput()
{
return $this->output;
}
/**
* Return private/protected property
*/
public function getProperty($name)
{
return $this->{$name};
}
}