--- /dev/null
+<?php
+
+namespace RedUNIT\Mysql;
+
+use RedUNIT\Mysql as Mysql;
+use RedBeanPHP\Facade as R;
+use RedBeanPHP\AssociationManager as AssociationManager;
+use RedBeanPHP\RedException\SQL as SQL;
+
+/**
+ * Freeze
+ *
+ * Tests whether database schema remains unmodified in frozen
+ * mode.
+ *
+ * @file RedUNIT/Mysql/Freeze.php
+ * @desc Tests freezing of databases for production environments.
+ * @author Gabor de Mooij and the RedBeanPHP Community
+ * @license New BSD/GPLv2
+ *
+ * (c) G.J.G.T. (Gabor) de Mooij and the RedBeanPHP Community.
+ * This source file is subject to the New BSD/GPLv2 License that is bundled
+ * with this source code in the file license.txt.
+ */
+class Freeze extends Mysql
+{
+ /**
+ * Tests freezing the database.
+ * After freezing the database, schema modifications are no longer
+ * allowed and referring to missing columns will now cause exceptions.
+ *
+ * @return void
+ */
+ public function testFreezer()
+ {
+ $toolbox = R::getToolBox();
+ $adapter = $toolbox->getDatabaseAdapter();
+ $writer = $toolbox->getWriter();
+ $redbean = $toolbox->getRedBean();
+ $pdo = $adapter->getDatabase();
+ $a = new AssociationManager( $toolbox );
+ $post = $redbean->dispense( 'post' );
+ $post->title = 'title';
+ $redbean->store( $post );
+ $page = $redbean->dispense( 'page' );
+ $page->name = 'title';
+ $redbean->store( $page );
+ $page = $redbean->dispense( "page" );
+ $page->name = "John's page";
+ $idpage = $redbean->store( $page );
+ $page2 = $redbean->dispense( "page" );
+ $page2->name = "John's second page";
+ $idpage2 = $redbean->store( $page2 );
+ $a->associate( $page, $page2 );
+ $redbean->freeze( TRUE );
+ $page = $redbean->dispense( "page" );
+ $page->sections = 10;
+ $page->name = "half a page";
+ try {
+ $id = $redbean->store( $page );
+ fail();
+ } catch ( SQL $e ) {
+ pass();
+ }
+ $post = $redbean->dispense( "post" );
+ $post->title = "existing table";
+ try {
+ $id = $redbean->store( $post );
+ pass();
+ } catch ( SQL $e ) {
+ fail();
+ }
+ asrt( in_array( "name", array_keys( $writer->getColumns( "page" ) ) ), TRUE );
+ asrt( in_array( "sections", array_keys( $writer->getColumns( "page" ) ) ), FALSE );
+ $newtype = $redbean->dispense( "newtype" );
+ $newtype->property = 1;
+ try {
+ $id = $redbean->store( $newtype );
+ fail();
+ } catch ( SQL $e ) {
+ pass();
+ }
+ $logger = R::debug( true, 1 );
+ // Now log and make sure no 'describe SQL' happens
+ $page = $redbean->dispense( "page" );
+ $page->name = "just another page that has been frozen...";
+ $id = $redbean->store( $page );
+ $page = $redbean->load( "page", $id );
+ $page->name = "just a frozen page...";
+ $redbean->store( $page );
+ $page2 = $redbean->dispense( "page" );
+ $page2->name = "an associated frozen page";
+ $a->associate( $page, $page2 );
+ $a->related( $page, "page" );
+ $a->unassociate( $page, $page2 );
+ $a->clearRelations( $page, "page" );
+ $items = $redbean->find( "page", array(), array( "1" ) );
+ $redbean->trash( $page );
+ $redbean->freeze( FALSE );
+ asrt( count( $logger->grep( "SELECT" ) ) > 0, TRUE );
+ asrt( count( $logger->grep( "describe" ) ) < 1, TRUE );
+ asrt( is_array( $logger->getLogs() ), TRUE );
+ R::debug( FALSE );
+ }
+}