<?php
namespace RedUNIT\Sqlite;
use RedUNIT\Sqlite as Sqlite;
use RedBeanPHP\Facade as R;
/**
* Foreignkeys
*
* Tests creation and validity of foreign keys,
* foreign key constraints and indexes in SQLite.
* Also tests whether the correct contraint action has been selected.
*
* @file RedUNIT/Sqlite/Foreignkeys.php
* @desc Tests the creation of foreign keys.
* @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 Foreignkeys extends Sqlite
{
/**
* addIndex should not trigger exception...
*
* @return void
*/
public function testIndexException()
{
R::nuke();
$book = R::dispense( 'book' );
$book->title = 'a';
R::store( $book );
try {
R::getWriter()->addIndex( 'book' , '\'', 'title' );
pass();
} catch( \Exception $e ) {
fail();
}
R::getWriter()->addIndex( 'book' , '\'', 'title' );
pass();
}
/**
* Test foreign keys with SQLite.
*
* @return void
*/
public function testForeignKeysWithSQLite()
{
$book = R::dispense( 'book' );
$page = R::dispense( 'page' );
$cover = R::dispense( 'cover' );
list( $g1, $g2 ) = R::dispense( 'genre', 2 );
$g1->name = '1';
$g2->name = '2';
$book->ownPage = array( $page );
$book->cover = $cover;
$book->sharedGenre = array( $g1, $g2 );
R::store( $book );
$fkbook = R::getAll( 'pragma foreign_key_list(book)' );
$fkgenre = R::getAll( 'pragma foreign_key_list(book_genre)' );
$fkpage = R::getAll( 'pragma foreign_key_list(page)' );
asrt( $fkpage[0]['from'], 'book_id' );
asrt( $fkpage[0]['to'], 'id' );
asrt( $fkpage[0]['table'], 'book' );
asrt( count( $fkgenre ), 2 );
if ( $fkgenre[0]['from'] == 'book' ) {
asrt( $fkgenre[0]['to'], 'id' );
asrt( $fkgenre[0]['table'], 'book' );
}
if ( $fkgenre[0]['from'] == 'genre' ) {
asrt( $fkgenre[0]['to'], 'id' );
asrt( $fkgenre[0]['table'], 'genre' );
}
asrt( $fkbook[0]['from'], 'cover_id' );
asrt( $fkbook[0]['to'], 'id' );
asrt( $fkbook[0]['table'], 'cover' );
}
/**
* Constrain test for SQLite Writer.
*
* @return void
*/
public function testConstrain()
{
R::nuke();
$sql = 'CREATE TABLE book ( id INTEGER PRIMARY KEY AUTOINCREMENT ) ';
R::exec( $sql );
$sql = 'CREATE TABLE page ( id INTEGER PRIMARY KEY AUTOINCREMENT ) ';
R::exec( $sql );
$sql = 'CREATE TABLE book_page (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id INTEGER,
page_id INTEGER
) ';
R::exec( $sql );
$sql = 'PRAGMA foreign_key_list("book_page")';
$fkList = R::getAll( $sql );
asrt( count( $fkList), 0 );
$writer = R::getWriter();
$writer->addFK( 'book_page', 'book', 'book_id', 'id', TRUE );
$writer->addFK( 'book_page', 'page', 'page_id', 'id', TRUE );
$sql = 'PRAGMA foreign_key_list("book_page")';
$fkList = R::getAll( $sql );
asrt( count( $fkList), 2 );
$writer->addFK( 'book_page', 'book', 'book_id', 'id', TRUE );
$writer->addFK( 'book_page', 'page', 'page_id', 'id', TRUE );
$sql = 'PRAGMA foreign_key_list("book_page")';
$fkList = R::getAll( $sql );
asrt( count( $fkList), 2 );
}
/**
* Test adding foreign keys.
*
* @return void
*/
public function testAddingForeignKeys()
{
R::nuke();
$sql = 'CREATE TABLE book ( id INTEGER PRIMARY KEY AUTOINCREMENT ) ';
R::exec( $sql );
$sql = 'CREATE TABLE page ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_id INTEGER ) ';
R::exec( $sql );
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 0 );
$writer = R::getWriter();
$writer->addFK('page', 'book', 'book_id', 'id', TRUE);
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 1 );
$writer->addFK('page', 'book', 'book_id', 'id', TRUE);
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 1 );
$writer->addFK('page', 'book', 'book_id', 'id', FALSE);
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 1 );
R::nuke();
$sql = 'CREATE TABLE book ( id INTEGER PRIMARY KEY AUTOINCREMENT ) ';
R::exec( $sql );
$sql = 'CREATE TABLE page ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_id INTEGER ) ';
R::exec( $sql );
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 0 );
$writer = R::getWriter();
$writer->addFK('page', 'book', 'book_id', 'id', FALSE);
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 1 );
$writer->addFK('page', 'book', 'book_id', 'id', TRUE);
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 1 );
$writer->addFK('page', 'book', 'book_id', 'id', FALSE);
asrt( count( R::getAll(' PRAGMA foreign_key_list("page") ') ), 1 );
}
/**
* Test whether we can manually create indexes.
*
* @return void
*/
public function testAddingIndex()
{
R::nuke();
$sql = 'CREATE TABLE song (
id INTEGER PRIMARY KEY AUTOINCREMENT,
album_id INTEGER,
category TEXT
) ';
R::exec( $sql );
$writer = R::getWriter();
$indexes = R::getAll('PRAGMA index_list("song") ');
asrt( count( $indexes ), 0 );
$writer->addIndex( 'song', 'index1', 'album_id' );
$indexes = R::getAll('PRAGMA index_list("song") ');
asrt( count( $indexes ), 1 );
$writer->addIndex( 'song', 'index1', 'album_id' );
$indexes = R::getAll('PRAGMA index_list("song") ');
asrt( count( $indexes ), 1 );
$writer->addIndex( 'song', 'index2', 'category' );
$indexes = R::getAll('PRAGMA index_list("song") ');
asrt( count( $indexes ), 2 );
try {
$writer->addIndex( 'song', 'index1', 'nonexistant' );
pass();
} catch ( \Exception $ex ) {
fail();
}
$indexes = R::getAll('PRAGMA index_list("song") ');
asrt( count( $indexes ), 2 );
try {
$writer->addIndex( 'nonexistant', 'index1', 'nonexistant' );
pass();
} catch ( \Exception $ex ) {
fail();
}
$indexes = R::getAll('PRAGMA index_list("song") ');
asrt( count( $indexes ), 2 );
}
}
|