signal( $eventname, $info ); } } /** * Observer Mock * This is just for testing */ class ObserverMock implements \RedBeanPHP\Observer { /** * @var bool */ public $event = FALSE; /** * @var bool */ public $info = FALSE; /** * @param string $event * @param $info */ public function onEvent( $event, $info ) { $this->event = $event; $this->info = $info; } } /** * Shared helper class for tests. * A test model to test FUSE functions. */ class Model_Band extends RedBeanPHP\SimpleModel { public function after_update() { } private $notes = array(); /** * @throws Exception */ public function update() { if ( count( $this->ownBandmember ) > 4 ) { throw new Exception( 'too many!' ); } } /** * @return string */ public function __toString() { return 'bigband'; } /** * @param $prop * @param $value */ public function setProperty( $prop, $value ) { $this->$prop = $value; } /** * @param $prop * * @return bool */ public function checkProperty( $prop ) { return isset( $this->$prop ); } /** * Sets a note. * * @param string $note * * @param mixed $value * * @return void */ public function setNote( $note, $value ) { $this->notes[ $note ] = $value; } /** * Returns the value of a note. * * @param string $note * * @return string */ public function getNote( $note ) { return $this->notes[ $note ]; } } /** * Shared helper class for tests. * A Model class for testing Models/FUSE and related features. */ class Model_Box extends RedBeanPHP\SimpleModel { public function delete() { $a = $this->bean->ownBottle; } } /** * Shared helper class for tests. * A Model class for testing Models/FUSE and related features. */ class Model_Cocoa extends RedBeanPHP\SimpleModel { public function update(){} } /** * Shared helper class for tests. * A Model class for testing Models/FUSE and related features. */ class Model_Taste extends RedBeanPHP\SimpleModel { public function after_update() { asrt( count( $this->bean->ownCocoa ), 0 ); } } /** * Shared helper class for tests. * A Model class for testing Models/FUSE and related features. */ class Model_Coffee extends RedBeanPHP\SimpleModel { public function update() { while ( count( $this->bean->ownSugar ) > 3 ) { array_pop( $this->bean->ownSugar ); } } } /** * Shared helper class for tests. * A Model class for testing Models/FUSE and related features. */ class Model_Test extends RedBeanPHP\SimpleModel { public function update() { if ( $this->bean->item->val ) { $this->bean->item->val = 'Test2'; $can = R::dispense( 'can' ); $can->name = 'can for bean'; $s = reset( $this->bean->sharedSpoon ); $s->name = "S2"; $this->bean->item->deep->name = '123'; $this->bean->ownCan[] = $can; $this->bean->sharedPeas = R::dispense( 'peas', 10 ); $this->bean->ownChip = R::dispense( 'chip', 9 ); } } } global $lifeCycle; /** * Shared helper class for tests. * A Model class for testing Models/FUSE and related features. */ class Model_Bandmember extends RedBeanPHP\SimpleModel { public function open() { global $lifeCycle; $lifeCycle .= "\n called open: " . $this->id; } public function dispense() { global $lifeCycle; $lifeCycle .= "\n called dispense() " . $this->bean; } public function update() { global $lifeCycle; $lifeCycle .= "\n called update() " . $this->bean; } public function after_update() { global $lifeCycle; $lifeCycle .= "\n called after_update() " . $this->bean; } public function delete() { global $lifeCycle; $lifeCycle .= "\n called delete() " . $this->bean; } public function after_delete() { global $lifeCycle; $lifeCycle .= "\n called after_delete() " . $this->bean; } } /** * A model to box soup models :) */ class Model_Soup extends \RedBeanPHP\SimpleModel { private $flavour = ''; public function taste() { return 'A bit too salty'; } public function setFlavour( $flavour ) { $this->flavour = $flavour; } public function getFlavour() { return $this->flavour; } } /** * A custom BeanHelper to test custom FUSE operations. */ class SoupBeanHelper extends \RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper { /** * Returns a model for a bean based on its type. * * @param OODBBean $bean * * @return object */ public function getModelForBean( \RedBeanPHP\OODBBean $bean ) { if ( $bean->getMeta( 'type' ) === 'meal' ) { $model = new Model_Soup; $model->loadBean( $bean ); return $model; } else { return parent::getModelForBean( $bean ); } } } /** * Test Model. */ class Model_Boxedbean extends \RedBeanPHP\SimpleModel { } /** * Mock class for testing purposes. */ class Model_Ghost_House extends \RedBeanPHP\SimpleModel { public static $deleted = FALSE; public function delete() { self::$deleted = TRUE; } } /** * Mock class for testing purposes. */ class Model_Ghost_Ghost extends \RedBeanPHP\SimpleModel { public static $deleted = FALSE; public function delete() { self::$deleted = TRUE; } } /** * Mock class for testing purposes. */ class FaultyWriter extends \RedBeanPHP\QueryWriter\MySQL { protected $sqlState; /** * Mock method. * * @param string $sqlState sql state */ public function setSQLState( $sqlState ) { $this->sqlState = $sqlState; } /** * Mock method * * @param string $sourceType destination type * @param string $destType source type * * @throws SQL */ public function addUniqueConstraint( $sourceType, $destType ) { $exception = new \RedBeanPHP\RedException\SQL; $exception->setSQLState( $this->sqlState ); throw $exception; } /** * Mock method. * Generates an exception when trying to invoke * getKeyMapForType via getForeignKeyForTypeProperty. * * @return void */ protected function getKeyMapForType( $type ) { throw new \RedBeanPHP\RedException\SQL; } } /** * Mock class to test default implementations in AQueryWriter. */ class NullWriter extends \RedBeanPHP\QueryWriter\AQueryWriter { } class ProxyWriter extends \RedBeanPHP\QueryWriter\AQueryWriter { public static function callMethod( $object, $method, $arg1 = NULL, $arg2 = NULL, $arg3 = NULL ) { return $object->$method( $arg1, $arg2, $arg3 ); } } /** * Mock class to test proper model name * beautificattion for link table beans in FUSE. */ class Model_PageWidget extends RedBean_SimpleModel { /** * @var string */ private static $test = ''; /** * Returns the test flag. * * @return string */ public static function getTestReport() { return self::$test; } /** * Update method to set the flag. */ public function update() { self::$test = 'didSave'; } } /** * Mock class to test proper model name * beautificattion for link table beans in FUSE. */ class Model_Gadget_Page extends RedBean_SimpleModel { /** * @var string */ private static $test = ''; /** * Returns the test flag. * * @return string */ public static function getTestReport() { return self::$test; } /** * Update method to set the flag. */ public function update() { self::$test = 'didSave'; } } /** * Mock class to test proper model name * beautificattion for link table beans in FUSE. */ class Model_A_B_C extends RedBean_SimpleModel { /** * @var string */ private static $test = ''; /** * Returns the test flag. * * @return string */ public static function getTestReport() { return self::$test; } /** * Update method to set the flag. */ public function update() { self::$test = 'didSave'; } } class Model_BookBook extends \RedBean_SimpleModel { public function delete() { asrt($this->bean->shelf, 'x13'); } } class Model_Feed extends \RedbeanPHP\SimpleModel { public function update() { $this->bean->post = json_encode($this->bean->post); } public function open() { $this->bean->post = json_decode($this->bean->post, true); } } /** * UUID QueryWriter for MySQL for testing purposes. */ class UUIDWriterMySQL extends \RedBeanPHP\QueryWriter\MySQL { protected $defaultValue = '@uuid'; const C_DATATYPE_SPECIAL_UUID = 97; public function __construct( \RedBeanPHP\Adapter $adapter ) { parent::__construct( $adapter ); $this->addDataType( self::C_DATATYPE_SPECIAL_UUID, 'char(36)' ); } public function createTable( $table ) { $table = $this->esc( $table ); $sql = " CREATE TABLE {$table} ( id char(36) NOT NULL, PRIMARY KEY ( id )) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci "; $this->adapter->exec( $sql ); } public function updateRecord($table, $updateValues, $id = NULL) { $flagNeedsReturnID = (!$id); if ($flagNeedsReturnID) R::exec('SET @uuid = uuid() '); $id = parent::updateRecord( $table, $updateValues, $id ); if ( $flagNeedsReturnID ) $id = R::getCell('SELECT @uuid'); return $id; } public function getTypeForID() { return self::C_DATATYPE_SPECIAL_UUID; } } /** * UUID QueryWriter for PostgreSQL for testing purposes. */ class UUIDWriterPostgres extends \RedBeanPHP\QueryWriter\PostgreSQL { protected $defaultValue = 'uuid_generate_v4()'; const C_DATATYPE_SPECIAL_UUID = 97; public function __construct( \RedBeanPHP\Adapter $adapter ) { parent::__construct( $adapter ); $this->addDataType( self::C_DATATYPE_SPECIAL_UUID, 'uuid' ); } public function createTable( $table ) { $table = $this->esc( $table ); $this->adapter->exec( " CREATE TABLE $table (id uuid PRIMARY KEY); " ); } public function getTypeForID() { return self::C_DATATYPE_SPECIAL_UUID; } } class DiagnosticBean extends \RedBeanPHP\OODBBean { /** * Returns current status of modification flags. * * @return string */ public function getModFlags() { $modFlags = ''; if ($this->aliasName !== NULL) $modFlags .= 'a'; if ($this->fetchType !== NULL) $modFlags .= 'f'; if ($this->noLoad === TRUE) $modFlags .= 'n'; if ($this->all === TRUE) $modFlags .= 'r'; if ($this->withSql !== '') $modFlags .= 'w'; return $modFlags; } } class DiagnosticModel extends \RedBeanPHP\SimpleModel { private $logs = array(); public function open() { $this->logs[] = array( 'action' => 'open', 'data' => array( 'id' => $this->id ) ); } public function dispense() { $this->logs[] = array( 'action' => 'dispense', 'data' => array( 'bean' => $this->bean ) ); } public function update() { $this->logs[] = array( 'action' => 'update', 'data' => array( 'bean' => $this->bean ) ); } public function after_update() { $this->logs[] = array( 'action' => 'after_update', 'data' => array( 'bean' => $this->bean ) ); } public function delete() { $this->logs[] = array( 'action' => 'delete', 'data' => array( 'bean' => $this->bean ) ); } public function after_delete() { $this->logs[] = array( 'action' => 'after_delete', 'data' => array( 'bean' => $this->bean ) ); } public function getLogs() { return $this->logs; } public function getLogActionCount( $action = NULL ) { if ( is_null( $action ) ) return count( $this->logs ); $counter = 0; foreach( $this->logs as $log ) { if ( $log['action'] == $action ) $counter ++; } return $counter; } public function clearLog() { return $this->logs = array(); } public function getDataFromLog( $logIndex = 0, $property ) { return $this->logs[$logIndex]['data'][$property]; } } class Model_Probe extends DiagnosticModel {}; define('REDBEAN_OODBBEAN_CLASS', '\DiagnosticBean');