Browse Source

Model classes tested

master
Anton Grebnev 13 years ago
parent
commit
3923de3dc4
  1. 1
      tests/model/DbTest.php
  2. 307
      tests/model/ModelTest.php
  3. 207
      tests/model/MySQLiDriverTest.php
  4. 1
      tests/model/MySQLiStatementTest.php
  5. 5
      tests/model/testData.xml
  6. 9
      tests/model/testDataAfterCommit.xml
  7. 6
      tests/phpunit.xml

1
tests/model/DbTest.php

@ -20,6 +20,7 @@ class DbTest extends PHPUnit_Framework_TestCase
/**
* @expectedException Exception
* @expectedExceptionMessage Trying to get property of non-object
*/
public function testConnectNoParams()
{

307
tests/model/ModelTest.php

@ -0,0 +1,307 @@
<?php
/*
* @copyright NetMonsters <team@netmonsters.ru>
* @link http://netmonsters.ru
* @package Majestic
* @subpackage UnitTests
* @since 2011-11-7
*
* Unit tests for Model class
*/
require_once dirname(__FILE__) . '/../../Registry.php';
require_once dirname(__FILE__) . '/../../Config.php';
require_once dirname(__FILE__) . '/../../cache/Cacher.php';
require_once dirname(__FILE__) . '/../../model/DbExpr.php';
require_once dirname(__FILE__) . '/../../model/Db.php';
require_once dirname(__FILE__) . '/../../model/DbDriver.php';
require_once dirname(__FILE__) . '/../../model/Model.php';
class ModelTest extends PHPUnit_Framework_TestCase
{
private $model;
public function setUp()
{
$conf = array('default' => array('driver' => 'MockDbDriver', 'hostname' => 'localhost', 'database' => 'db', 'username' => 'test', 'password' => '1234'));
if (!class_exists('MockDbDriver')) {
$this->getMockForAbstractClass('MyDbDriver', array($conf), 'MockDbDriver', false);
}
Config::set('Db', $conf);
if (!class_exists('MockModel')) {
$this->model = $this->getMockForAbstractClass('Model', array(), 'MockModel');
} else {
$this->model = new MockModel();
}
set_new_overload(array($this, 'newCallback'));
}
public function testModel()
{
$this->assertInstanceOf('Model', $this->model);
}
public function testGetInsertId()
{
$this->assertTrue($this->model->getInsertId());
}
public function testIdentify()
{
$param = 'param';
$this->assertEquals($param, $this->model->identify($param));
}
public function testQuote()
{
$param = 'param';
$this->assertEquals($param, $this->model->quote($param));
}
public function testGet()
{
$this->assertTrue($this->model->get(1));
}
public function testInsert()
{
$this->assertTrue($this->model->insert(array('data')));
}
public function testUpdate()
{
$this->assertEquals('mock', $this->model->update(array('var' => 'val'), 1));
}
public function testDelete()
{
$this->assertEquals('mock', $this->model->delete(1));
}
public function testOrder()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('order');
$method->setAccessible(true);
$this->assertEquals(' ORDER BY id DESC', $method->invoke($this->model, array('sort' => 'id', 'order' => 'desc')));
$this->assertEquals(' ORDER BY name ASC', $method->invoke($this->model, array('sort' => 'name'), array('id', 'name')));
$this->assertEmpty($method->invoke($this->model, array()));
/**
* @TODO: Model::order - check DESC condition - make case insensitive
*/
$this->assertEquals(' ORDER BY name ASC', $method->invoke($this->model, array('sort' => 'name', 'order' => 'DESC'), array('id', 'name')));
}
public function testSearch()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('search');
$method->setAccessible(true);
$this->assertEmpty($method->invoke($this->model, array()));
$this->assertEmpty($method->invoke($this->model, array('q' => 'in', 'qt' => 'name')));
$this->assertEquals('test.name LIKE %on%', $method->invoke($this->model, array('qt' => 'name', 'q' => 'on'), array('name'), 'test'));
}
public function testFetch()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('fetch');
$method->setAccessible(true);
$key = $this->getCacheKeyMockGetSet();
$this->assertEquals('field', $method->invoke($this->model, 'SELECT', array(), $key));
}
public function testFetchField()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('fetchField');
$method->setAccessible(true);
$key = $this->getCacheKeyMockGetSet();
$this->assertEquals('field', $method->invoke($this->model, 'SELECT', array(), 'field', $key));
}
public function testFetchAll()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('fetchAll');
$method->setAccessible(true);
$key = $this->getCacheKeyMockGetSet();
$this->assertEquals('field', $method->invoke($this->model, 'SELECT', array(), $key));
}
public function testGetCache()
{
$model = new ReflectionClass('MockModel');
$method = $model->getMethod('getCache');
$method->setAccessible(true);
Config::set('Model', 'MockCache');
if (!class_exists('MockCache')) {
$this->getMock('Cache', array(), array(), 'MockCache');
}
$this->assertInstanceOf('MockCache', $method->invoke($this->model));
}
public function testCacheKey()
{
$model = new ReflectionClass('MockModel');
$method = $model->getMethod('cacheKey');
$method->setAccessible(true);
Config::set('Model', 'MockCache');
if (!class_exists('MockCache')) {
$this->getMock('Cache', array(), array(), 'MockCache', false);
}
if (!class_exists('MockCacheKey')) {
$this->getMock('CacheKey', array(), array(), 'MockCacheKey', false);
}
$this->assertInstanceOf('MockCacheKey', $method->invoke($this->model, 'name'));
}
public function testAddCleanCache()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('addCleanCache');
$method->setAccessible(true);
$key = $this->getMock('Key', array('set', 'get'));
$method->invoke($this->model, $key);
$method->invoke($this->model, $key);
$method->invoke($this->model, $key);
$this->assertAttributeEquals(array($key, $key, $key), 'caches_clean', $this->model);
}
public function testCleanCaches()
{
$model = new ReflectionClass('Model');
$method = $model->getMethod('addCleanCache');
$method->setAccessible(true);
$key = $this->getCacheKeyMockDel(3);
$method->invoke($this->model, $key);
$method->invoke($this->model, $key);
$method->invoke($this->model, $key);
$this->assertAttributeEquals(array($key, $key, $key), 'caches_clean', $this->model);
$model = new ReflectionClass('Model');
$method = $model->getMethod('cleanCaches');
$method->setAccessible(true);
$method->invoke($this->model, $key);
$this->assertAttributeEquals(array(), 'caches_clean', $this->model);
}
protected function getCacheKeyMockGetSet()
{
$key = $this->getMock('Key', array('set', 'get'));
$key
->expects($this->any())
->method('set')
->with($this->anything())
->will($this->returnValue(true));
$key
->expects($this->any())
->method('get')
->will($this->returnValue(false));
return $key;
}
protected function getCacheKeyMockDel($count)
{
$key = $this->getMock('Key', array('del'));
$key
->expects($this->exactly($count))
->method('del')
->will($this->returnValue(true));
return $key;
}
public function tearDown()
{
Config::getInstance()->offsetUnset('Db');
$config = new ReflectionClass('Db');
$registry = $config->getProperty('connections');
$registry->setAccessible(true);
$registry->setValue('Db', array());
unset_new_overload();
}
protected function newCallback($className)
{
switch ($className) {
case 'MockDbDriver':
return 'MockDbDriver';
case 'CacheKey':
return 'MockCacheKey';
default:
return $className;
}
}
}
abstract class MyDbDriver extends DbDriver
{
public function getInsertId($table = null, $key = null)
{
return true;
}
public function quoteIdentifier($param)
{
return $param;
}
public function quote($param)
{
return $param;
}
public function insert($table, $bind, $on_duplicate = array())
{
return $table;
}
public function update($table, $bind, $where = '')
{
return $table;
}
public function delete($table, $where = '')
{
return $table;
}
public function query($sql, $params)
{
$conf = array('driver' => 'MockDbDriver', 'hostname' => 'localhost', 'database' => 'db', 'username' => 'test', 'password' => '1234');
return new MockDbDriver($conf);
}
public function execute()
{
return true;
}
public function fetch()
{
return true;
}
public function fetchField($field)
{
return $field;
}
public function fetchAll()
{
return true;
}
}

207
tests/model/MySQLiDriverTest.php

@ -0,0 +1,207 @@
<?php
/*
* @copyright NetMonsters <team@netmonsters.ru>
* @link http://netmonsters.ru
* @package Majestic
* @subpackage UnitTests
* @since 2011-11-7
*
* Unit tests for MySQLiDriver class
*/
require_once dirname(__FILE__) . '/../../model/Db.php';
require_once dirname(__FILE__) . '/../../model/DbStatement.php';
require_once dirname(__FILE__) . '/../../model/MySQLiStatement.php';
require_once dirname(__FILE__) . '/../../model/DbDriver.php';
require_once dirname(__FILE__) . '/../../model/MySQLiDriver.php';
class MySQLiDriverTest extends PHPUnit_Extensions_Database_TestCase
{
static private $pdo = null;
private $conn = null;
protected function getConnection()
{
if ($this->conn === null) {
if (self::$pdo == null) {
self::$pdo = new PDO($GLOBALS['DB_DSN'], $GLOBALS['DB_USER'], $GLOBALS['DB_PASSWD']);
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, $GLOBALS['DB_DBNAME']);
}
return $this->conn;
}
protected function getDataSet()
{
return $this->createFlatXMLDataSet(dirname(__FILE__) . '/testData.xml');
}
public function run(PHPUnit_Framework_TestResult $result = NULL)
{
$this->setPreserveGlobalState(false);
return parent::run($result);
}
public function testDriver()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$queryTable = $this->getConnection()->createQueryTable(
'table', 'SELECT * FROM `table`'
);
$expectedTable = $this->createFlatXmlDataSet(dirname(__FILE__) . '/testData.xml')
->getTable("table");
$this->assertTablesEqual($expectedTable, $queryTable);
$this->assertEquals(1, $driver->insert('table', array('id' => 3, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20')));
$this->assertEquals(3, $this->getConnection()->getRowCount('table'));
}
public function testGetConnection()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$this->assertInstanceOf('mysqli', $driver->getConnection());
$this->assertTrue($driver->isConnected());
}
/**
* @expectedException Exception
* @expectedExceptionMessage Unknown database
*/
public function testGetConnectionWrongConfig()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'nodb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$this->assertNull('mysqli', $driver->getConnection());
}
public function testDisconnect()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$driver->disconnect();
$this->assertAttributeEquals(null, 'connection', $driver);
$this->assertInstanceOf('mysqli', $driver->getConnection());
$this->assertAttributeInstanceOf('mysqli', 'connection', $driver);
$driver->disconnect();
$this->assertAttributeEquals(null, 'connection', $driver);
}
public function testInsert()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$this->assertEquals(1, $driver->insert('table', array('id' => 3, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20')));
$this->assertEquals(3, $driver->getInsertId());
$this->assertEquals(1, $driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20')));
$this->assertEquals(4, $driver->getInsertId());
$this->assertEquals(1, $driver->insert('table', array('id' => null, 'user' => true, 'content' => 'some test content', 'created' => '2011-11-07 11:35:20')));
$this->assertEquals(5, $driver->getInsertId());
$this->assertEquals(2, $driver->insert('table', array('id' => '5', 'user' => true, 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'), array('id' => 8)));
$this->assertEquals(8, $driver->getInsertId());
}
/**
* @TODO: DbDriver::getInsertId($table = null, $key = null) - params not used
*/
public function testGetInsertId()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$this->assertEquals(1, $driver->insert('table', array('id' => 3, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20')));
$this->assertEquals(3, $driver->getInsertId());
}
public function testTransaction()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$queryTable = $this->getConnection()->createQueryTable(
'table', 'SELECT * FROM `table`'
);
$expectedTable = $this->createFlatXmlDataSet(dirname(__FILE__) . '/testData.xml')
->getTable("table");
$this->assertTablesEqual($expectedTable, $queryTable);
$driver->getConnection();
$driver->beginTransaction();
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$queryTable = $this->getConnection()->createQueryTable(
'table', 'SELECT * FROM `table`'
);
$driver->commit();
$expectedTable = $this->createFlatXmlDataSet(dirname(__FILE__) . '/testDataAfterCommit.xml')
->getTable("table");
$this->assertTablesEqual($expectedTable, $queryTable);
}
public function testRollback()
{
if (!defined('DEBUG')) {
define('DEBUG', false);
}
$conf = array('hostname' => 'localhost', 'database' => 'testdb', 'username' => 'root', 'password' => '1234');
$driver = new MySQLiDriver($conf);
$queryTable = $this->getConnection()->createQueryTable(
'table', 'SELECT * FROM `table`'
);
$expectedTable = $this->createFlatXmlDataSet(dirname(__FILE__) . '/testData.xml')
->getTable("table");
$this->assertTablesEqual($expectedTable, $queryTable);
$driver->getConnection();
$driver->beginTransaction();
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->insert('table', array('id' => null, 'user' => 'tony', 'content' => 'some test content', 'created' => '2011-11-07 11:35:20'));
$driver->rollback();
$queryTable = $this->getConnection()->createQueryTable(
'table', 'SELECT * FROM `table`'
);
$this->assertTablesEqual($expectedTable, $queryTable);
}
}

1
tests/model/MySQLiStatementTest.php

@ -154,6 +154,7 @@ class MySQLiStatementTest extends PHPUnit_Framework_TestCase
/**
* @runInSeparateProcess
* @expectedException Exception
* @TODO: exception just for code coverage - could not mock mysqli properties
*/
public function testNumRows()
{

5
tests/model/testData.xml

@ -0,0 +1,5 @@
<?xml version="1.0" ?>
<dataset>
<table id="1" content="Hello buddy!" user="joe" created="2010-04-24 17:15:23" />
<table id="2" content="I like it!" user="nancy" created="2010-04-26 12:14:20" />
</dataset>

9
tests/model/testDataAfterCommit.xml

@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<dataset>
<table id="1" content="Hello buddy!" user="joe" created="2010-04-24 17:15:23" />
<table id="2" content="I like it!" user="nancy" created="2010-04-26 12:14:20" />
<table id="3" content="some test content" user="tony" created="2011-11-07 11:35:20" />
<table id="4" content="some test content" user="tony" created="2011-11-07 11:35:20" />
<table id="5" content="some test content" user="tony" created="2011-11-07 11:35:20" />
<table id="6" content="some test content" user="tony" created="2011-11-07 11:35:20" />
</dataset>

6
tests/phpunit.xml

@ -23,4 +23,10 @@
<directory>.</directory>
</blacklist>
</filter>
<php>
<var name="DB_DSN" value="mysql:dbname=testdb;host=localhost" />
<var name="DB_USER" value="root" />
<var name="DB_PASSWD" value="1234" />
<var name="DB_DBNAME" value="testdb" />
</php>
</phpunit>
Loading…
Cancel
Save