From be6262c6cedcba1f4041e66518facfdea79679a0 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Wed, 28 Apr 2021 20:13:51 +0200 Subject: [PATCH] move status test to tokenizer The availability of the module is now tested by the tokenizer. --- lib-php/Status.php | 22 +++---------- lib-php/tokenizer/legacy_tokenizer.php | 21 ++++++++++++ test/bdd/steps/nominatim_environment.py | 18 ++++++++--- test/php/Nominatim/StatusTest.php | 43 ++----------------------- 4 files changed, 42 insertions(+), 62 deletions(-) diff --git a/lib-php/Status.php b/lib-php/Status.php index 2d9e78db..52abfcd0 100644 --- a/lib-php/Status.php +++ b/lib-php/Status.php @@ -2,6 +2,8 @@ namespace Nominatim; +require_once(CONST_TokenizerDir.'/tokenizer.php'); + use Exception; class Status @@ -25,24 +27,8 @@ class Status throw new Exception('Database connection failed', 700); } - $sStandardWord = $this->oDB->getOne("SELECT make_standard_name('a')"); - if ($sStandardWord === false) { - throw new Exception('Module failed', 701); - } - - if ($sStandardWord != 'a') { - throw new Exception('Module call failed', 702); - } - - $sSQL = 'SELECT word_id, word_token, word, class, type, country_code, '; - $sSQL .= "operator, search_name_count FROM word WHERE word_token IN (' a')"; - $iWordID = $this->oDB->getOne($sSQL); - if ($iWordID === false) { - throw new Exception('Query failed', 703); - } - if (!$iWordID) { - throw new Exception('No value', 704); - } + $oTokenizer = new \Nominatim\Tokenizer($this->oDB); + $oTokenizer->checkStatus(); } public function dataDate() diff --git a/lib-php/tokenizer/legacy_tokenizer.php b/lib-php/tokenizer/legacy_tokenizer.php index 804f69e2..0fb37fd0 100644 --- a/lib-php/tokenizer/legacy_tokenizer.php +++ b/lib-php/tokenizer/legacy_tokenizer.php @@ -15,6 +15,27 @@ class Tokenizer $this->oNormalizer = \Transliterator::createFromRules(CONST_Term_Normalization_Rules); } + public function checkStatus() + { + $sStandardWord = $this->oDB->getOne("SELECT make_standard_name('a')"); + if ($sStandardWord === false) { + throw new Exception('Module failed', 701); + } + + if ($sStandardWord != 'a') { + throw new Exception('Module call failed', 702); + } + + $sSQL = "SELECT word_id FROM word WHERE word_token IN (' a')"; + $iWordID = $this->oDB->getOne($sSQL); + if ($iWordID === false) { + throw new Exception('Query failed', 703); + } + if (!$iWordID) { + throw new Exception('No value', 704); + } + } + public function setCountryRestriction($aCountries) { diff --git a/test/bdd/steps/nominatim_environment.py b/test/bdd/steps/nominatim_environment.py index 24f777f6..f6e3a039 100644 --- a/test/bdd/steps/nominatim_environment.py +++ b/test/bdd/steps/nominatim_environment.py @@ -204,7 +204,17 @@ class NominatimEnvironment: def setup_unknown_db(self): """ Setup a test against a non-existing database. """ - self.write_nominatim_config('UNKNOWN_DATABASE_NAME') + # The tokenizer needs an existing database to function. + # So start with the usual database + class _Context: + db = None + + context = _Context() + self.setup_db(context) + tokenizer_factory.create_tokenizer(self.get_test_config(), init_db=False) + + # Then drop the DB again + self.teardown_db(context, force_drop=True) def setup_db(self, context): """ Setup a test against a fresh, empty test database. @@ -221,13 +231,13 @@ class NominatimEnvironment: context.db.autocommit = True psycopg2.extras.register_hstore(context.db, globally=False) - def teardown_db(self, context): + def teardown_db(self, context, force_drop=False): """ Remove the test database, if it exists. """ - if 'db' in context: + if hasattr(context, 'db'): context.db.close() - if not self.keep_scenario_db: + if force_drop or not self.keep_scenario_db: self.db_drop_database(self.test_db) def _reuse_or_drop_db(self, name): diff --git a/test/php/Nominatim/StatusTest.php b/test/php/Nominatim/StatusTest.php index 8cb8a703..9e03a970 100644 --- a/test/php/Nominatim/StatusTest.php +++ b/test/php/Nominatim/StatusTest.php @@ -2,6 +2,8 @@ namespace Nominatim; +@define('CONST_TokenizerDir', dirname(__FILE__)); + require_once(CONST_LibDir.'/DB.php'); require_once(CONST_LibDir.'/Status.php'); @@ -40,45 +42,6 @@ class StatusTest extends \PHPUnit\Framework\TestCase $this->assertEquals('No database', $oStatus->status()); } - - public function testModuleFail() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Module call failed'); - $this->expectExceptionCode(702); - - // stub has getOne method but doesn't return anything - $oDbStub = $this->getMockBuilder(Nominatim\DB::class) - ->setMethods(array('connect', 'getOne')) - ->getMock(); - - $oStatus = new Status($oDbStub); - $this->assertNull($oStatus->status()); - } - - - public function testWordIdQueryFail() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('No value'); - $this->expectExceptionCode(704); - - $oDbStub = $this->getMockBuilder(Nominatim\DB::class) - ->setMethods(array('connect', 'getOne')) - ->getMock(); - - // return no word_id - $oDbStub->method('getOne') - ->will($this->returnCallback(function ($sql) { - if (preg_match("/make_standard_name\('a'\)/", $sql)) return 'a'; - if (preg_match('/SELECT word_id, word_token/', $sql)) return null; - })); - - $oStatus = new Status($oDbStub); - $this->assertNull($oStatus->status()); - } - - public function testOK() { $oDbStub = $this->getMockBuilder(Nominatim\DB::class) @@ -100,7 +63,7 @@ class StatusTest extends \PHPUnit\Framework\TestCase $oDbStub = $this->getMockBuilder(Nominatim\DB::class) ->setMethods(array('getOne')) ->getMock(); - + $oDbStub->method('getOne') ->willReturn(1519430221);