create a temporary project dir for tests

The project directory contains the website script as
configured through the test configuration. This means
that tests are now completely independet of any
configuration that may be contained in the build
directory.

Also removes the hack to inject additional settings via
a environment variable.
This commit is contained in:
Sarah Hoffmann
2021-01-04 11:39:45 +01:00
parent 5e989b9296
commit 4aba70caee
2 changed files with 20 additions and 22 deletions

View File

@@ -20,7 +20,6 @@ userconfig = {
'TEMPLATE_DB' : 'test_template_nominatim',
'TEST_DB' : 'test_nominatim',
'API_TEST_DB' : 'test_api_nominatim',
'TEST_SETTINGS_FILE' : '/tmp/nominatim_settings.php',
'SERVER_MODULE_PATH' : None,
'PHPCOV' : False, # set to output directory to enable code coverage
}
@@ -43,15 +42,14 @@ class NominatimEnvironment(object):
self.test_db = config['TEST_DB']
self.api_test_db = config['API_TEST_DB']
self.server_module_path = config['SERVER_MODULE_PATH']
self.local_settings_file = config['TEST_SETTINGS_FILE']
self.reuse_template = not config['REMOVE_TEMPLATE']
self.keep_scenario_db = config['KEEP_TEST_DB']
self.code_coverage_path = config['PHPCOV']
self.code_coverage_id = 1
self.test_env = None
os.environ['NOMINATIM_SETTINGS'] = self.local_settings_file
self.template_db_done = False
self.website_dir = None
def connect_database(self, dbname):
dbargs = {'database': dbname}
@@ -80,26 +78,24 @@ class NominatimEnvironment(object):
(';user=' + self.db_user) if self.db_user else '',
(';password=' + self.db_pass) if self.db_pass else ''
)
if self.website_dir is not None \
and self.test_env is not None \
and dsn == self.test_env['NOMINATIM_DATABASE_DSN']:
return # environment already set uo
self.test_env = os.environ
self.test_env['NOMINATIM_DATABASE_DSN'] = dsn
self.test_env['NOMINATIM_FLATNODE_FILE'] = ''
self.test_env['NOMINATIM_IMPORT_STYLE'] = 'full'
self.test_env['NOMINATIM_USE_US_TIGER_DATA'] = 'yes'
f = open(self.local_settings_file, 'w')
# https://secure.php.net/manual/en/ref.pdo-pgsql.connection.php
f.write("<?php\n @define('CONST_Database_DSN', '{}');\n".format(dsn))
f.write("@define('CONST_Osm2pgsql_Flatnode_File', null);\n")
f.write("@define('CONST_Import_Style', CONST_DataDir.'/settings/import-full.style');\n")
f.write("@define('CONST_Use_US_Tiger_Data', true);\n")
f.close()
if self.website_dir is not None:
self.website_dir.cleanup()
self.website_dir = tempfile.TemporaryDirectory()
self.run_setup_script('setup-website')
def cleanup(self):
try:
os.remove(self.local_settings_file)
except OSError:
pass # ignore missing file
def db_drop_database(self, name):
conn = self.connect_database('postgres')
@@ -203,7 +199,13 @@ class NominatimEnvironment(object):
cmd.extend(['--%s' % x for x in args])
for k, v in kwargs.items():
cmd.extend(('--' + k.replace('_', '-'), str(v)))
proc = subprocess.Popen(cmd, cwd=self.build_dir, env=self.test_env,
if self.website_dir is not None:
cwd = self.website_dir.name
else:
cwd = self.build_dir
proc = subprocess.Popen(cmd, cwd=cwd, env=self.test_env,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(outp, outerr) = proc.communicate()
outerr = outerr.decode('utf-8').replace('\\n', '\n')
@@ -300,9 +302,6 @@ def before_all(context):
context.nominatim = NominatimEnvironment(context.config.userdata)
context.osm = OSMDataFactory()
def after_all(context):
context.nominatim.cleanup()
def before_scenario(context, scenario):
if 'DB' in context.tags:

View File

@@ -302,10 +302,9 @@ def send_api_query(endpoint, params, fmt, context):
env['SCRIPT_NAME'] = '/%s.php' % endpoint
env['REQUEST_URI'] = '%s?%s' % (env['SCRIPT_NAME'], env['QUERY_STRING'])
env['CONTEXT_DOCUMENT_ROOT'] = os.path.join(context.nominatim.build_dir, 'website')
env['CONTEXT_DOCUMENT_ROOT'] = os.path.join(context.nominatim.website_dir.name, 'website')
env['SCRIPT_FILENAME'] = os.path.join(env['CONTEXT_DOCUMENT_ROOT'],
'%s.php' % endpoint)
env['NOMINATIM_SETTINGS'] = context.nominatim.local_settings_file
logger.debug("Environment:" + json.dumps(env, sort_keys=True, indent=2))
@@ -327,7 +326,7 @@ def send_api_query(endpoint, params, fmt, context):
for k,v in params.items():
cmd.append("%s=%s" % (k, v))
proc = subprocess.Popen(cmd, cwd=context.nominatim.build_dir, env=env,
proc = subprocess.Popen(cmd, cwd=context.nominatim.website_dir.name, env=env,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(outp, err) = proc.communicate()