pytest-bdd/tests/feature/test_feature_base_dir.py

151 lines
3.9 KiB
Python

"""Test feature base dir."""
import os
import pytest
NOT_EXISTING_FEATURE_PATHS = [".", "/does/not/exist/"]
@pytest.mark.parametrize("base_dir", NOT_EXISTING_FEATURE_PATHS)
def test_feature_path_not_found(pytester, base_dir):
"""Test feature base dir."""
prepare_testdir(pytester, base_dir)
result = pytester.runpytest("-k", "test_not_found_by_ini")
result.assert_outcomes(passed=2)
def test_feature_path_ok(pytester):
base_dir = "features"
prepare_testdir(pytester, base_dir)
result = pytester.runpytest("-k", "test_ok_by_ini")
result.assert_outcomes(passed=2)
def test_feature_path_ok_running_outside_rootdir(pytester):
base_dir = "features"
prepare_testdir(pytester, base_dir)
old_dir = os.getcwd()
os.chdir("/")
try:
result = pytester.runpytest(pytester.path, "-k", "test_ok_by_ini")
result.assert_outcomes(passed=2)
finally:
os.chdir(old_dir)
def test_feature_path_by_param_not_found(pytester):
"""As param takes precedence even if ini config is correct it should fail
if passed param is incorrect"""
base_dir = "features"
prepare_testdir(pytester, base_dir)
result = pytester.runpytest("-k", "test_not_found_by_param")
result.assert_outcomes(passed=4)
@pytest.mark.parametrize("base_dir", NOT_EXISTING_FEATURE_PATHS)
def test_feature_path_by_param_ok(pytester, base_dir):
"""If ini config is incorrect but param path is fine it should be able
to find features"""
prepare_testdir(pytester, base_dir)
result = pytester.runpytest("-k", "test_ok_by_param")
result.assert_outcomes(passed=2)
def prepare_testdir(pytester, ini_base_dir):
pytester.makeini(
"""
[pytest]
bdd_features_base_dir={}
""".format(
ini_base_dir
)
)
feature_file = pytester.mkdir("features").joinpath("steps.feature")
feature_file.write_text(
"""
Feature: Feature path
Scenario: When scenario found
Given found
"""
)
pytester.makepyfile(
"""
import os.path
import pytest
from pytest_bdd import scenario, scenarios
FEATURE = 'steps.feature'
@pytest.fixture(params=[
'When scenario found',
])
def scenario_name(request):
return request.param
@pytest.mark.parametrize(
'multiple', [True, False]
)
def test_not_found_by_ini(scenario_name, multiple):
with pytest.raises(IOError) as exc:
if multiple:
scenarios(FEATURE)
else:
scenario(FEATURE, scenario_name)
assert os.path.abspath(os.path.join('{}', FEATURE)) in str(exc.value)
@pytest.mark.parametrize(
'multiple', [True, False]
)
def test_ok_by_ini(scenario_name, multiple):
# Shouldn't raise any exception
if multiple:
scenarios(FEATURE)
else:
scenario(FEATURE, scenario_name)
@pytest.mark.parametrize(
'multiple', [True, False]
)
@pytest.mark.parametrize(
'param_base_dir', [
'.',
'/does/not/exist/',
]
)
def test_not_found_by_param(scenario_name, param_base_dir, multiple):
with pytest.raises(IOError) as exc:
if multiple:
scenarios(FEATURE, features_base_dir=param_base_dir)
else:
scenario(FEATURE, scenario_name, features_base_dir=param_base_dir)
assert os.path.abspath(os.path.join(param_base_dir, FEATURE)) in str(exc.value)
@pytest.mark.parametrize(
'multiple', [True, False]
)
def test_ok_by_param(scenario_name, multiple):
# Shouldn't raise any exception no matter of bdd_features_base_dir in ini
if multiple:
scenarios(FEATURE, features_base_dir='features')
else:
scenario(FEATURE, scenario_name, features_base_dir='features')
""".format(
ini_base_dir
)
)