1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
"""Code generation and assertion tests."""
import itertools
import textwrap
from pytest_bdd.scenario import get_python_name_generator
def test_python_name_generator():
"""Test python name generator function."""
assert list(itertools.islice(get_python_name_generator("Some name"), 3)) == [
"test_some_name",
"test_some_name_1",
"test_some_name_2",
]
def test_generate_missing(pytester):
"""Test generate missing command."""
pytester.makefile(
".feature",
generation=textwrap.dedent(
"""\
Feature: Missing code generation
Background:
Given I have a foobar
Scenario: Scenario tests which are already bound to the tests stay as is
Given I have a bar
Scenario: Code is generated for scenarios which are not bound to any tests
Given I have a bar
Scenario: Code is generated for scenario steps which are not yet defined(implemented)
Given I have a custom bar
"""
),
)
pytester.makepyfile(
textwrap.dedent(
"""\
import functools
from pytest_bdd import scenario, given
scenario = functools.partial(scenario, "generation.feature")
@given("I have a bar")
def _():
return "bar"
@scenario("Scenario tests which are already bound to the tests stay as is")
def test_foo():
pass
@scenario("Code is generated for scenario steps which are not yet defined(implemented)")
def test_missing_steps():
pass
"""
)
)
result = pytester.runpytest("--generate-missing", "--feature", "generation.feature")
result.assert_outcomes(passed=0, failed=0, errors=0)
assert not result.stderr.str()
assert result.ret == 0
result.stdout.fnmatch_lines(
['Scenario "Code is generated for scenarios which are not bound to any tests" is not bound to any test *']
)
result.stdout.fnmatch_lines(
[
'Step Given "I have a custom bar" is not defined in the scenario '
'"Code is generated for scenario steps which are not yet defined(implemented)" *'
]
)
result.stdout.fnmatch_lines(
['Step Given "I have a foobar" is not defined in the background of the feature "Missing code generation" *']
)
result.stdout.fnmatch_lines(["Please place the code above to the test file(s):"])
def test_generate_missing_with_step_parsers(pytester):
"""Test that step parsers are correctly discovered and won't be part of the missing steps."""
pytester.makefile(
".feature",
generation=textwrap.dedent(
"""\
Feature: Missing code generation with step parsers
Scenario: Step parsers are correctly discovered
Given I use the string parser without parameter
And I use parsers.parse with parameter 1
And I use parsers.re with parameter 2
And I use parsers.cfparse with parameter 3
"""
),
)
pytester.makepyfile(
textwrap.dedent(
"""\
import functools
from pytest_bdd import scenarios, given, parsers
scenarios("generation.feature")
@given("I use the string parser without parameter")
def _():
return None
@given(parsers.parse("I use parsers.parse with parameter {param}"))
def _(param):
return param
@given(parsers.re(r"^I use parsers.re with parameter (?P<param>.*?)$"))
def _(param):
return param
@given(parsers.cfparse("I use parsers.cfparse with parameter {param:d}"))
def _(param):
return param
"""
)
)
result = pytester.runpytest("--generate-missing", "--feature", "generation.feature")
result.assert_outcomes(passed=0, failed=0, errors=0)
assert not result.stderr.str()
assert result.ret == 0
output = result.stdout.str()
assert "I use the string parser" not in output
assert "I use parsers.parse" not in output
assert "I use parsers.re" not in output
assert "I use parsers.cfparse" not in output
|