PHP Classes

File: vendor/gabordemooij/redbean/testing/RedUNIT/Base/Productivity.php

Recommend this page to a friend!
  Classes of Adrian M   upMVC   vendor/gabordemooij/redbean/testing/RedUNIT/Base/Productivity.php   Download  
File: vendor/gabordemooij/redbean/testing/RedUNIT/Base/Productivity.php
Role: Class source
Content type: text/plain
Description: Class source
Class: upMVC
Pure PHP web development without other frameworks
Author: By
Last change:
Date: 1 month ago
Size: 6,908 bytes
 

Contents

Class file image Download
<?php

namespace RedUNIT\Base;

use
RedUNIT\Base as Base;
use
RedBeanPHP\Facade as R;
use
RedBeanPHP\RedException as RedException;
use
RedBeanPHP\OODBBean as OODBBean;
use
RedBeanPHP\Util\MatchUp;
use
RedBeanPHP\Util\Look;

/**
 * MatchUp
 *
 * Tests the MatchUp functionality.
 * Tired of creating login systems and password-forget systems?
 * MatchUp is an ORM-translation of these kind of problems.
 * A matchUp is a match-and-update combination in terms of beans.
 * Typically login related problems are all about a match and
 * a conditional update.
 *
 * @file RedUNIT/Base/Matchup.php
 * @desc Tests MatchUp
 * @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 Productivity extends Base
{
   
/**
     * Test matchup
     *
     * @return void
     */
   
public function testPasswordForget()
    {
       
R::nuke();
       
$account = R::dispense( 'account' );
       
$account->uname = 'Shawn';
       
$account->pass = sha1( 'sheep' );
       
$account->archived = 0;
       
$account->attempts = 1;

       
R::store( $account );
       
$matchUp = new MatchUp( R::getToolbox() );

       
/* simulate a token generation script */
       
$account = NULL;
       
$didGenToken = $matchUp->matchUp( 'account', ' uname = ? AND archived = ?', array('Shawn',0), array(
           
'token' => sha1(rand(0,9000) . time()),
           
'tokentime' => time()
        ),
NULL, $account );
       
       
asrt( $didGenToken, TRUE );
       
asrt( !is_null( $account->token ) , TRUE );
       
asrt( !is_null( $account->tokentime ) , TRUE );

       
/* simulate a password reset script */
       
$newpass = '1234';
       
$didResetPass = $matchUp->matchUp( 'account', ' token = ? AND tokentime > ? ', array( $account->token, time()-100 ), array(
           
'pass' => $newpass,
           
'token' => ''
       
), NULL, $account );
       
asrt( $account->pass, '1234' );
       
asrt( $account->token, '' );
       
       
/* simulate a login */
       
$didFindUsr = $matchUp->matchUp( 'account', ' uname = ? ', array( 'Shawn' ), array(
           
'attempts' => function( $acc ) {
                return (
$acc->pass !== '1234' ) ? ( $acc->attempts + 1 ) : 0;
            }
        ),
NULL, $account);

       
asrt( $didFindUsr, TRUE );
       
asrt( $account->attempts, 0 );

       
/* Login failure */
       
$didFindUsr = $matchUp->matchUp( 'account', ' uname = ? ', array( 'Shawn' ), array(
           
'attempts' => function( $acc ) {
                return (
$acc->pass !== '1236' ) ? ( $acc->attempts + 1 ) : 0;
            }
        ),
NULL, $account);

       
/* Create user if not exists */
       
$didFindUsr = R::matchUp( 'account', ' uname = ? ', array( 'Anonymous' ), array(
        ), array(
           
'uname' => 'newuser'
       
), $account);
       
asrt( $didFindUsr, FALSE );
       
asrt( $account->uname, 'newuser' );
    }

   
/**
     * Tests the look function.
     */
   
public function testLook()
    {
       
R::nuke();
       
$beans = R::dispenseAll( 'color*3' );
        list(
$red, $green, $blue ) = $beans[0];
       
$red->name = 'red';
       
$green->name = 'green';
       
$blue->name = 'blue';
       
$red->thevalue = 'r';
       
$green->thevalue = 'g';
       
$blue->thevalue = 'b';
       
R::storeAll( array( $red, $green, $blue ) );
       
$look = R::getLook();
       
asrt( ( $look instanceof Look ), TRUE );
       
$str = R::getLook()->look( 'SELECT * FROM color WHERE thevalue != ? ORDER BY thevalue ASC', array( 'g' ), array( 'thevalue', 'name' ),
           
'<option value="%s">%s</option>', 'strtoupper', "\n"
       
);
       
asrt( $str,
       
"<option value=\"B\">BLUE</option>\n<option value=\"R\">RED</option>"
       
);
       
$str = R::look( 'SELECT * FROM color WHERE thevalue != ? ORDER BY thevalue ASC', array( 'g' ), array( 'thevalue', 'name' ),
           
'<option value="%s">%s</option>', 'strtoupper', "\n"
       
);
       
asrt( $str,
       
"<option value=\"B\">BLUE</option>\n<option value=\"R\">RED</option>"
       
);
    }

   
/**
     * Test Bean differ.
     */
   
public function testDiff()
    {
       
R::nuke();
       
$ad = R::dispense( 'ad' );
       
$ad->title = 'dog looking for new home';
       
$ad->created = time();
       
$ad->modified = time();
       
$ad->ownDog[] = R::dispense( 'dog' );
       
$ad->ownDog[0]->name = 'Dweep';
       
$ad->ownDog[0]->color = 'green';
       
$ad->author = R::dispense('user');
       
$ad->author->name = 'John';
       
R::store( $ad );
       
$ad->title = 'green dog';
       
$diff = R::diff( $ad->fresh(), $ad );
       
/* simple case, property changed */
       
var_dump( $diff );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 1 );
       
asrt( $diff['ad.1.title'][0], 'dog looking for new home' );
       
asrt( $diff['ad.1.title'][1], 'green dog' );
       
/* test use specific format */
       
$diff = R::diff( $ad->fresh(), $ad, array(), '%1$s.%3$s' );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 1 );
       
asrt( $diff['ad.title'][0], 'dog looking for new home' );
       
asrt( $diff['ad.title'][1], 'green dog' );
       
/* skip created modified */
       
$ad = $ad->fresh();
       
$ad->modified = 111;
       
$ad->created = 111;
       
$diff = R::diff( $ad->fresh(), $ad );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 0 );
       
/* unless we set anothe filter */
       
$ad = $ad->fresh();
       
$ad->modified = 111;
       
$ad->created = 111;
       
$ad->name = 'x';
       
$diff = R::diff( $ad->fresh(), $ad, array( 'name' ) );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 2 );
       
asrt( $diff['ad.1.modified'][1], 111 );
       
asrt( $diff['ad.1.created'][1], 111 );
       
$ad = $ad->fresh();
       
/* also diff changes in related beans */
       
$ad->fetchAs('user')->author->name = 'Fred';
       
$dog = reset( $ad->ownDog );
       
$dog->color = 999;
       
$old = $ad->fresh();
       
$old->ownDog;
       
$old->fetchAs('user')->author;
       
$diff = R::diff( $ad, $old );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 2 );
       
asrt( $diff['ad.1.ownDog.1.color'][1], 'green' );
       
asrt( $diff['ad.1.ownDog.1.color'][0], 999 );
       
asrt( $diff['ad.1.author.1.name'][1], 'John' );
       
asrt( $diff['ad.1.author.1.name'][0], 'Fred' );
       
$diff = R::diff( $ad, null );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 0 );
       
$diff = R::diff( null, $ad );
       
asrt( is_array( $diff ), TRUE );
       
asrt( count( $diff ), 0 );

       
/* demo case */
       
list($book,$pages) = R::dispenseAll('book,page*2');
       
$book->title = 'Old Book';
       
$book->price = 999;
       
$book->ownPageList = $pages;
       
$pages[0]->text = 'abc';
       
$pages[1]->text = 'def';
       
R::store($book);
       
$book->title = 'new Book';
       
$page = end($book->ownPageList);
       
$page->text = 'new';
       
$oldBook = $book->fresh();
       
$oldBook->ownPageList;
       
$diff = R::diff($oldBook, $book);
    }

   
/**
     * Test misc. matchUp scenarios.
     *
     * @return void
     */
   
public function testMatchUpMisc()
    {
       
R::nuke();
       
asrt( R::count( 'bean' ), 0 );
       
$found = R::matchUp( 'bean', ' id = ? ', array(1), array(), array(
           
'notfound' => function( $bean ) {
               
$bean->status = 'not found';
            }
        ) );
       
asrt( $found, FALSE );
       
asrt( R::count( 'bean' ), 1 );
       
$bean = R::findOne( 'bean' );
       
asrt( $bean->status, 'not found' );
       
$null = R::matchUp( 'bean', ' id = ? ', array( $bean->id ) );
       
asrt( is_null( $null ), TRUE );
    }
}