- cd $TRAVIS_BUILD_DIR/
- if [[ $TEST_SUITE == "tests" ]]; then phpcs --report-width=120 . ; fi
- cd $TRAVIS_BUILD_DIR/test/php
- - if [[ $TEST_SUITE == "tests" ]]; then /usr/bin/phpunit ./ ; fi
+ - if [[ $TEST_SUITE == "tests" ]]; then UNIT_TEST_DSN='pgsql:dbname=nominatim_unit_tests' /usr/bin/phpunit ./ ; fi
- cd $TRAVIS_BUILD_DIR/test/bdd
- # behave --format=progress3 api
- if [[ $TEST_SUITE == "tests" ]]; then behave -DREMOVE_TEMPLATE=1 --format=progress3 db ; fi
return ($this->getOne($sSQL, array(':tablename' => $sTableName)) == 1);
}
+ /**
+ * Returns a list of table names in the database
+ *
+ * @return array[]
+ */
+ public function getListOfTables()
+ {
+ return $this->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'");
+ }
+
+ /**
+ * Deletes a table. Returns true on success. Returns true if the table didn't exist.
+ *
+ * @param string $sTableName
+ *
+ * @return boolean
+ */
+ public function deleteTable($sTableName)
+ {
+ return $this->exec('DROP TABLE IF EXISTS '.$sTableName.' CASCADE') == 0;
+ }
+
/**
* Check if an index exists in the database. Optional filtered by tablename
*
}
/**
- * Since the DSN includes the database name, checks if the connection works.
+ * Tries to connect to the database but on failure doesn't throw an exception.
*
* @return boolean
*/
- public function databaseExists()
+ public function checkConnection()
{
$bExists = true;
try {
return (float) ($aMatches[1].'.'.$aMatches[2]);
}
+ /**
+ * Returns an associate array of postgresql database connection settings. Keys can
+ * be 'database', 'hostspec', 'port', 'username', 'password'.
+ * Returns empty array on failure, thus check if at least 'database' is set.
+ *
+ * @return array[]
+ */
public static function parseDSN($sDSN)
{
// https://secure.php.net/manual/en/ref.pdo-pgsql.connection.php
}
return $aInfo;
}
+
+ /**
+ * Takes an array of settings and return the DNS string. Key names can be
+ * 'database', 'hostspec', 'port', 'username', 'password' but aliases
+ * 'dbname', 'host' and 'user' are also supported.
+ *
+ * @return string
+ *
+ */
+ public static function generateDSN($aInfo)
+ {
+ $sDSN = 'pgsql:';
+ if (isset($aInfo['host'])) {
+ $sDSN .= 'host=' . $aInfo['host'] . ';';
+ } elseif (isset($aInfo['hostspec'])) {
+ $sDSN .= 'host=' . $aInfo['hostspec'] . ';';
+ }
+ if (isset($aInfo['port'])) {
+ $sDSN .= 'port=' . $aInfo['port'] . ';';
+ }
+ if (isset($aInfo['dbname'])) {
+ $sDSN .= 'dbname=' . $aInfo['dbname'] . ';';
+ } elseif (isset($aInfo['database'])) {
+ $sDSN .= 'dbname=' . $aInfo['database'] . ';';
+ }
+ if (isset($aInfo['user'])) {
+ $sDSN .= 'user=' . $aInfo['user'] . ';';
+ } elseif (isset($aInfo['username'])) {
+ $sDSN .= 'user=' . $aInfo['username'] . ';';
+ }
+ if (isset($aInfo['password'])) {
+ $sDSN .= 'password=' . $aInfo['password'] . ';';
+ }
+ $sDSN = preg_replace('/;$/', '', $sDSN);
+
+ return $sDSN;
+ }
}
info('Create DB');
$oDB = new \Nominatim\DB;
- if ($oDB->databaseExists()) {
+ if ($oDB->checkConnection()) {
fail('database already exists ('.CONST_Database_DSN.')');
}
);
$aDropTables = array();
- $aHaveTables = $this->oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'");
+ $aHaveTables = $this->oDB->getListOfTables();
foreach ($aHaveTables as $sTable) {
$bFound = false;
private function dropTable($sName)
{
if ($this->bVerbose) echo "Dropping table $sName\n";
- $this->oDB->exec('DROP TABLE IF EXISTS '.$sName.' CASCADE');
+ $this->oDB->deleteTable($sName);
}
/**
To execute the test suite run
cd test/php
- phpunit ../
+ UNIT_TEST_DSN='pgsql:dbname=nominatim_unit_tests' phpunit ../
It will read phpunit.xml which points to the library, test path, bootstrap
strip and set other parameters.
+The database set by `UNIT_TEST_DSN` will be deleted and recreated. Not setting
+it will skip some tests as pending, but not fail the tests.
BDD Functional Tests
====================
$this->assertTrue($oDB->connect());
}
- public function testDatabaseExists()
+ public function testCheckConnection()
{
$oDB = new \Nominatim\DB('');
- $this->assertFalse($oDB->databaseExists());
+ $this->assertFalse($oDB->checkConnection());
}
public function testErrorHandling()
\Nominatim\DB::parseDSN('pgsql:dbname=db1;host=machine1;port=1234;user=john;password=secret')
);
}
+
+ public function testGenerateDSN()
+ {
+ $this->assertEquals(
+ 'pgsql:',
+ \Nominatim\DB::generateDSN(array())
+ );
+ $this->assertEquals(
+ 'pgsql:host=machine1;dbname=db1',
+ \Nominatim\DB::generateDSN(\Nominatim\DB::parseDSN('pgsql:host=machine1;dbname=db1'))
+ );
+ }
+
+ public function testAgainstDatabase()
+ {
+ if (getenv('UNIT_TEST_DSN') == false) $this->markTestSkipped('UNIT_TEST_DSN not set');
+
+ ## Create the database.
+ {
+ $aDSNParsed = \Nominatim\DB::parseDSN(getenv('UNIT_TEST_DSN'));
+ $sDbname = $aDSNParsed['database'];
+ $aDSNParsed['database'] = 'postgres';
+
+ $oDB = new \Nominatim\DB(\Nominatim\DB::generateDSN($aDSNParsed));
+ $oDB->connect();
+ $oDB->exec('DROP DATABASE IF EXISTS ' . $sDbname);
+ $oDB->exec('CREATE DATABASE ' . $sDbname);
+ }
+
+ $oDB = new \Nominatim\DB(getenv('UNIT_TEST_DSN'));
+ $oDB->connect();
+
+ $this->assertTrue(
+ $oDB->checkConnection($sDbname)
+ );
+
+ # Tables, Indices
+ {
+ $this->assertEmpty($oDB->getListOfTables());
+ $oDB->exec('CREATE TABLE table1 (id integer, city varchar, country varchar)');
+ $oDB->exec('CREATE TABLE table2 (id integer, city varchar, country varchar)');
+ $this->assertEquals(
+ array('table1', 'table2'),
+ $oDB->getListOfTables()
+ );
+ $this->assertTrue($oDB->deleteTable('table2'));
+ $this->assertTrue($oDB->deleteTable('table99'));
+ $this->assertEquals(
+ array('table1'),
+ $oDB->getListOfTables()
+ );
+
+ $this->assertTrue($oDB->tableExists('table1'));
+ $this->assertFalse($oDB->tableExists('table99'));
+ $this->assertFalse($oDB->tableExists(null));
+
+ $this->assertEmpty($oDB->getListOfIndices());
+ $oDB->exec('CREATE UNIQUE INDEX table1_index ON table1 (id)');
+ $this->assertEquals(
+ array('table1_index'),
+ $oDB->getListOfIndices()
+ );
+ $this->assertEmpty($oDB->getListOfIndices('table2'));
+ }
+
+ # select queries
+ {
+ $oDB->exec(
+ "INSERT INTO table1 VALUES (1, 'Berlin', 'Germany'), (2, 'Paris', 'France')"
+ );
+
+ $this->assertEquals(
+ array(
+ array('city' => 'Berlin'),
+ array('city' => 'Paris')
+ ),
+ $oDB->getAll('SELECT city FROM table1')
+ );
+ $this->assertEquals(
+ array(),
+ $oDB->getAll('SELECT city FROM table1 WHERE id=999')
+ );
+
+
+ $this->assertEquals(
+ array('id' => 1, 'city' => 'Berlin', 'country' => 'Germany'),
+ $oDB->getRow('SELECT * FROM table1 WHERE id=1')
+ );
+ $this->assertEquals(
+ false,
+ $oDB->getRow('SELECT * FROM table1 WHERE id=999')
+ );
+
+
+ $this->assertEquals(
+ array('Berlin', 'Paris'),
+ $oDB->getCol('SELECT city FROM table1')
+ );
+ $this->assertEquals(
+ array(),
+ $oDB->getCol('SELECT city FROM table1 WHERE id=999')
+ );
+
+ $this->assertEquals(
+ 'Berlin',
+ $oDB->getOne('SELECT city FROM table1 WHERE id=1')
+ );
+ $this->assertEquals(
+ null,
+ $oDB->getOne('SELECT city FROM table1 WHERE id=999')
+ );
+
+ $this->assertEquals(
+ array('Berlin' => 'Germany', 'Paris' => 'France'),
+ $oDB->getAssoc('SELECT city, country FROM table1')
+ );
+ $this->assertEquals(
+ array(),
+ $oDB->getAssoc('SELECT city, country FROM table1 WHERE id=999')
+ );
+ }
+ }
}
echo 'Checking database got created ... ';
-if ($oDB->databaseExists()) {
+if ($oDB->checkConnection()) {
$print_success();
} else {
$print_fail();