Yaffs site version 1.1
[yaffs-website] / vendor / gabordemooij / redbean / testing / helpers / classes.php
diff --git a/vendor/gabordemooij/redbean/testing/helpers/classes.php b/vendor/gabordemooij/redbean/testing/helpers/classes.php
new file mode 100644 (file)
index 0000000..d3a897b
--- /dev/null
@@ -0,0 +1,669 @@
+<?php
+
+/**
+ * RedUNIT Shared Test Classes / Mock Objects
+ * This file contains a collection of test classes that can be used by
+ * and shared by tests.
+ */
+
+/**
+ * Observable Mock
+ * This is just for testing
+ */
+class ObservableMock extends \RedBeanPHP\Observable
+{
+       /**
+        * @param $eventname
+        * @param $info
+        */
+       public function test( $eventname, $info )
+       {
+               $this->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');