def test_parse_table(): parser = Parser([ (1, gherkin.TOKEN_TABLE_COLUMN, 'name'), (1, gherkin.TOKEN_TABLE_COLUMN, 'email'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_TABLE_COLUMN, 'Lincoln'), (2, gherkin.TOKEN_TABLE_COLUMN, '*****@*****.**'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_TABLE_COLUMN, 'Gabriel'), (3, gherkin.TOKEN_TABLE_COLUMN, '*****@*****.**'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_LABEL, 'Scenario'), (4, gherkin.TOKEN_EOF, ''), ]) feature = parser.parse_table() feature.should.equal( Ast.Table(line=1, fields=[ ['name', 'email'], ['Lincoln', '*****@*****.**'], ['Gabriel', '*****@*****.**'], ]))
def teste_parse_scenario_with_description(): parser = Parser([ (1, gherkin.TOKEN_LABEL, 'Scenario'), (1, gherkin.TOKEN_TEXT, 'Scenario title'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_TEXT, 'Scenario description'), (2, gherkin.TOKEN_TEXT, 'More description'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_TEXT, 'Given first step'), ]) feature = parser.parse_scenarios() feature.should.equal([ Ast.Scenario( line=1, title=Ast.Text(line=1, text='Scenario title'), description=Ast.Text(line=2, text='Scenario description More description'), steps=[ Ast.Step(line=3, title=Ast.Text(line=3, text='Given first step')) ], ) ])
def test_parse_metadata_incomplete(): parser = Parser([ (1, gherkin.TOKEN_META_LABEL, 'language'), (1, gherkin.TOKEN_EOF, ''), ]) parser.parse_metadata().should.be.none
def test_parse_metadata_syntax_error(): parser = Parser([ (1, gherkin.TOKEN_META_LABEL, 'language'), (1, gherkin.TOKEN_TEXT, 'pt-br'), ]) parser.parse_metadata.when.called.should.throw( SyntaxError, 'No value found for the meta-field `language\'')
def test_parse_tags_on_scenario_outline_examples(): "Parser should allow tags to be defined in examples" # Given a parser loaded with a document that contains tags on # scenario outline examples # @tagged-feature # Feature: Parse tags # @tag1 @tag2 # Scenario Outline: Test # @example-tag1 # @example-tag2 # Examples: # | Header | parser = Parser([ (1, gherkin.TOKEN_TAG, 'tagged-feature'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_LABEL, 'Feature'), (2, gherkin.TOKEN_TEXT, 'Parse tags'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_TAG, 'tag1'), (3, gherkin.TOKEN_TAG, 'tag2'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_LABEL, 'Scenario Outline'), (4, gherkin.TOKEN_TEXT, 'Test'), (4, gherkin.TOKEN_NEWLINE, '\n'), (5, gherkin.TOKEN_TAG, 'example-tag1'), (5, gherkin.TOKEN_NEWLINE, '\n'), (6, gherkin.TOKEN_TAG, 'example-tag2'), (6, gherkin.TOKEN_NEWLINE, '\n'), (7, gherkin.TOKEN_LABEL, 'Examples'), (7, gherkin.TOKEN_NEWLINE, '\n'), (8, gherkin.TOKEN_TABLE_COLUMN, 'Header'), (8, gherkin.TOKEN_NEWLINE, '\n'), (9, gherkin.TOKEN_EOF, ''), ]) # When I parse the document feature = parser.parse_feature() # Then I see all the tags were found feature.should.equal( Ast.Feature(line=2, title=Ast.Text(line=2, text='Parse tags'), tags=['tagged-feature'], scenarios=[ Ast.ScenarioOutline( line=4, title=Ast.Text(line=4, text='Test'), tags=['tag1', 'tag2'], examples=Ast.Examples( line=7, tags=['example-tag1', 'example-tag2'], table=Ast.Table(line=8, fields=[['Header']])), ) ]))
def test_parse_title(): parser = Parser([ (1, gherkin.TOKEN_TEXT, 'Scenario title'), (1, gherkin.TOKEN_NEWLINE, '\n'), ]) feature = parser.parse_title() feature.should.equal(Ast.Text(line=1, text='Scenario title'))
def test_parse_empty_title(): parser = Parser([ (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_TEXT, 'more text after title'), ]) feature = parser.parse_title() feature.should.be.none
def test_parse_metadata(): parser = Parser([ (1, gherkin.TOKEN_META_LABEL, 'language'), (1, gherkin.TOKEN_META_VALUE, 'pt-br'), ]) metadata = parser.parse_metadata() metadata.should.equal(Ast.Metadata(line=1, key='language', value='pt-br'))
def test_parse_text(): parser = Parser([ (1, gherkin.TOKEN_TAG, 'tag1'), (1, gherkin.TOKEN_TAG, 'tag2'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_TAG, 'tag3'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_LABEL, 'Feature'), ]) tags = parser.parse_tags() tags.should.equal(['tag1', 'tag2', 'tag3'])
def test_parse_background(): # Background: title # Given two users in the database: # | name | email | # | Lincoln | [email protected] | # | Gabriel | [email protected] | # Scenario: parser = Parser([ (1, gherkin.TOKEN_LABEL, 'Background'), (1, gherkin.TOKEN_TEXT, 'title'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_LABEL, 'Given two users in the database'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_TABLE_COLUMN, 'name'), (3, gherkin.TOKEN_TABLE_COLUMN, 'email'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_TABLE_COLUMN, 'Lincoln'), (4, gherkin.TOKEN_TABLE_COLUMN, '*****@*****.**'), (4, gherkin.TOKEN_NEWLINE, '\n'), (5, gherkin.TOKEN_TABLE_COLUMN, 'Gabriel'), (5, gherkin.TOKEN_TABLE_COLUMN, '*****@*****.**'), (5, gherkin.TOKEN_NEWLINE, '\n'), (6, gherkin.TOKEN_LABEL, 'Scenario'), ]) # When the background is parsed feature = parser.parse_background() # Then I see the output contains a valid background with a step # with examples. Notice the scenario label is not returned # anywhere here feature.should.equal( Ast.Background( line=1, title=Ast.Text(line=1, text='title'), steps=[ Ast.Step( line=2, title=Ast.Text(line=2, text='Given two users in the database'), table=Ast.Table(line=3, fields=[ ['name', 'email'], ['Lincoln', '*****@*****.**'], ['Gabriel', '*****@*****.**'], ])) ]))
def test_parse_quoted_strings_on_steps(): # Given a parser loaded with the following Gherkin document # Given the following email template: # '''Here we go with a pretty # big block of text # surrounded by triple quoted strings # ''' # And a cat picture # """Now notice we didn't use (:) above # """ parser = Parser([ (1, gherkin.TOKEN_LABEL, 'Given the following email template'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_QUOTES, "'''"), (2, gherkin.TOKEN_TEXT, '''Here we go with a pretty big block of text surrounded by triple quoted strings '''), (5, gherkin.TOKEN_QUOTES, "'''"), (5, gherkin.TOKEN_NEWLINE, '\n'), (6, gherkin.TOKEN_TEXT, 'And a cat picture'), (6, gherkin.TOKEN_NEWLINE, '\n'), (7, gherkin.TOKEN_QUOTES, '"""'), (7, gherkin.TOKEN_TEXT, "Now notice we didn't use (:) above\n "), (8, gherkin.TOKEN_QUOTES, '"""'), (8, gherkin.TOKEN_NEWLINE, '\n'), (9, gherkin.TOKEN_EOF, '') ]) steps = parser.parse_steps() steps.should.equal([ Ast.Step(line=1, title=Ast.Text(line=1, text='Given the following email template'), text=Ast.Text(line=2, text='''Here we go with a pretty big block of text surrounded by triple quoted strings ''')), Ast.Step(line=6, title=Ast.Text(line=6, text='And a cat picture'), text=Ast.Text( line=7, text="Now notice we didn't use (:) above\n ")) ])
def test_parse_tags_on_feature_and_scenario(): # Given a parser loaded with a gherkin document with one tag on # the feature and two tags on a scenario: # # @tagged-feature # Feature: Parse tags # # @tag1 @tag2 # Scenario: Test parser = Parser([ (1, gherkin.TOKEN_TAG, 'tagged-feature'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_LABEL, 'Feature'), (2, gherkin.TOKEN_TEXT, 'Parse tags'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_TAG, 'tag1'), (4, gherkin.TOKEN_TAG, 'tag2'), (4, gherkin.TOKEN_NEWLINE, '\n'), (5, gherkin.TOKEN_LABEL, 'Scenario'), (5, gherkin.TOKEN_TEXT, 'Test'), (6, gherkin.TOKEN_NEWLINE, '\n'), (7, gherkin.TOKEN_EOF, ''), ]) feature = parser.parse_feature() feature.should.equal( Ast.Feature(line=2, title=Ast.Text(line=2, text='Parse tags'), tags=['tagged-feature'], scenarios=[ Ast.Scenario(line=5, title=Ast.Text(line=5, text='Test'), tags=['tag1', 'tag2']) ]))
def test_parse_tables_within_steps(): "Lexer.run() Should be able to parse example tables from steps" # Given a parser loaded with steps that contain example tables '''Feature: Check models existence Background: Given I have a garden in the database: | @name | area | raining | | Secret Garden | 45 | false | And I have gardens in the database: | name | area | raining | | Octopus' Garden | 120 | true | Scenario: Plant a tree Given the <name> of a garden When I plant a tree And wait for <num_days> days Then I see it growing ''' parser = Parser([(1, gherkin.TOKEN_LABEL, 'Feature'), (1, gherkin.TOKEN_TEXT, 'Check models existence'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_LABEL, 'Background'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_LABEL, 'Given I have a garden in the database'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_TABLE_COLUMN, '@name'), (4, gherkin.TOKEN_TABLE_COLUMN, 'area'), (4, gherkin.TOKEN_TABLE_COLUMN, 'raining'), (4, gherkin.TOKEN_NEWLINE, '\n'), (5, gherkin.TOKEN_TABLE_COLUMN, 'Secret Garden'), (5, gherkin.TOKEN_TABLE_COLUMN, '45'), (5, gherkin.TOKEN_TABLE_COLUMN, 'false'), (5, gherkin.TOKEN_NEWLINE, '\n'), (6, gherkin.TOKEN_LABEL, 'And I have gardens in the database'), (6, gherkin.TOKEN_NEWLINE, '\n'), (7, gherkin.TOKEN_TABLE_COLUMN, 'name'), (7, gherkin.TOKEN_TABLE_COLUMN, 'area'), (7, gherkin.TOKEN_TABLE_COLUMN, 'raining'), (7, gherkin.TOKEN_NEWLINE, '\n'), (8, gherkin.TOKEN_TABLE_COLUMN, "Octopus' Garden"), (8, gherkin.TOKEN_TABLE_COLUMN, '120'), (8, gherkin.TOKEN_TABLE_COLUMN, 'true'), (8, gherkin.TOKEN_NEWLINE, '\n'), (9, gherkin.TOKEN_LABEL, 'Scenario'), (9, gherkin.TOKEN_TEXT, 'Plant a tree'), (9, gherkin.TOKEN_NEWLINE, '\n'), (10, gherkin.TOKEN_TEXT, 'Given the <name> of a garden'), (10, gherkin.TOKEN_NEWLINE, '\n'), (11, gherkin.TOKEN_TEXT, 'When I plant a tree'), (11, gherkin.TOKEN_NEWLINE, '\n'), (12, gherkin.TOKEN_TEXT, 'And wait for <num_days> days'), (12, gherkin.TOKEN_NEWLINE, '\n'), (13, gherkin.TOKEN_TEXT, 'Then I see it growing'), (13, gherkin.TOKEN_NEWLINE, '\n'), (14, gherkin.TOKEN_EOF, '')]) feature = parser.parse_feature() feature.should.equal( Ast.Feature( line=1, title=Ast.Text(line=1, text='Check models existence'), background=Ast.Background( line=2, steps=[ Ast.Step(line=3, title=Ast.Text( line=3, text='Given I have a garden in the database'), table=Ast.Table( line=4, fields=[['@name', 'area', 'raining'], ['Secret Garden', '45', 'false']])), Ast.Step(line=6, title=Ast.Text( line=6, text='And I have gardens in the database'), table=Ast.Table( line=7, fields=[['name', 'area', 'raining'], ['Octopus\' Garden', '120', 'true']])), ]), scenarios=[ Ast.Scenario( title=Ast.Text(line=9, text='Plant a tree'), line=9, steps=[ Ast.Step(line=10, title=Ast.Text( line=10, text='Given the <name> of a garden')), Ast.Step(line=11, title=Ast.Text(line=11, text='When I plant a tree')), Ast.Step(line=12, title=Ast.Text( line=12, text='And wait for <num_days> days')), Ast.Step(line=13, title=Ast.Text(line=13, text='Then I see it growing')) ]) ], ))
def test_parse_feature(): parser = Parser([ (1, gherkin.TOKEN_LABEL, 'Feature'), (1, gherkin.TOKEN_TEXT, 'Feature title'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_TEXT, 'feature description'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_LABEL, 'Background'), (3, gherkin.TOKEN_TEXT, 'Some background'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_TEXT, 'Given the problem'), (4, gherkin.TOKEN_NEWLINE, '\n'), (5, gherkin.TOKEN_LABEL, 'Scenario'), (5, gherkin.TOKEN_TEXT, 'Scenario title'), (5, gherkin.TOKEN_NEWLINE, '\n'), (6, gherkin.TOKEN_TEXT, 'Given first step'), (6, gherkin.TOKEN_NEWLINE, '\n'), (7, gherkin.TOKEN_LABEL, 'Scenario'), (7, gherkin.TOKEN_TEXT, 'Another scenario'), (7, gherkin.TOKEN_NEWLINE, '\n'), (8, gherkin.TOKEN_TEXT, 'Given this step'), (8, gherkin.TOKEN_NEWLINE, '\n'), (9, gherkin.TOKEN_TEXT, 'When we take another step'), (9, gherkin.TOKEN_NEWLINE, '\n'), (10, gherkin.TOKEN_EOF, ''), ]) feature = parser.parse_feature() feature.should.equal( Ast.Feature( line=1, title=Ast.Text(line=1, text='Feature title'), description=Ast.Text(line=2, text='feature description'), background=Ast.Background( line=3, title=Ast.Text(line=3, text='Some background'), steps=[ Ast.Step(line=4, title=Ast.Text(line=4, text='Given the problem')) ]), scenarios=[ Ast.Scenario(line=5, title=Ast.Text(line=5, text='Scenario title'), steps=[ Ast.Step(line=6, title=Ast.Text( line=6, text='Given first step')) ]), Ast.Scenario( line=7, title=Ast.Text(line=7, text='Another scenario'), steps=[ Ast.Step(line=8, title=Ast.Text(line=8, text='Given this step')), Ast.Step(line=9, title=Ast.Text( line=9, text='When we take another step')) ]), ], ))
def test_parse_scenario_outline_with_examples(): "" # Given a parser loaded with the following gherkin document: # # Scenario Outline: Plant a tree # Given the <name> of a garden # When I plant a tree # And wait for <num_days> days # Then I see it growing # Examples: # | name | num_days | # | Secret | 2 | # | Octopus | 5 | parser = Parser([(1, gherkin.TOKEN_LABEL, 'Scenario Outline'), (1, gherkin.TOKEN_TEXT, 'Plant a tree'), (1, gherkin.TOKEN_NEWLINE, '\n'), (2, gherkin.TOKEN_TEXT, 'Given the <name> of a garden'), (2, gherkin.TOKEN_NEWLINE, '\n'), (3, gherkin.TOKEN_TEXT, 'When I plant a tree'), (3, gherkin.TOKEN_NEWLINE, '\n'), (4, gherkin.TOKEN_TEXT, 'And wait for <num_days> days'), (4, gherkin.TOKEN_NEWLINE, '\n'), (5, gherkin.TOKEN_TEXT, 'Then I see it growing'), (5, gherkin.TOKEN_NEWLINE, '\n'), (6, gherkin.TOKEN_LABEL, 'Examples'), (6, gherkin.TOKEN_NEWLINE, '\n'), (7, gherkin.TOKEN_TABLE_COLUMN, 'name'), (7, gherkin.TOKEN_TABLE_COLUMN, 'num_days'), (7, gherkin.TOKEN_NEWLINE, '\n'), (8, gherkin.TOKEN_TABLE_COLUMN, 'Secret'), (8, gherkin.TOKEN_TABLE_COLUMN, '2'), (8, gherkin.TOKEN_NEWLINE, '\n'), (9, gherkin.TOKEN_TABLE_COLUMN, 'Octopus'), (9, gherkin.TOKEN_TABLE_COLUMN, '5'), (9, gherkin.TOKEN_NEWLINE, '\n'), (10, gherkin.TOKEN_EOF, '')]) scenarios = parser.parse_scenarios() scenarios.should.equal([ Ast.ScenarioOutline( line=1, title=Ast.Text(line=1, text='Plant a tree'), steps=[ Ast.Step(line=2, title=Ast.Text(line=2, text='Given the <name> of a garden')), Ast.Step(line=3, title=Ast.Text(line=3, text='When I plant a tree')), Ast.Step(line=4, title=Ast.Text(line=4, text='And wait for <num_days> days')), Ast.Step(line=5, title=Ast.Text(line=5, text='Then I see it growing')) ], examples=Ast.Examples(line=6, table=Ast.Table(line=7, fields=[ ['name', 'num_days'], ['Secret', '2'], ['Octopus', '5'], ]))) ])
def test_parse_metadata_empty(): Parser([(1, gherkin.TOKEN_EOF, '')]).parse_metadata().should.be.none Parser([None]).parse_metadata().should.be.none