icingaweb2/test/php/library/Icinga/Application/DbAdapterFactoryTest.php

216 lines
7.2 KiB
PHP

<?php
// {{{ICINGA_LICENSE_HEADER}}}
/**
* This file is part of Icinga 2 Web.
*
* Icinga 2 Web - Head for multiple monitoring backends.
* Copyright (C) 2013 Icinga Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @copyright 2013 Icinga Development Team <info@icinga.org>
* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2
* @author Icinga Development Team <info@icinga.org>
*/
// {{{ICINGA_LICENSE_HEADER}}}
namespace Tests\Icinga\Application;
require_once 'Zend/Db.php';
require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
require_once 'Zend/Config.php';
require_once 'Zend/Log.php';
require_once 'Zend/Config.php';
require_once realpath(__DIR__. '/../../../library/Icinga/Application/ZendDbMock.php');
require_once realpath(__DIR__. '/../../../../../library/Icinga/Application/Logger.php');
require_once realpath(__DIR__. '/../../../../../library/Icinga/Exception/ConfigurationError.php');
require_once realpath(__DIR__. '/../../../../../library/Icinga/Exception/ProgrammingError.php');
require_once realpath(__DIR__. '/../../../../../library/Icinga/Util/ConfigAwareFactory.php');
require_once realpath(__DIR__. '/../../../../../library/Icinga/Application/DbAdapterFactory.php');
use \PDO;
use \Zend_Db;
use \Tests\Icinga\Application\ZendDbMock;
use \Icinga\Application\DbAdapterFactory;
/*
* Unit test for the class DbAdapterFactory
*/
class DbAdapterFactoryTest extends \PHPUnit_Framework_TestCase
{
/**
* The resources used for this test
*/
private $resources;
/**
* Set up the test fixture
*/
public function setUp()
{
$this->resources = array(
/*
* PostgreSQL database
*/
'resource1' => array(
'type' => 'db',
'db' => 'pgsql',
'dbname' => 'resource1',
'host' => 'host1',
'username' => 'username1',
'password' => 'password1',
'options' => array(
Zend_Db::AUTO_QUOTE_IDENTIFIERS => false,
Zend_Db::CASE_FOLDING => Zend_Db::CASE_LOWER,
Zend_Db::FETCH_MODE => Zend_Db::FETCH_OBJ
),
'driver_options' => array(
PDO::ATTR_TIMEOUT => 2,
PDO::ATTR_CASE => PDO::CASE_LOWER
),
'port' => 5432
),
/*
* MySQL database
*/
'resource2' => array(
'type' => 'db',
'db' => 'mysql',
'dbname' => 'resource2',
'host' => 'host2',
'username' => 'username2',
'password' => 'password2',
'options' => array(
Zend_Db::AUTO_QUOTE_IDENTIFIERS => false,
Zend_Db::CASE_FOLDING => Zend_Db::CASE_LOWER,
Zend_Db::FETCH_MODE => Zend_Db::FETCH_OBJ
),
'driver_options' => array(
PDO::ATTR_TIMEOUT => 2,
PDO::ATTR_CASE => PDO::CASE_LOWER,
PDO::MYSQL_ATTR_INIT_COMMAND =>
'SET SESSION SQL_MODE=\'STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,'
. 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,ANSI_QUOTES,PIPES_AS_CONCAT,'
. 'NO_ENGINE_SUBSTITUTION\';'
),
'port' => 3306
),
/*
* Unsupported database type
*/
'resource3' => array(
'type' => 'db',
'db' => 'mssql',
'dbname' => 'resource3',
'host' => 'host3',
'username' => 'username3',
'password' => 'password3'
),
/*
* Unsupported resource type
*/
'resource4' => array(
'type' => 'ldap',
),
);
DbAdapterFactory::setConfig(
$this->resources,
array(
'factory' => '\Tests\Icinga\Application\ZendDbMock'
)
);
}
public function testGetValidResource()
{
DbAdapterFactory::getDbAdapter('resource2');
$this->assertEquals(
'Pdo_Mysql',
ZendDbMock::getAdapter(),
'The db adapter name must be Pdo_Mysql.'
);
$this->assertEquals(
$this->getOptions($this->resources['resource2']),
ZendDbMock::getConfig(),
'The options must match the original config file content'
);
}
public function testResourceExists()
{
$this->assertTrue(
DbAdapterFactory::resourceExists('resource2'),
'resourceExists() called with an existing resource should return true'
);
$this->assertFalse(
DbAdapterFactory::resourceExists('not existing'),
'resourceExists() called with an existing resource should return false'
);
$this->assertFalse(
DbAdapterFactory::resourceExists('resource4'),
'resourceExists() called with an incompatible resource should return false'
);
}
public function testGetResources()
{
$withoutIncompatible = array_merge(array(), $this->resources);
unset($withoutIncompatible['resource4']);
$this->assertEquals(
$withoutIncompatible,
DbAdapterFactory::getResources(),
'getResources should return an array of all existing resources that are compatible'
);
}
/**
* Test if an exception is thrown, when an invalid database is used.
*
* @expectedException Icinga\Exception\ConfigurationError
*/
public function testGetInvalidDatabase()
{
DbAdapterFactory::getDbAdapter('resource3');
}
/**
* Test if an exception is thrown, when an invalid type is used.
*
* @expectedException Icinga\Exception\ConfigurationError
*/
public function testGetInvalidType()
{
DbAdapterFactory::getDbAdapter('resource4');
}
/**
* Prepare the options object for assertions
*
* @param Zend_Config $config The configuration to prepare
*
* @return array The prepared options object
*/
private function getOptions($config)
{
$options = array_merge(array(), $config);
unset($options['type']);
unset($options['db']);
return $options;
}
}