test undefined step snippet templates
Этот коммит содержится в:
		
							родитель
							
								
									42158ff04b
								
							
						
					
					
						коммит
						56998cc5cf
					
				
					 5 изменённых файлов: 112 добавлений и 16 удалений
				
			
		| 
						 | 
					@ -8,7 +8,7 @@ Savybė: užkrauti savybes
 | 
				
			||||||
  Scenarijus: savybių užkrovimas iš aplanko
 | 
					  Scenarijus: savybių užkrovimas iš aplanko
 | 
				
			||||||
    Duota savybių aplankas "features"
 | 
					    Duota savybių aplankas "features"
 | 
				
			||||||
    Kai aš išskaitau savybes
 | 
					    Kai aš išskaitau savybes
 | 
				
			||||||
    Tada aš turėčiau turėti 6 savybių failus:
 | 
					    Tada aš turėčiau turėti 7 savybių failus:
 | 
				
			||||||
      """
 | 
					      """
 | 
				
			||||||
      features/background.feature
 | 
					      features/background.feature
 | 
				
			||||||
      features/events.feature
 | 
					      features/events.feature
 | 
				
			||||||
| 
						 | 
					@ -16,4 +16,5 @@ Savybė: užkrauti savybes
 | 
				
			||||||
      features/load.feature
 | 
					      features/load.feature
 | 
				
			||||||
      features/outline.feature
 | 
					      features/outline.feature
 | 
				
			||||||
      features/run.feature
 | 
					      features/run.feature
 | 
				
			||||||
 | 
					      features/snippets.feature
 | 
				
			||||||
      """
 | 
					      """
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ Feature: load features
 | 
				
			||||||
  Scenario: load features within path
 | 
					  Scenario: load features within path
 | 
				
			||||||
    Given a feature path "features"
 | 
					    Given a feature path "features"
 | 
				
			||||||
    When I parse features
 | 
					    When I parse features
 | 
				
			||||||
    Then I should have 6 feature files:
 | 
					    Then I should have 7 feature files:
 | 
				
			||||||
      """
 | 
					      """
 | 
				
			||||||
      features/background.feature
 | 
					      features/background.feature
 | 
				
			||||||
      features/events.feature
 | 
					      features/events.feature
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@ Feature: load features
 | 
				
			||||||
      features/load.feature
 | 
					      features/load.feature
 | 
				
			||||||
      features/outline.feature
 | 
					      features/outline.feature
 | 
				
			||||||
      features/run.feature
 | 
					      features/run.feature
 | 
				
			||||||
 | 
					      features/snippets.feature
 | 
				
			||||||
      """
 | 
					      """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Scenario: load a specific feature file
 | 
					  Scenario: load a specific feature file
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										64
									
								
								features/snippets.feature
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										64
									
								
								features/snippets.feature
									
										
									
									
									
										Обычный файл
									
								
							| 
						 | 
					@ -0,0 +1,64 @@
 | 
				
			||||||
 | 
					Feature: undefined step snippets
 | 
				
			||||||
 | 
					  In order to implement step definitions faster
 | 
				
			||||||
 | 
					  As a test suite user
 | 
				
			||||||
 | 
					  I need to be able to get undefined step snippets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Scenario: should generate snippets
 | 
				
			||||||
 | 
					    Given a feature "undefined.feature" file:
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					      Feature: undefined steps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Scenario: get version number from api
 | 
				
			||||||
 | 
					          When I send "GET" request to "/version"
 | 
				
			||||||
 | 
					          Then the response code should be 200
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					    When I run feature suite
 | 
				
			||||||
 | 
					    Then the following steps should be undefined:
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					      I send "GET" request to "/version"
 | 
				
			||||||
 | 
					      the response code should be 200
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					    And the undefined step snippets should be:
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					      func iSendrequestTo(arg1, arg2 string) error {
 | 
				
			||||||
 | 
					              return godog.ErrPending
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      func theResponseCodeShouldBe(arg1 int) error {
 | 
				
			||||||
 | 
					              return godog.ErrPending
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      func featureContext(s godog.Suite) {
 | 
				
			||||||
 | 
					              s.Step(`^I send "([^"]*)" request to "([^"]*)"$`, iSendrequestTo)
 | 
				
			||||||
 | 
					              s.Step(`^the response code should be (\d+)$`, theResponseCodeShouldBe)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Scenario: should generate snippets with more arguments
 | 
				
			||||||
 | 
					    Given a feature "undefined.feature" file:
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					      Feature: undefined steps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Scenario: get version number from api
 | 
				
			||||||
 | 
					          When I send "GET" request to "/version" with:
 | 
				
			||||||
 | 
					            | col1 | val1 |
 | 
				
			||||||
 | 
					            | col2 | val2 |
 | 
				
			||||||
 | 
					          Then the response code should be 200 and header "X-Powered-By" should be "godog"
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					    When I run feature suite
 | 
				
			||||||
 | 
					    Then the undefined step snippets should be:
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					      func iSendrequestTowith(arg1, arg2 string, arg3 *gherkin.DataTable) error {
 | 
				
			||||||
 | 
					              return godog.ErrPending
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      func theResponseCodeShouldBeAndHeadershouldBe(arg1 int, arg2, arg3 string) error {
 | 
				
			||||||
 | 
					              return godog.ErrPending
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      func featureContext(s godog.Suite) {
 | 
				
			||||||
 | 
					              s.Step(`^I send "([^"]*)" request to "([^"]*)" with:$`, iSendrequestTowith)
 | 
				
			||||||
 | 
					              s.Step(`^the response code should be (\d+) and header "([^"]*)" should be "([^"]*)"$`, theResponseCodeShouldBeAndHeadershouldBe)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										40
									
								
								fmt.go
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								fmt.go
									
										
									
									
									
								
							| 
						 | 
					@ -3,6 +3,7 @@ package godog
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"text/template"
 | 
						"text/template"
 | 
				
			||||||
| 
						 | 
					@ -261,10 +262,13 @@ func (f *basefmt) Summary() {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fmt.Println(elapsed)
 | 
						fmt.Println(elapsed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f.snippets()
 | 
						if text := f.snippets(); text != "" {
 | 
				
			||||||
 | 
							fmt.Println(cl("\nYou can implement step definitions for undefined steps with these snippets:", yellow))
 | 
				
			||||||
 | 
							fmt.Println(cl(text, yellow))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *undefinedSnippet) Args() string {
 | 
					func (s *undefinedSnippet) Args() (ret string) {
 | 
				
			||||||
	var args []string
 | 
						var args []string
 | 
				
			||||||
	var pos, idx int
 | 
						var pos, idx int
 | 
				
			||||||
	var breakLoop bool
 | 
						var breakLoop bool
 | 
				
			||||||
| 
						 | 
					@ -278,40 +282,48 @@ func (s *undefinedSnippet) Args() string {
 | 
				
			||||||
		case spos == -1:
 | 
							case spos == -1:
 | 
				
			||||||
			idx++
 | 
								idx++
 | 
				
			||||||
			pos += ipos + len("(\\d+)")
 | 
								pos += ipos + len("(\\d+)")
 | 
				
			||||||
			args = append(args, fmt.Sprintf("arg%d int", idx))
 | 
								args = append(args, reflect.Int.String())
 | 
				
			||||||
		case ipos == -1:
 | 
							case ipos == -1:
 | 
				
			||||||
			idx++
 | 
								idx++
 | 
				
			||||||
			pos += spos + len("\"([^\"]*)\"")
 | 
								pos += spos + len("\"([^\"]*)\"")
 | 
				
			||||||
			args = append(args, fmt.Sprintf("arg%d string", idx))
 | 
								args = append(args, reflect.String.String())
 | 
				
			||||||
		case ipos < spos:
 | 
							case ipos < spos:
 | 
				
			||||||
			idx++
 | 
								idx++
 | 
				
			||||||
			pos += ipos + len("(\\d+)")
 | 
								pos += ipos + len("(\\d+)")
 | 
				
			||||||
			args = append(args, fmt.Sprintf("arg%d int", idx))
 | 
								args = append(args, reflect.Int.String())
 | 
				
			||||||
		case spos < ipos:
 | 
							case spos < ipos:
 | 
				
			||||||
			idx++
 | 
								idx++
 | 
				
			||||||
			pos += spos + len("\"([^\"]*)\"")
 | 
								pos += spos + len("\"([^\"]*)\"")
 | 
				
			||||||
			args = append(args, fmt.Sprintf("arg%d string", idx))
 | 
								args = append(args, reflect.String.String())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if s.argument != nil {
 | 
						if s.argument != nil {
 | 
				
			||||||
		idx++
 | 
							idx++
 | 
				
			||||||
		switch s.argument.(type) {
 | 
							switch s.argument.(type) {
 | 
				
			||||||
		case *gherkin.DocString:
 | 
							case *gherkin.DocString:
 | 
				
			||||||
			args = append(args, fmt.Sprintf("arg%d *gherkin.DocString", idx))
 | 
								args = append(args, "*gherkin.DocString")
 | 
				
			||||||
		case *gherkin.DataTable:
 | 
							case *gherkin.DataTable:
 | 
				
			||||||
			args = append(args, fmt.Sprintf("arg%d *gherkin.DataTable", idx))
 | 
								args = append(args, "*gherkin.DataTable")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return strings.Join(args, ", ")
 | 
					
 | 
				
			||||||
 | 
						var last string
 | 
				
			||||||
 | 
						for i, arg := range args {
 | 
				
			||||||
 | 
							if last == "" || last == arg {
 | 
				
			||||||
 | 
								ret += fmt.Sprintf("arg%d, ", i+1)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ret = strings.TrimRight(ret, ", ") + fmt.Sprintf(" %s, arg%d, ", last, i+1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							last = arg
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return strings.TrimRight(ret, ", ") + " " + last
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (f *basefmt) snippets() {
 | 
					func (f *basefmt) snippets() string {
 | 
				
			||||||
	if len(f.undefined) == 0 {
 | 
						if len(f.undefined) == 0 {
 | 
				
			||||||
		return
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Println(cl("\nYou can implement step definitions for undefined steps with these snippets:", yellow))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var index int
 | 
						var index int
 | 
				
			||||||
	var snips []*undefinedSnippet
 | 
						var snips []*undefinedSnippet
 | 
				
			||||||
	// build snippets
 | 
						// build snippets
 | 
				
			||||||
| 
						 | 
					@ -355,5 +367,5 @@ func (f *basefmt) snippets() {
 | 
				
			||||||
	if err := undefinedSnippetsTpl.Execute(&buf, snips); err != nil {
 | 
						if err := undefinedSnippetsTpl.Execute(&buf, snips); err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fmt.Println(cl(buf.String(), yellow))
 | 
						return buf.String()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@ func SuiteContext(s Suite) {
 | 
				
			||||||
	s.Step(`^a failing step`, c.aFailingStep)
 | 
						s.Step(`^a failing step`, c.aFailingStep)
 | 
				
			||||||
	s.Step(`^this step should fail`, c.aFailingStep)
 | 
						s.Step(`^this step should fail`, c.aFailingStep)
 | 
				
			||||||
	s.Step(`^the following steps? should be (passed|failed|skipped|undefined|pending):`, c.followingStepsShouldHave)
 | 
						s.Step(`^the following steps? should be (passed|failed|skipped|undefined|pending):`, c.followingStepsShouldHave)
 | 
				
			||||||
 | 
						s.Step(`^the undefined step snippets should be:$`, c.theUndefinedStepSnippetsShouldBe)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// lt
 | 
						// lt
 | 
				
			||||||
	s.Step(`^savybių aplankas "([^"]*)"$`, c.featurePath)
 | 
						s.Step(`^savybių aplankas "([^"]*)"$`, c.featurePath)
 | 
				
			||||||
| 
						 | 
					@ -64,6 +65,23 @@ func (s *suiteContext) ResetBeforeEachScenario(interface{}) {
 | 
				
			||||||
	s.events = []*firedEvent{}
 | 
						s.events = []*firedEvent{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *suiteContext) cleanupSnippet(snip string) string {
 | 
				
			||||||
 | 
						lines := strings.Split(strings.TrimSpace(snip), "\n")
 | 
				
			||||||
 | 
						for i := 0; i < len(lines); i++ {
 | 
				
			||||||
 | 
							lines[i] = strings.TrimSpace(lines[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return strings.Join(lines, "\n")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *suiteContext) theUndefinedStepSnippetsShouldBe(body *gherkin.DocString) error {
 | 
				
			||||||
 | 
						actual := s.cleanupSnippet(s.fmt.snippets())
 | 
				
			||||||
 | 
						expected := s.cleanupSnippet(body.Content)
 | 
				
			||||||
 | 
						if actual != expected {
 | 
				
			||||||
 | 
							return fmt.Errorf("snippets do not match actual: %s", s.fmt.snippets())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *suiteContext) followingStepsShouldHave(status string, steps *gherkin.DocString) error {
 | 
					func (s *suiteContext) followingStepsShouldHave(status string, steps *gherkin.DocString) error {
 | 
				
			||||||
	var expected = strings.Split(steps.Content, "\n")
 | 
						var expected = strings.Split(steps.Content, "\n")
 | 
				
			||||||
	var actual, unmatched, matched []string
 | 
						var actual, unmatched, matched []string
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче